17
17
#include <stdio.h>
18
18
#include <string.h>
19
19
20
+ static void bin_decoder_init (struct thingset_context * ts , const uint8_t * payload ,
21
+ size_t payload_len )
22
+ {
23
+ zcbor_new_decode_state (ts -> decoder , ZCBOR_ARRAY_SIZE (ts -> decoder ), payload , payload_len , 1 ,
24
+ NULL , 0 );
25
+
26
+ /* required to accept incoming data which does not use the most compact encoding */
27
+ ts -> decoder -> constant_state -> enforce_canonical = false;
28
+ }
29
+
20
30
static int bin_serialize_map_start (struct thingset_context * ts )
21
31
{
22
32
return zcbor_map_start_encode (ts -> encoder , UINT8_MAX ) ? 0 : - THINGSET_ERR_RESPONSE_TOO_LARGE ;
@@ -113,7 +123,7 @@ static int bin_serialize_simple_value(zcbor_state_t *encoder, union thingset_dat
113
123
break ;
114
124
#if CONFIG_THINGSET_DECFRAC_TYPE_SUPPORT
115
125
case THINGSET_TYPE_DECFRAC :
116
- success = zcbor_tag_encode (encoder , ZCBOR_TAG_DECFRAC_ARR );
126
+ success = zcbor_tag_put (encoder , ZCBOR_TAG_DECFRAC_ARR );
117
127
success = success && zcbor_list_start_encode (encoder , 2 );
118
128
success = success && zcbor_int32_put (encoder , - detail ); /* exponent */
119
129
success = success && zcbor_int32_put (encoder , * data .decfrac ); /* mantissa */
@@ -124,7 +134,7 @@ static int bin_serialize_simple_value(zcbor_state_t *encoder, union thingset_dat
124
134
success = zcbor_bool_put (encoder , * data .b );
125
135
break ;
126
136
case THINGSET_TYPE_STRING :
127
- success = zcbor_tstr_put_term (encoder , data .str );
137
+ success = zcbor_tstr_put_term (encoder , data .str , detail );
128
138
break ;
129
139
#if CONFIG_THINGSET_BYTES_TYPE_SUPPORT
130
140
case THINGSET_TYPE_BYTES :
@@ -171,17 +181,17 @@ static int bin_serialize_metadata(struct thingset_context *ts,
171
181
return err ;
172
182
}
173
183
174
- const char * name = "name" ;
175
- if (!zcbor_tstr_put_term (ts -> encoder , name )) {
184
+ const char name [] = "name" ;
185
+ if (!zcbor_tstr_put_lit (ts -> encoder , name )) {
176
186
return - THINGSET_ERR_RESPONSE_TOO_LARGE ;
177
187
}
178
188
179
- if (!zcbor_tstr_put_term (ts -> encoder , object -> name )) {
189
+ if (!zcbor_tstr_encode_ptr (ts -> encoder , object -> name , strlen ( object -> name ) )) {
180
190
return - THINGSET_ERR_RESPONSE_TOO_LARGE ;
181
191
}
182
192
183
- const char * type = "type" ;
184
- if (!zcbor_tstr_put_term (ts -> encoder , type )) {
193
+ const char type [] = "type" ;
194
+ if (!zcbor_tstr_put_lit (ts -> encoder , type )) {
185
195
return - THINGSET_ERR_RESPONSE_TOO_LARGE ;
186
196
}
187
197
@@ -236,7 +246,8 @@ static int bin_serialize_value(struct thingset_context *ts,
236
246
success = zcbor_list_start_encode (ts -> encoder , UINT8_MAX );
237
247
for (unsigned int i = 0 ; i < ts -> num_objects ; i ++ ) {
238
248
if (ts -> data_objects [i ].parent_id == object -> id ) {
239
- zcbor_tstr_put_term (ts -> encoder , ts -> data_objects [i ].name );
249
+ zcbor_tstr_encode_ptr (ts -> encoder , ts -> data_objects [i ].name ,
250
+ strlen (ts -> data_objects [i ].name ));
240
251
}
241
252
}
242
253
success = success && zcbor_list_end_encode (ts -> encoder , UINT8_MAX );
@@ -295,7 +306,7 @@ static int bin_serialize_key(struct thingset_context *ts, const struct thingset_
295
306
}
296
307
}
297
308
else {
298
- if (zcbor_tstr_put_term (ts -> encoder , object -> name ) == false) {
309
+ if (zcbor_tstr_encode_ptr (ts -> encoder , object -> name , strlen ( object -> name ) ) == false) {
299
310
return - THINGSET_ERR_RESPONSE_TOO_LARGE ;
300
311
}
301
312
}
@@ -362,8 +373,7 @@ static int bin_parse_endpoint(struct thingset_context *ts)
362
373
ts -> msg_payload = ts -> decoder -> payload ;
363
374
364
375
/* re-initialize decoder for payload parsing */
365
- zcbor_new_decode_state (ts -> decoder , ZCBOR_ARRAY_SIZE (ts -> decoder ), ts -> msg_payload ,
366
- ts -> msg_len - (ts -> msg_payload - ts -> msg ), 1 );
376
+ bin_decoder_init (ts , ts -> msg_payload , ts -> msg_len - (ts -> msg_payload - ts -> msg ));
367
377
368
378
return 0 ;
369
379
}
@@ -471,8 +481,7 @@ static int bin_serialize_report_header(struct thingset_context *ts, const char *
471
481
472
482
static void bin_deserialize_payload_reset (struct thingset_context * ts )
473
483
{
474
- zcbor_new_decode_state (ts -> decoder , ZCBOR_ARRAY_SIZE (ts -> decoder ), ts -> msg_payload ,
475
- ts -> msg_len - (ts -> msg_payload - ts -> msg ), 1 );
484
+ bin_decoder_init (ts , ts -> msg_payload , ts -> msg_len - (ts -> msg_payload - ts -> msg ));
476
485
}
477
486
478
487
static int bin_deserialize_string (struct thingset_context * ts , const char * * str_start ,
@@ -796,8 +805,7 @@ inline void thingset_bin_setup(struct thingset_context *ts, size_t rsp_buf_offse
796
805
{
797
806
ts -> api = & bin_api ;
798
807
799
- zcbor_new_decode_state (ts -> decoder , ZCBOR_ARRAY_SIZE (ts -> decoder ), ts -> msg + 1 , ts -> msg_len - 1 ,
800
- 1 );
808
+ bin_decoder_init (ts , ts -> msg + 1 , ts -> msg_len - 1 );
801
809
802
810
zcbor_new_encode_state (ts -> encoder , ZCBOR_ARRAY_SIZE (ts -> encoder ), ts -> rsp + rsp_buf_offset ,
803
811
ts -> rsp_size - rsp_buf_offset , 1 );
@@ -818,7 +826,9 @@ int thingset_bin_import_data_progressively(struct thingset_context *ts, uint8_t
818
826
* and subsequent cases, where we set the payload pointer back to the start of the buffer)
819
827
*/
820
828
zcbor_new_decode_state (ts -> decoder , ZCBOR_ARRAY_SIZE (ts -> decoder ), ts -> decoder -> payload_mut ,
821
- size - (ts -> decoder -> payload - ts -> msg ), ts -> decoder -> elem_count );
829
+ size - (ts -> decoder -> payload - ts -> msg ), ts -> decoder -> elem_count , NULL ,
830
+ 0 );
831
+ ts -> decoder -> constant_state -> enforce_canonical = false;
822
832
823
833
uint32_t id ;
824
834
size_t successfully_parsed_bytes = 0 ;
0 commit comments