@@ -26,6 +26,7 @@ BLEAdvertisingData::BLEAdvertisingData() :
26
26
_rawData(NULL ),
27
27
_rawDataLength(0 ),
28
28
_advertisedServiceUuid(NULL ),
29
+ _advertisedServiceUuidLength(0 ),
29
30
_manufacturerData(NULL ),
30
31
_manufacturerDataLength(0 ),
31
32
_manufacturerCompanyId(0 ),
@@ -43,10 +44,11 @@ BLEAdvertisingData::~BLEAdvertisingData()
43
44
{
44
45
}
45
46
46
- inline bool BLEAdvertisingData::updateRemainingLength (int fieldLength )
47
+ inline bool BLEAdvertisingData::updateRemainingLength (int oldFieldLength, int newFieldLength )
47
48
{
48
- if (fieldLength <= _remainingLength) {
49
- _remainingLength -= fieldLength;
49
+ int updatedRemaining = _remainingLength + (oldFieldLength - newFieldLength);
50
+ if (updatedRemaining >= 0 ) {
51
+ _remainingLength = updatedRemaining;
50
52
return true ;
51
53
}
52
54
return false ;
@@ -75,6 +77,7 @@ void BLEAdvertisingData::clear()
75
77
_manufacturerDataLength = 0 ;
76
78
_hasManufacturerCompanyId = false ;
77
79
_advertisedServiceUuid = NULL ;
80
+ _advertisedServiceUuidLength = 0 ;
78
81
_serviceData = NULL ;
79
82
_serviceDataLength = 0 ;
80
83
}
@@ -92,6 +95,7 @@ void BLEAdvertisingData::copy(const BLEAdvertisingData& adv)
92
95
_manufacturerCompanyId = adv._manufacturerCompanyId ;
93
96
_hasManufacturerCompanyId = adv._hasManufacturerCompanyId ;
94
97
_advertisedServiceUuid = adv._advertisedServiceUuid ;
98
+ _advertisedServiceUuidLength = adv._advertisedServiceUuidLength ;
95
99
_serviceDataUuid = adv._serviceDataUuid ;
96
100
_serviceData = adv._serviceData ;
97
101
_serviceDataLength = adv._serviceDataLength ;
@@ -106,9 +110,11 @@ BLEAdvertisingData& BLEAdvertisingData::operator=(const BLEAdvertisingData &othe
106
110
bool BLEAdvertisingData::setAdvertisedServiceUuid (const char * advertisedServiceUuid)
107
111
{
108
112
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));
110
115
if (success) {
111
116
_advertisedServiceUuid = advertisedServiceUuid;
117
+ _advertisedServiceUuidLength = uuid.length ();
112
118
}
113
119
return success;
114
120
}
@@ -120,7 +126,14 @@ bool BLEAdvertisingData::setAdvertisedService(const BLEService& service)
120
126
121
127
bool BLEAdvertisingData::setManufacturerData (const uint8_t manufacturerData[], int manufacturerDataLength)
122
128
{
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));
124
137
if (success) {
125
138
_manufacturerData = manufacturerData;
126
139
_manufacturerDataLength = manufacturerDataLength;
@@ -131,7 +144,14 @@ bool BLEAdvertisingData::setManufacturerData(const uint8_t manufacturerData[], i
131
144
132
145
bool BLEAdvertisingData::setManufacturerData (const uint16_t companyId, const uint8_t manufacturerData[], int manufacturerDataLength)
133
146
{
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));
135
155
if (success) {
136
156
_manufacturerData = manufacturerData;
137
157
_manufacturerDataLength = manufacturerDataLength;
@@ -143,7 +163,8 @@ bool BLEAdvertisingData::setManufacturerData(const uint16_t companyId, const uin
143
163
144
164
bool BLEAdvertisingData::setAdvertisedServiceData (uint16_t uuid, const uint8_t data[], int length)
145
165
{
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));
147
168
if (success) {
148
169
_serviceDataUuid = uuid;
149
170
_serviceData = data;
@@ -154,7 +175,8 @@ bool BLEAdvertisingData::setAdvertisedServiceData(uint16_t uuid, const uint8_t d
154
175
155
176
bool BLEAdvertisingData::setLocalName (const char *localName)
156
177
{
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));
158
180
if (success) {
159
181
_localName = localName;
160
182
}
@@ -183,7 +205,8 @@ bool BLEAdvertisingData::setRawData(const BLEAdvertisingRawData& rawData)
183
205
184
206
bool BLEAdvertisingData::setFlags (uint8_t flags)
185
207
{
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));
187
210
if (success) {
188
211
_hasFlags = true ;
189
212
_flags = flags;
0 commit comments