/ 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  }