/ config_cbor_map_srv_reply_msg.cpp
config_cbor_map_srv_reply_msg.cpp
1 #include "config_cbor_map_srv_reply_msg.h" 2 #include "FreeRTOS.h" 3 4 CborError ConfigCborMapSrvReplyMsg::encode(Data &d, uint8_t *cbor_buffer, size_t size, 5 size_t *encoded_len) { 6 CborError err; 7 CborEncoder encoder, map_encoder; 8 cbor_encoder_init(&encoder, cbor_buffer, size, 0); 9 10 do { 11 err = cbor_encoder_create_map(&encoder, &map_encoder, NUM_FIELDS); 12 if (err != CborNoError) { 13 printf("cbor_encoder_create_map failed: %d\n", err); 14 if (err != CborErrorOutOfMemory) { 15 break; 16 } 17 } 18 19 // node_id 20 err = cbor_encode_text_stringz(&map_encoder, "node_id"); 21 if (err != CborNoError) { 22 printf("cbor_encode_text_stringz failed for node_id key: %d\n", err); 23 if (err != CborErrorOutOfMemory) { 24 break; 25 } 26 } 27 err = cbor_encode_uint(&map_encoder, d.node_id); 28 if (err != CborNoError) { 29 printf("cbor_encode_uint failed for node_id value: %d\n", err); 30 if (err != CborErrorOutOfMemory) { 31 break; 32 } 33 } 34 35 // partition_id 36 err = cbor_encode_text_stringz(&map_encoder, "partition_id"); 37 if (err != CborNoError) { 38 printf("cbor_encode_text_stringz failed for partition_id key: %d\n", err); 39 if (err != CborErrorOutOfMemory) { 40 break; 41 } 42 } 43 err = cbor_encode_uint(&map_encoder, d.partition_id); 44 if (err != CborNoError) { 45 printf("cbor_encode_uint failed for partition_id value: %d\n", err); 46 if (err != CborErrorOutOfMemory) { 47 break; 48 } 49 } 50 51 // success 52 err = cbor_encode_text_stringz(&map_encoder, "success"); 53 if (err != CborNoError) { 54 printf("cbor_encode_text_stringz failed for success key: %d\n", err); 55 if (err != CborErrorOutOfMemory) { 56 break; 57 } 58 } 59 err = cbor_encode_uint(&map_encoder, d.success); 60 if (err != CborNoError) { 61 printf("cbor_encode_uint failed for success value: %d\n", err); 62 if (err != CborErrorOutOfMemory) { 63 break; 64 } 65 } 66 67 // cbor_encoded_map_len 68 err = cbor_encode_text_stringz(&map_encoder, "cbor_encoded_map_len"); 69 if (err != CborNoError) { 70 printf("cbor_encode_text_stringz failed for cbor_encoded_map_len key: %d\n", err); 71 if (err != CborErrorOutOfMemory) { 72 break; 73 } 74 } 75 err = cbor_encode_uint(&map_encoder, d.cbor_encoded_map_len); 76 if (err != CborNoError) { 77 printf("cbor_encode_uint failed for cbor_encoded_map_len value: %d\n", err); 78 if (err != CborErrorOutOfMemory) { 79 break; 80 } 81 } 82 83 // cbor_data 84 err = cbor_encode_text_stringz(&map_encoder, "cbor_data"); 85 if (err != CborNoError) { 86 printf("cbor_encode_text_stringz failed for cbor_data key: %d\n", err); 87 if (err != CborErrorOutOfMemory) { 88 break; 89 } 90 } 91 err = cbor_encode_byte_string(&map_encoder, d.cbor_data, d.cbor_encoded_map_len); 92 if (err != CborNoError) { 93 printf("cbor_encode_byte_string failed for partition_id value: %d\n", err); 94 if (err != CborErrorOutOfMemory) { 95 break; 96 } 97 } 98 99 if (err != CborNoError && err != CborErrorOutOfMemory) { 100 break; 101 } 102 103 err = cbor_encoder_close_container(&encoder, &map_encoder); 104 if (err == CborNoError) { 105 *encoded_len = cbor_encoder_get_buffer_size(&encoder, cbor_buffer); 106 } else { 107 printf("cbor_encoder_close_container failed: %d\n", err); 108 if (err != CborErrorOutOfMemory) { 109 break; 110 } 111 size_t extra_bytes_needed = cbor_encoder_get_extra_bytes_needed(&encoder); 112 printf("extra_bytes_needed: %zu\n", extra_bytes_needed); 113 } 114 } while (0); 115 116 return err; 117 } 118 119 // allocates memory for d.cbor_data, caller must free. 120 CborError ConfigCborMapSrvReplyMsg::decode(ConfigCborMapSrvReplyMsg::Data &d, const uint8_t *cbor_buffer, 121 size_t size) { 122 CborParser parser; 123 CborValue map; 124 CborError err = cbor_parser_init(cbor_buffer, size, 0, &parser, &map); 125 uint64_t tmp_uint64; 126 d.cbor_data = NULL; 127 128 do { 129 if (err != CborNoError) { 130 break; 131 } 132 err = cbor_value_validate_basic(&map); 133 if (err != CborNoError) { 134 break; 135 } 136 if (!cbor_value_is_map(&map)) { 137 err = CborErrorIllegalType; 138 break; 139 } 140 141 size_t num_fields; 142 err = cbor_value_get_map_length(&map, &num_fields); 143 if (err != CborNoError) { 144 break; 145 } 146 if (num_fields != ConfigCborMapSrvReplyMsg::NUM_FIELDS) { 147 err = CborErrorUnknownLength; 148 printf("expected %zu fields but got %zu\n", ConfigCborMapSrvReplyMsg::NUM_FIELDS, num_fields); 149 break; 150 } 151 152 CborValue value; 153 err = cbor_value_enter_container(&map, &value); 154 if (err != CborNoError) { 155 break; 156 } 157 158 // node_id 159 if (!cbor_value_is_text_string(&value)) { 160 err = CborErrorIllegalType; 161 printf("expected string key but got something else\n"); 162 break; 163 } 164 err = cbor_value_advance(&value); 165 if (err != CborNoError) { 166 break; 167 } 168 err = cbor_value_get_uint64(&value, &tmp_uint64); 169 d.node_id = tmp_uint64; 170 if (err != CborNoError) { 171 break; 172 } 173 err = cbor_value_advance(&value); 174 if (err != CborNoError) { 175 break; 176 } 177 178 // partition_id 179 if (!cbor_value_is_text_string(&value)) { 180 err = CborErrorIllegalType; 181 printf("expected string key but got something else\n"); 182 break; 183 } 184 err = cbor_value_advance(&value); 185 if (err != CborNoError) { 186 break; 187 } 188 err = cbor_value_get_uint64(&value, &tmp_uint64); 189 d.partition_id = static_cast<uint32_t>(tmp_uint64); 190 if (err != CborNoError) { 191 break; 192 } 193 err = cbor_value_advance(&value); 194 if (err != CborNoError) { 195 break; 196 } 197 198 // success 199 if (!cbor_value_is_text_string(&value)) { 200 err = CborErrorIllegalType; 201 printf("expected string key but got something else\n"); 202 break; 203 } 204 err = cbor_value_advance(&value); 205 if (err != CborNoError) { 206 break; 207 } 208 err = cbor_value_get_uint64(&value, &tmp_uint64); 209 d.success = static_cast<bool>(tmp_uint64); 210 if (err != CborNoError) { 211 break; 212 } 213 err = cbor_value_advance(&value); 214 if (err != CborNoError) { 215 break; 216 } 217 218 // cbor_encoded_map_len 219 if (!cbor_value_is_text_string(&value)) { 220 err = CborErrorIllegalType; 221 printf("expected string key but got something else\n"); 222 break; 223 } 224 err = cbor_value_advance(&value); 225 if (err != CborNoError) { 226 break; 227 } 228 err = cbor_value_get_uint64(&value, &tmp_uint64); 229 d.cbor_encoded_map_len = static_cast<uint32_t>(tmp_uint64); 230 if (err != CborNoError) { 231 break; 232 } 233 err = cbor_value_advance(&value); 234 if (err != CborNoError) { 235 break; 236 } 237 238 // cbor_data 239 if (!cbor_value_is_text_string(&value)) { 240 err = CborErrorIllegalType; 241 printf("expected string key but got something else\n"); 242 break; 243 } 244 err = cbor_value_advance(&value); 245 if (err != CborNoError) { 246 break; 247 } 248 if(d.cbor_encoded_map_len && d.success) { 249 size_t buflen = d.cbor_encoded_map_len; 250 uint8_t *buf = static_cast<uint8_t *>(pvPortMalloc(buflen)); 251 configASSERT(buf); 252 err = cbor_value_copy_byte_string(&value, buf, &buflen, NULL) ; 253 d.cbor_data = buf; 254 if (err != CborNoError) { 255 break; 256 } 257 if(buflen != d.cbor_encoded_map_len) { 258 err = CborErrorIllegalType; 259 break; 260 } 261 } else { 262 d.cbor_data = NULL; 263 } 264 err = cbor_value_advance(&value); 265 if (err != CborNoError) { 266 break; 267 } 268 269 if (err == CborNoError) { 270 err = cbor_value_leave_container(&map, &value); 271 if (err != CborNoError) { 272 break; 273 } 274 if (!cbor_value_at_end(&map)) { 275 err = CborErrorGarbageAtEnd; 276 break; 277 } 278 } 279 } while (0); 280 281 return err; 282 }