/ device_test_svc_reply_msg.cpp
device_test_svc_reply_msg.cpp
1 #include "device_test_svc_reply_msg.h" 2 #ifndef CI_TEST 3 #include "FreeRTOS.h" 4 #else // CI_TEST 5 #include <cstdlib> 6 #endif // CI_TEST 7 8 CborError DeviceTestSvcReplyMsg::encode(Data &d, uint8_t *cbor_buffer, 9 size_t size, size_t *encoded_len) { 10 CborError err; 11 CborEncoder encoder, map_encoder; 12 cbor_encoder_init(&encoder, cbor_buffer, size, 0); 13 14 do { 15 err = cbor_encoder_create_map(&encoder, &map_encoder, NUM_FIELDS); 16 if (err != CborNoError) { 17 printf("cbor_encoder_create_map failed: %d\n", err); 18 if (err != CborErrorOutOfMemory) { 19 break; 20 } 21 } 22 23 // success 24 err = cbor_encode_text_stringz(&map_encoder, "success"); 25 if (err != CborNoError) { 26 printf("cbor_encode_text_stringz failed for success key: %d\n", err); 27 if (err != CborErrorOutOfMemory) { 28 break; 29 } 30 } 31 err = cbor_encode_uint(&map_encoder, d.success); 32 if (err != CborNoError) { 33 printf("cbor_encode_uint failed for partition_id value: %d\n", err); 34 if (err != CborErrorOutOfMemory) { 35 break; 36 } 37 } 38 39 // data_len 40 err = cbor_encode_text_stringz(&map_encoder, "data_len"); 41 if (err != CborNoError) { 42 printf("cbor_encode_text_stringz failed for data_len key: %d\n", err); 43 if (err != CborErrorOutOfMemory) { 44 break; 45 } 46 } 47 err = cbor_encode_uint(&map_encoder, d.data_len); 48 if (err != CborNoError) { 49 printf("cbor_encode_uint failed for data_len value: %d\n", err); 50 if (err != CborErrorOutOfMemory) { 51 break; 52 } 53 } 54 55 // data 56 err = cbor_encode_text_stringz(&map_encoder, "data"); 57 if (err != CborNoError) { 58 printf("cbor_encode_text_stringz failed for data key: %d\n", err); 59 if (err != CborErrorOutOfMemory) { 60 break; 61 } 62 } 63 err = cbor_encode_byte_string(&map_encoder, d.data, d.data_len); 64 if (err != CborNoError) { 65 printf("cbor_encode_byte_string failed for data value: %d\n", err); 66 if (err != CborErrorOutOfMemory) { 67 break; 68 } 69 } 70 71 if (err != CborNoError && err != CborErrorOutOfMemory) { 72 break; 73 } 74 75 err = cbor_encoder_close_container(&encoder, &map_encoder); 76 if (err == CborNoError) { 77 *encoded_len = cbor_encoder_get_buffer_size(&encoder, cbor_buffer); 78 } else { 79 printf("cbor_encoder_close_container failed: %d\n", err); 80 if (err != CborErrorOutOfMemory) { 81 break; 82 } 83 size_t extra_bytes_needed = cbor_encoder_get_extra_bytes_needed(&encoder); 84 printf("extra_bytes_needed: %zu\n", extra_bytes_needed); 85 } 86 } while (0); 87 88 return err; 89 } 90 91 CborError DeviceTestSvcReplyMsg::decode(Data &d, const uint8_t *cbor_buffer, 92 size_t size) { 93 CborParser parser; 94 CborValue map; 95 CborError err = cbor_parser_init(cbor_buffer, size, 0, &parser, &map); 96 uint64_t tmp_uint64; 97 do { 98 if (err != CborNoError) { 99 break; 100 } 101 err = cbor_value_validate_basic(&map); 102 if (err != CborNoError) { 103 break; 104 } 105 if (!cbor_value_is_map(&map)) { 106 err = CborErrorIllegalType; 107 break; 108 } 109 110 size_t num_fields; 111 err = cbor_value_get_map_length(&map, &num_fields); 112 if (err != CborNoError) { 113 break; 114 } 115 if (num_fields != NUM_FIELDS) { 116 err = CborErrorUnknownLength; 117 printf("expected %zu fields but got %zu\n", NUM_FIELDS, num_fields); 118 break; 119 } 120 121 CborValue value; 122 err = cbor_value_enter_container(&map, &value); 123 if (err != CborNoError) { 124 break; 125 } 126 127 // success 128 if (!cbor_value_is_text_string(&value)) { 129 err = CborErrorIllegalType; 130 printf("expected string key but got something else\n"); 131 break; 132 } 133 err = cbor_value_advance(&value); 134 if (err != CborNoError) { 135 break; 136 } 137 err = cbor_value_get_uint64(&value, &tmp_uint64); 138 d.success = static_cast<uint32_t>(tmp_uint64); 139 if (err != CborNoError) { 140 break; 141 } 142 err = cbor_value_advance(&value); 143 if (err != CborNoError) { 144 break; 145 } 146 147 // data_len 148 if (!cbor_value_is_text_string(&value)) { 149 err = CborErrorIllegalType; 150 printf("expected string key but got something else\n"); 151 break; 152 } 153 err = cbor_value_advance(&value); 154 if (err != CborNoError) { 155 break; 156 } 157 err = cbor_value_get_uint64(&value, &tmp_uint64); 158 d.data_len = static_cast<uint32_t>(tmp_uint64); 159 if (err != CborNoError) { 160 break; 161 } 162 err = cbor_value_advance(&value); 163 if (err != CborNoError) { 164 break; 165 } 166 167 // data 168 if (!cbor_value_is_text_string(&value)) { 169 err = CborErrorIllegalType; 170 printf("expected string key but got something else\n"); 171 break; 172 } 173 err = cbor_value_advance(&value); 174 if (err != CborNoError) { 175 break; 176 } 177 if (d.data_len) { 178 size_t buflen = d.data_len; 179 #ifndef CI_TEST 180 uint8_t *buf = static_cast<uint8_t *>(pvPortMalloc(buflen)); 181 configASSERT(buf); 182 #else 183 uint8_t *buf = static_cast<uint8_t *>(malloc(buflen)); 184 #endif // CI_TEST 185 err = cbor_value_copy_byte_string(&value, buf, &buflen, NULL); 186 d.data = buf; 187 if (err != CborNoError) { 188 break; 189 } 190 if (buflen != d.data_len) { 191 err = CborErrorIllegalType; 192 break; 193 } 194 } else { 195 d.data = NULL; 196 } 197 err = cbor_value_advance(&value); 198 if (err != CborNoError) { 199 break; 200 } 201 202 if (err == CborNoError) { 203 err = cbor_value_leave_container(&map, &value); 204 if (err != CborNoError) { 205 break; 206 } 207 if (!cbor_value_at_end(&map)) { 208 err = CborErrorGarbageAtEnd; 209 break; 210 } 211 } 212 } while (0); 213 214 return err; 215 }