@@ -26,6 +26,7 @@ BLEAdvertisingData::BLEAdvertisingData() :
2626 _rawData(NULL ),
2727 _rawDataLength(0 ),
2828 _advertisedServiceUuid(NULL ),
29+ _advertisedServiceUuidLength(0 ),
2930 _manufacturerData(NULL ),
3031 _manufacturerDataLength(0 ),
3132 _manufacturerCompanyId(0 ),
@@ -43,10 +44,11 @@ BLEAdvertisingData::~BLEAdvertisingData()
4344{
4445}
4546
46- inline bool BLEAdvertisingData::updateRemainingLength (int fieldLength )
47+ inline bool BLEAdvertisingData::updateRemainingLength (int oldFieldLength, int newFieldLength )
4748{
48- if (fieldLength <= _remainingLength) {
49- _remainingLength -= fieldLength;
49+ int updatedRemaining = _remainingLength + (oldFieldLength - newFieldLength);
50+ if (updatedRemaining >= 0 ) {
51+ _remainingLength = updatedRemaining;
5052 return true ;
5153 }
5254 return false ;
@@ -75,6 +77,7 @@ void BLEAdvertisingData::clear()
7577 _manufacturerDataLength = 0 ;
7678 _hasManufacturerCompanyId = false ;
7779 _advertisedServiceUuid = NULL ;
80+ _advertisedServiceUuidLength = 0 ;
7881 _serviceData = NULL ;
7982 _serviceDataLength = 0 ;
8083}
@@ -92,6 +95,7 @@ void BLEAdvertisingData::copy(const BLEAdvertisingData& adv)
9295 _manufacturerCompanyId = adv._manufacturerCompanyId ;
9396 _hasManufacturerCompanyId = adv._hasManufacturerCompanyId ;
9497 _advertisedServiceUuid = adv._advertisedServiceUuid ;
98+ _advertisedServiceUuidLength = adv._advertisedServiceUuidLength ;
9599 _serviceDataUuid = adv._serviceDataUuid ;
96100 _serviceData = adv._serviceData ;
97101 _serviceDataLength = adv._serviceDataLength ;
@@ -106,9 +110,11 @@ BLEAdvertisingData& BLEAdvertisingData::operator=(const BLEAdvertisingData &othe
106110bool BLEAdvertisingData::setAdvertisedServiceUuid (const char * advertisedServiceUuid)
107111{
108112 BLEUuid uuid (advertisedServiceUuid);
109- bool success = updateRemainingLength (uuid.length () + AD_FIELD_OVERHEAD);
113+ int previousLength = (_advertisedServiceUuidLength > 0 ) ? (_advertisedServiceUuidLength + AD_FIELD_OVERHEAD) : 0 ;
114+ bool success = updateRemainingLength (previousLength, (uuid.length () + AD_FIELD_OVERHEAD));
110115 if (success) {
111116 _advertisedServiceUuid = advertisedServiceUuid;
117+ _advertisedServiceUuidLength = uuid.length ();
112118 }
113119 return success;
114120}
@@ -120,7 +126,14 @@ bool BLEAdvertisingData::setAdvertisedService(const BLEService& service)
120126
121127bool BLEAdvertisingData::setManufacturerData (const uint8_t manufacturerData[], int manufacturerDataLength)
122128{
123- bool success = updateRemainingLength (manufacturerDataLength + AD_FIELD_OVERHEAD);
129+ int previousLength = 0 ;
130+ if (_manufacturerDataLength) {
131+ previousLength = _manufacturerDataLength + AD_FIELD_OVERHEAD;
132+ if (_hasManufacturerCompanyId) {
133+ previousLength += sizeof (_manufacturerCompanyId);
134+ }
135+ }
136+ bool success = updateRemainingLength (previousLength, (manufacturerDataLength + AD_FIELD_OVERHEAD));
124137 if (success) {
125138 _manufacturerData = manufacturerData;
126139 _manufacturerDataLength = manufacturerDataLength;
@@ -131,7 +144,14 @@ bool BLEAdvertisingData::setManufacturerData(const uint8_t manufacturerData[], i
131144
132145bool BLEAdvertisingData::setManufacturerData (const uint16_t companyId, const uint8_t manufacturerData[], int manufacturerDataLength)
133146{
134- bool success = updateRemainingLength (manufacturerDataLength + sizeof (companyId) + AD_FIELD_OVERHEAD);
147+ int previousLength = 0 ;
148+ if (_manufacturerDataLength) {
149+ previousLength = _manufacturerDataLength + AD_FIELD_OVERHEAD;
150+ if (_hasManufacturerCompanyId) {
151+ previousLength += sizeof (_manufacturerCompanyId);
152+ }
153+ }
154+ bool success = updateRemainingLength (previousLength, (manufacturerDataLength + sizeof (companyId) + AD_FIELD_OVERHEAD));
135155 if (success) {
136156 _manufacturerData = manufacturerData;
137157 _manufacturerDataLength = manufacturerDataLength;
@@ -143,7 +163,8 @@ bool BLEAdvertisingData::setManufacturerData(const uint16_t companyId, const uin
143163
144164bool BLEAdvertisingData::setAdvertisedServiceData (uint16_t uuid, const uint8_t data[], int length)
145165{
146- bool success = updateRemainingLength (length + sizeof (uuid) + AD_FIELD_OVERHEAD);
166+ int previousLength = (_serviceDataLength > 0 ) ? (_serviceDataLength + sizeof (uuid) + AD_FIELD_OVERHEAD) : 0 ;
167+ bool success = updateRemainingLength (previousLength, (length + sizeof (uuid) + AD_FIELD_OVERHEAD));
147168 if (success) {
148169 _serviceDataUuid = uuid;
149170 _serviceData = data;
@@ -154,7 +175,8 @@ bool BLEAdvertisingData::setAdvertisedServiceData(uint16_t uuid, const uint8_t d
154175
155176bool BLEAdvertisingData::setLocalName (const char *localName)
156177{
157- bool success = updateRemainingLength (strlen (localName) + AD_FIELD_OVERHEAD);
178+ int previousLength = (_localName && strlen (_localName) > 0 ) ? (strlen (_localName) + AD_FIELD_OVERHEAD) : 0 ;
179+ bool success = updateRemainingLength (previousLength, (strlen (localName) + AD_FIELD_OVERHEAD));
158180 if (success) {
159181 _localName = localName;
160182 }
@@ -183,7 +205,8 @@ bool BLEAdvertisingData::setRawData(const BLEAdvertisingRawData& rawData)
183205
184206bool BLEAdvertisingData::setFlags (uint8_t flags)
185207{
186- bool success = updateRemainingLength (sizeof (flags) + AD_FIELD_OVERHEAD);
208+ int previousLength = (_hasFlags) ? (sizeof (_flags) + AD_FIELD_OVERHEAD) : 0 ;
209+ bool success = updateRemainingLength (previousLength, (sizeof (flags) + AD_FIELD_OVERHEAD));
187210 if (success) {
188211 _hasFlags = true ;
189212 _flags = flags;
0 commit comments