Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of BLE_API by
Diff: services/URIBeacon2Service.h
- Revision:
- 150:aa2d70369df0
- Parent:
- 149:6a7666d72a83
- Child:
- 151:cb5df770f05b
--- a/services/URIBeacon2Service.h Fri Nov 28 14:11:19 2014 +0000 +++ b/services/URIBeacon2Service.h Fri Nov 28 14:11:20 2014 +0000 @@ -21,38 +21,37 @@ class URIBeacon2Service { public: - // ee0c2080-8786-40ba-ab96-99b91ac981d8 - - URIBeacon2Service(BLEDevice &ble_, const char *urldata, size_t sizeofURLData) : ble(ble_), payloadIndex(0), payload() { - if ((sizeofURLData + 4) > 24) { - return; - } - + URIBeacon2Service(BLEDevice &ble_, const char *urldata) : ble(ble_), payloadIndex(0), payload() { const uint8_t BEACON_UUID[] = {0xD8, 0xFE}; payload[payloadIndex++] = BEACON_UUID[0]; payload[payloadIndex++] = BEACON_UUID[1]; payload[payloadIndex++] = 0x00; /* flags */ payload[payloadIndex++] = 0x20; /* power */ + + size_t sizeofURLData = strlen(urldata); size_t encodedBytes = encodeURIData(urldata, sizeofURLData); ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, BEACON_UUID, sizeof(BEACON_UUID)); ble.accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, payload, encodedBytes + 4); } + void dumpEncoded() { + printf("encoded: '"); + for (unsigned i = 0; i < payloadIndex; i++) { + printf(" %02x", payload[i]); + } + printf("'\r\n"); + } + private: size_t encodeURIData(const char *urldata, size_t sizeofURLData) { if (sizeofURLData == 0) { return 0; } - size_t encodedBytes = encodePrefix(urldata, sizeofURLData); - - /* memcpy the rest for now. */ - memcpy(&payload[payloadIndex], urldata, sizeofURLData); - encodedBytes += sizeofURLData; - return encodedBytes; + return encodePrefix(urldata, sizeofURLData) + copyURLCheckingForSuffixes(urldata, sizeofURLData); } size_t encodePrefix(const char *&urldata, size_t &sizeofURLData) { @@ -81,6 +80,55 @@ return encodedBytes; } + size_t copyURLCheckingForSuffixes(const char *urldata, size_t sizeofURLData) { + const char *suffixes[] = { + ".com/", + ".org/", + ".edu/", + ".net/", + ".info/", + ".biz/", + ".gov/", + ".com", + ".org", + ".edu", + ".net", + ".info", + ".biz", + ".gov" + }; + const size_t NUM_SUFFIXES = sizeof(suffixes) / sizeof(char *); + + size_t encodedBytes = 0; + while (sizeofURLData && (payloadIndex < MAX_SIZEOF_PAYLOAD)) { + /* check for suffix match */ + unsigned i; + for (i = 0; i < NUM_SUFFIXES; i++) { + size_t suffixLen = strlen(suffixes[i]); + if ((suffixLen == 0) || (sizeofURLData < suffixLen)) { + continue; + } + + if (strncmp(urldata, suffixes[i], suffixLen) == 0) { + payload[payloadIndex++] = i; + ++encodedBytes; + urldata += suffixLen; + sizeofURLData -= suffixLen; + break; /* from the for loop for checking against suffixes */ + } + } + /* This is the default case where we've got an ordinary character which doesn't match a suffix. */ + if (i == NUM_SUFFIXES) { + payload[payloadIndex++] = *urldata; + ++encodedBytes; + ++urldata; + --sizeofURLData; + } + } + + return encodedBytes; + } + // URIBeacon2Service(BLEDevice &_ble, uint8_t level = 100) : // ble(_ble), // batteryLevel(level),