33
33
34
34
void CBORDecoder::decode (PropertyContainer & property_container, uint8_t const * const payload, size_t const length, bool isSyncMessage)
35
35
{
36
+ CborValue array_iter, map_iter,value_iter;
36
37
CborParser parser;
37
- CborValue array_iter, map_iter,value_iter;
38
- /* List of map data that will hold all the attributes of a property */
39
- std::list<CborMapData *> map_data_list;
40
- /* Current property name during decoding: use to look for a new property in the senml value array */
41
- String current_property_name;
38
+ CborMapData map_data;
39
+ std::list<CborMapData> map_data_list; /* List of map data that will hold all the attributes of a property */
40
+ String current_property_name; /* Current property name during decoding: use to look for a new property in the senml value array */
42
41
unsigned long current_property_base_time{0 }, current_property_time{0 };
43
42
44
43
if (cbor_parser_init (payload, length, 0 , &parser, &array_iter) != CborNoError)
@@ -50,15 +49,13 @@ void CBORDecoder::decode(PropertyContainer & property_container, uint8_t const *
50
49
if (cbor_value_enter_container (&array_iter, &map_iter) != CborNoError)
51
50
return ;
52
51
53
- CborMapData * map_data = nullptr ;
54
-
55
52
MapParserState current_state = MapParserState::EnterMap,
56
53
next_state = MapParserState::Error;
57
54
58
55
while (current_state != MapParserState::Complete) {
59
56
60
57
switch (current_state) {
61
- case MapParserState::EnterMap : next_state = handle_EnterMap (&map_iter, &value_iter, &map_data ); break ;
58
+ case MapParserState::EnterMap : next_state = handle_EnterMap (&map_iter, &value_iter); break ;
62
59
case MapParserState::MapKey : next_state = handle_MapKey (&value_iter); break ;
63
60
case MapParserState::UndefinedKey : next_state = handle_UndefinedKey (&value_iter); break ;
64
61
case MapParserState::BaseVersion : next_state = handle_BaseVersion (&value_iter, map_data); break ;
@@ -82,12 +79,11 @@ void CBORDecoder::decode(PropertyContainer & property_container, uint8_t const *
82
79
PRIVATE MEMBER FUNCTIONS
83
80
******************************************************************************/
84
81
85
- CBORDecoder::MapParserState CBORDecoder::handle_EnterMap (CborValue * map_iter, CborValue * value_iter, CborMapData **map_data ) {
82
+ CBORDecoder::MapParserState CBORDecoder::handle_EnterMap (CborValue * map_iter, CborValue * value_iter) {
86
83
MapParserState next_state = MapParserState::Error;
87
84
88
85
if (cbor_value_get_type (map_iter) == CborMapType) {
89
86
if (cbor_value_enter_container (map_iter, value_iter) == CborNoError) {
90
- *map_data = new CborMapData ();
91
87
next_state = MapParserState::MapKey;
92
88
}
93
89
}
@@ -144,13 +140,13 @@ CBORDecoder::MapParserState CBORDecoder::handle_UndefinedKey(CborValue * value_i
144
140
return next_state;
145
141
}
146
142
147
- CBORDecoder::MapParserState CBORDecoder::handle_BaseVersion (CborValue * value_iter, CborMapData * map_data) {
143
+ CBORDecoder::MapParserState CBORDecoder::handle_BaseVersion (CborValue * value_iter, CborMapData & map_data) {
148
144
MapParserState next_state = MapParserState::Error;
149
145
150
146
if (cbor_value_is_integer (value_iter)) {
151
147
int val = 0 ;
152
148
if (cbor_value_get_int (value_iter, &val) == CborNoError) {
153
- map_data-> base_version .set (val);
149
+ map_data. base_version .set (val);
154
150
155
151
if (cbor_value_advance (value_iter) == CborNoError) {
156
152
next_state = MapParserState::MapKey;
@@ -161,14 +157,14 @@ CBORDecoder::MapParserState CBORDecoder::handle_BaseVersion(CborValue * value_it
161
157
return next_state;
162
158
}
163
159
164
- CBORDecoder::MapParserState CBORDecoder::handle_BaseName (CborValue * value_iter, CborMapData * map_data) {
160
+ CBORDecoder::MapParserState CBORDecoder::handle_BaseName (CborValue * value_iter, CborMapData & map_data) {
165
161
MapParserState next_state = MapParserState::Error;
166
162
167
163
if (cbor_value_is_text_string (value_iter)) {
168
164
char * val = 0 ;
169
165
size_t val_size = 0 ;
170
166
if (cbor_value_dup_text_string (value_iter, &val, &val_size, value_iter) == CborNoError) {
171
- map_data-> base_name .set (String (val));
167
+ map_data. base_name .set (String (val));
172
168
free (val);
173
169
next_state = MapParserState::MapKey;
174
170
}
@@ -177,12 +173,12 @@ CBORDecoder::MapParserState CBORDecoder::handle_BaseName(CborValue * value_iter,
177
173
return next_state;
178
174
}
179
175
180
- CBORDecoder::MapParserState CBORDecoder::handle_BaseTime (CborValue * value_iter, CborMapData * map_data) {
176
+ CBORDecoder::MapParserState CBORDecoder::handle_BaseTime (CborValue * value_iter, CborMapData & map_data) {
181
177
MapParserState next_state = MapParserState::Error;
182
178
183
179
double val = 0.0 ;
184
180
if (ifNumericConvertToDouble (value_iter, &val)) {
185
- map_data-> base_time .set (val);
181
+ map_data. base_time .set (val);
186
182
187
183
if (cbor_value_advance (value_iter) == CborNoError) {
188
184
next_state = MapParserState::MapKey;
@@ -192,7 +188,7 @@ CBORDecoder::MapParserState CBORDecoder::handle_BaseTime(CborValue * value_iter,
192
188
return next_state;
193
189
}
194
190
195
- CBORDecoder::MapParserState CBORDecoder::handle_Name (CborValue * value_iter, CborMapData * map_data, PropertyContainer & property_container) {
191
+ CBORDecoder::MapParserState CBORDecoder::handle_Name (CborValue * value_iter, CborMapData & map_data, PropertyContainer & property_container) {
196
192
MapParserState next_state = MapParserState::Error;
197
193
198
194
if (cbor_value_is_text_string (value_iter)) {
@@ -202,25 +198,25 @@ CBORDecoder::MapParserState CBORDecoder::handle_Name(CborValue * value_iter, Cbo
202
198
if (cbor_value_dup_text_string (value_iter, &val, &val_size, value_iter) == CborNoError) {
203
199
String name = val;
204
200
free (val);
205
- map_data-> name .set (name);
201
+ map_data. name .set (name);
206
202
int colonPos = name.indexOf (" :" );
207
203
String attribute_name = " " ;
208
204
if (colonPos != -1 ) {
209
205
attribute_name = name.substring (colonPos + 1 );
210
206
}
211
- map_data-> attribute_name .set (attribute_name);
207
+ map_data. attribute_name .set (attribute_name);
212
208
next_state = MapParserState::MapKey;
213
209
}
214
210
} else if (cbor_value_is_integer (value_iter)) {
215
211
// if the value in the cbor message is an integer, a light payload has been used and an integer identifier should be decode in order to retrieve the corresponding property and attribute name to be updated
216
212
int val = 0 ;
217
213
if (cbor_value_get_int (value_iter, &val) == CborNoError) {
218
- map_data-> light_payload .set (true );
219
- map_data-> name_identifier .set (val & 255 );
220
- map_data-> attribute_identifier .set (val >> 8 );
221
- map_data-> light_payload .set (true );
214
+ map_data. light_payload .set (true );
215
+ map_data. name_identifier .set (val & 255 );
216
+ map_data. attribute_identifier .set (val >> 8 );
217
+ map_data. light_payload .set (true );
222
218
String name = getPropertyNameByIdentifier (property_container, val);
223
- map_data-> name .set (name);
219
+ map_data. name .set (name);
224
220
225
221
226
222
if (cbor_value_advance (value_iter) == CborNoError) {
@@ -234,12 +230,12 @@ CBORDecoder::MapParserState CBORDecoder::handle_Name(CborValue * value_iter, Cbo
234
230
return next_state;
235
231
}
236
232
237
- CBORDecoder::MapParserState CBORDecoder::handle_Value (CborValue * value_iter, CborMapData * map_data) {
233
+ CBORDecoder::MapParserState CBORDecoder::handle_Value (CborValue * value_iter, CborMapData & map_data) {
238
234
MapParserState next_state = MapParserState::Error;
239
235
240
236
double val = 0.0 ;
241
237
if (ifNumericConvertToDouble (value_iter, &val)) {
242
- map_data-> val .set (val);
238
+ map_data. val .set (val);
243
239
244
240
if (cbor_value_advance (value_iter) == CborNoError) {
245
241
next_state = MapParserState::MapKey;
@@ -249,14 +245,14 @@ CBORDecoder::MapParserState CBORDecoder::handle_Value(CborValue * value_iter, Cb
249
245
return next_state;
250
246
}
251
247
252
- CBORDecoder::MapParserState CBORDecoder::handle_StringValue (CborValue * value_iter, CborMapData * map_data) {
248
+ CBORDecoder::MapParserState CBORDecoder::handle_StringValue (CborValue * value_iter, CborMapData & map_data) {
253
249
MapParserState next_state = MapParserState::Error;
254
250
255
251
if (cbor_value_is_text_string (value_iter)) {
256
252
char * val = 0 ;
257
253
size_t val_size = 0 ;
258
254
if (cbor_value_dup_text_string (value_iter, &val, &val_size, value_iter) == CborNoError) {
259
- map_data-> str_val .set (String (val));
255
+ map_data. str_val .set (String (val));
260
256
free (val);
261
257
next_state = MapParserState::MapKey;
262
258
}
@@ -265,12 +261,12 @@ CBORDecoder::MapParserState CBORDecoder::handle_StringValue(CborValue * value_it
265
261
return next_state;
266
262
}
267
263
268
- CBORDecoder::MapParserState CBORDecoder::handle_BooleanValue (CborValue * value_iter, CborMapData * map_data) {
264
+ CBORDecoder::MapParserState CBORDecoder::handle_BooleanValue (CborValue * value_iter, CborMapData & map_data) {
269
265
MapParserState next_state = MapParserState::Error;
270
266
271
267
bool val = false ;
272
268
if (cbor_value_get_boolean (value_iter, &val) == CborNoError) {
273
- map_data-> bool_val .set (val);
269
+ map_data. bool_val .set (val);
274
270
275
271
if (cbor_value_advance (value_iter) == CborNoError) {
276
272
next_state = MapParserState::MapKey;
@@ -280,12 +276,12 @@ CBORDecoder::MapParserState CBORDecoder::handle_BooleanValue(CborValue * value_i
280
276
return next_state;
281
277
}
282
278
283
- CBORDecoder::MapParserState CBORDecoder::handle_Time (CborValue * value_iter, CborMapData * map_data) {
279
+ CBORDecoder::MapParserState CBORDecoder::handle_Time (CborValue * value_iter, CborMapData & map_data) {
284
280
MapParserState next_state = MapParserState::Error;
285
281
286
282
double val = 0.0 ;
287
283
if (ifNumericConvertToDouble (value_iter, &val)) {
288
- map_data-> time .set (val);
284
+ map_data. time .set (val);
289
285
290
286
if (cbor_value_advance (value_iter) == CborNoError) {
291
287
next_state = MapParserState::MapKey;
@@ -295,31 +291,31 @@ CBORDecoder::MapParserState CBORDecoder::handle_Time(CborValue * value_iter, Cbo
295
291
return next_state;
296
292
}
297
293
298
- CBORDecoder::MapParserState CBORDecoder::handle_LeaveMap (CborValue * map_iter, CborValue * value_iter, CborMapData * map_data, PropertyContainer & property_container, String & current_property_name, unsigned long & current_property_base_time, unsigned long & current_property_time, bool const is_sync_message, std::list<CborMapData * > & map_data_list) {
294
+ CBORDecoder::MapParserState CBORDecoder::handle_LeaveMap (CborValue * map_iter, CborValue * value_iter, CborMapData & map_data, PropertyContainer & property_container, String & current_property_name, unsigned long & current_property_base_time, unsigned long & current_property_time, bool const is_sync_message, std::list<CborMapData> & map_data_list) {
299
295
MapParserState next_state = MapParserState::Error;
300
- if (map_data-> name .isSet ()) {
296
+ if (map_data. name .isSet ()) {
301
297
String propertyName;
302
- int colonPos = map_data-> name .get ().indexOf (" :" );
298
+ int colonPos = map_data. name .get ().indexOf (" :" );
303
299
if (colonPos != -1 ) {
304
- propertyName = map_data-> name .get ().substring (0 , colonPos);
300
+ propertyName = map_data. name .get ().substring (0 , colonPos);
305
301
} else {
306
- propertyName = map_data-> name .get ();
302
+ propertyName = map_data. name .get ();
307
303
}
308
304
309
305
if (current_property_name != " " && propertyName != current_property_name) {
310
306
/* Update the property containers depending on the parsed data */
311
307
updateProperty (property_container, current_property_name, current_property_base_time + current_property_time, is_sync_message, &map_data_list);
312
308
/* Reset current property data */
313
- freeMapDataList (& map_data_list);
309
+ map_data_list. clear ( );
314
310
current_property_base_time = 0 ;
315
311
current_property_time = 0 ;
316
312
}
317
313
/* Compute the cloud change event baseTime and Time */
318
- if (map_data-> base_time .isSet ()) {
319
- current_property_base_time = (unsigned long )(map_data-> base_time .get ());
314
+ if (map_data. base_time .isSet ()) {
315
+ current_property_base_time = (unsigned long )(map_data. base_time .get ());
320
316
}
321
- if (map_data-> time .isSet () && (map_data-> time .get () > current_property_time)) {
322
- current_property_time = (unsigned long )map_data-> time .get ();
317
+ if (map_data. time .isSet () && (map_data. time .get () > current_property_time)) {
318
+ current_property_time = (unsigned long )map_data. time .get ();
323
319
}
324
320
map_data_list.push_back (map_data);
325
321
current_property_name = propertyName;
@@ -333,25 +329,14 @@ CBORDecoder::MapParserState CBORDecoder::handle_LeaveMap(CborValue * map_iter, C
333
329
/* Update the property containers depending on the parsed data */
334
330
updateProperty (property_container, current_property_name, current_property_base_time + current_property_time, is_sync_message, &map_data_list);
335
331
/* Reset last property data */
336
- freeMapDataList (& map_data_list);
332
+ map_data_list. clear ( );
337
333
next_state = MapParserState::Complete;
338
334
}
339
335
}
340
336
341
337
return next_state;
342
338
}
343
339
344
- void CBORDecoder::freeMapDataList (std::list<CborMapData *> * map_data_list)
345
- {
346
- std::for_each (map_data_list->begin (),
347
- map_data_list->end (),
348
- [](CborMapData * map_data)
349
- {
350
- delete map_data;
351
- });
352
- map_data_list->clear ();
353
- }
354
-
355
340
bool CBORDecoder::ifNumericConvertToDouble (CborValue * value_iter, double * numeric_val) {
356
341
357
342
if (cbor_value_is_integer (value_iter)) {
0 commit comments