/ sys_info_svc_reply_msg.cpp
sys_info_svc_reply_msg.cpp
1 #include "sys_info_svc_reply_msg.h" 2 #include "FreeRTOS.h" 3 4 CborError SysInfoSvcReplyMsg::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 // git_sha 36 err = cbor_encode_text_stringz(&map_encoder, "git_sha"); 37 if (err != CborNoError) { 38 printf("cbor_encode_text_stringz failed for git_sha key: %d\n", err); 39 if (err != CborErrorOutOfMemory) { 40 break; 41 } 42 } 43 err = cbor_encode_uint(&map_encoder, d.git_sha); 44 if (err != CborNoError) { 45 printf("cbor_encode_uint failed for git_sha value: %d\n", err); 46 if (err != CborErrorOutOfMemory) { 47 break; 48 } 49 } 50 51 // sys_config_crc 52 err = cbor_encode_text_stringz(&map_encoder, "sys_config_crc"); 53 if (err != CborNoError) { 54 printf("cbor_encode_text_stringz failed for sys_config_crc key: %d\n", err); 55 if (err != CborErrorOutOfMemory) { 56 break; 57 } 58 } 59 err = cbor_encode_uint(&map_encoder, d.sys_config_crc); 60 if (err != CborNoError) { 61 printf("cbor_encode_uint failed for sys_config_crc value: %d\n", err); 62 if (err != CborErrorOutOfMemory) { 63 break; 64 } 65 } 66 67 // app_name_strlen 68 err = cbor_encode_text_stringz(&map_encoder, "app_name_strlen"); 69 if (err != CborNoError) { 70 printf("cbor_encode_text_stringz failed for app_name_strlen key: %d\n", err); 71 if (err != CborErrorOutOfMemory) { 72 break; 73 } 74 } 75 err = cbor_encode_uint(&map_encoder, d.app_name_strlen); 76 if (err != CborNoError) { 77 printf("cbor_encode_uint failed for app_name_strlen value: %d\n", err); 78 if (err != CborErrorOutOfMemory) { 79 break; 80 } 81 } 82 83 // app_name 84 err = cbor_encode_text_stringz(&map_encoder, "app_name"); 85 if (err != CborNoError) { 86 printf("cbor_encode_text_stringz failed for app_name key: %d\n", err); 87 if (err != CborErrorOutOfMemory) { 88 break; 89 } 90 } 91 err = cbor_encode_text_stringz(&map_encoder, d.app_name); 92 if (err != CborNoError) { 93 printf("cbor_encode_text_stringz failed for app_name 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 app_name. Caller is responsible for freeing it if d.app_name != NULL. 120 CborError SysInfoSvcReplyMsg::decode(SysInfoSvcReplyMsg::Data &d, const uint8_t *cbor_buffer, 121 size_t size) { 122 d.app_name = NULL; 123 CborParser parser; 124 CborValue map; 125 CborError err = cbor_parser_init(cbor_buffer, size, 0, &parser, &map); 126 uint64_t tmp_uint64; 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 != SysInfoSvcReplyMsg::NUM_FIELDS) { 147 err = CborErrorUnknownLength; 148 printf("expected %zu fields but got %zu\n", SysInfoSvcReplyMsg::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, &d.node_id); 169 if (err != CborNoError) { 170 break; 171 } 172 err = cbor_value_advance(&value); 173 if (err != CborNoError) { 174 break; 175 } 176 177 // git_sha 178 if (!cbor_value_is_text_string(&value)) { 179 err = CborErrorIllegalType; 180 printf("expected string key but got something else\n"); 181 break; 182 } 183 err = cbor_value_advance(&value); 184 if (err != CborNoError) { 185 break; 186 } 187 err = cbor_value_get_uint64(&value, &tmp_uint64); 188 if (err != CborNoError) { 189 break; 190 } 191 d.git_sha = tmp_uint64; 192 err = cbor_value_advance(&value); 193 if (err != CborNoError) { 194 break; 195 } 196 197 // sys_config_crc 198 if (!cbor_value_is_text_string(&value)) { 199 err = CborErrorIllegalType; 200 printf("expected string key but got something else\n"); 201 break; 202 } 203 err = cbor_value_advance(&value); 204 if (err != CborNoError) { 205 break; 206 } 207 err = cbor_value_get_uint64(&value, &tmp_uint64); 208 if (err != CborNoError) { 209 break; 210 } 211 d.sys_config_crc = tmp_uint64; 212 err = cbor_value_advance(&value); 213 if (err != CborNoError) { 214 break; 215 } 216 217 // app_name_strlen 218 if (!cbor_value_is_text_string(&value)) { 219 err = CborErrorIllegalType; 220 printf("expected string key but got something else\n"); 221 break; 222 } 223 err = cbor_value_advance(&value); 224 if (err != CborNoError) { 225 break; 226 } 227 err = cbor_value_get_uint64(&value, &tmp_uint64); 228 if (err != CborNoError) { 229 break; 230 } 231 d.app_name_strlen = tmp_uint64; 232 err = cbor_value_advance(&value); 233 if (err != CborNoError) { 234 break; 235 } 236 237 // app_name 238 if (!cbor_value_is_text_string(&value)) { 239 err = CborErrorIllegalType; 240 printf("expected string key but got something else\n"); 241 break; 242 } 243 err = cbor_value_advance(&value); 244 if (err != CborNoError) { 245 break; 246 } 247 if (!cbor_value_is_text_string(&value)) { 248 err = CborErrorIllegalType; 249 printf("expected string value but got something else\n"); 250 break; 251 } 252 size_t buflen = d.app_name_strlen + 1; 253 char *buf = static_cast<char *>(pvPortMalloc(sizeof(char) * buflen)); 254 if (buf == NULL) { 255 err = CborErrorOutOfMemory; 256 break; 257 } 258 err = cbor_value_copy_text_string(&value, buf, &buflen, NULL); 259 if (err != CborNoError) { 260 break; 261 } 262 d.app_name = buf; 263 err = cbor_value_advance(&value); 264 if (err != CborNoError) { 265 break; 266 } 267 268 if (err == CborNoError) { 269 err = cbor_value_leave_container(&map, &value); 270 if (err != CborNoError) { 271 break; 272 } 273 if (!cbor_value_at_end(&map)) { 274 err = CborErrorGarbageAtEnd; 275 break; 276 } 277 } 278 } while (0); 279 280 return err; 281 }