/* * Read in cbor key/values from flat buffer pointed by data, and fill them * into attrs. * * @param data Pointer to beginning of cbor encoded data * @param len Number of bytes in the buffer * @param attrs Array of cbor objects to look for. * * @return 0 on success; non-zero on failure. */ int cbor_read_flat_attrs(const uint8_t *data, int len, const struct cbor_attr_t *attrs) { struct cbor_buf_reader reader; struct CborParser parser; struct CborValue value; CborError err; cbor_buf_reader_init(&reader, data, len); err = cbor_parser_init(&reader.r, 0, &parser, &value); if (err != CborNoError) { return -1; } return cbor_read_object(&value, attrs); }
uint16_t oc_parse_rep(const uint8_t *in_payload, uint16_t payload_size, oc_rep_t **out_rep) { CborParser parser; CborValue root_value, cur_value, map; CborError err = CborNoError; struct cbor_buf_reader br; cbor_buf_reader_init(&br, in_payload, payload_size); err |= cbor_parser_init(&br.r, 0, &parser, &root_value); if (cbor_value_is_map(&root_value)) { err |= cbor_value_enter_container(&root_value, &cur_value); *out_rep = 0; oc_rep_t **cur = out_rep; while (cbor_value_is_valid(&cur_value)) { oc_parse_rep_value(&cur_value, cur, &err); err |= cbor_value_advance(&cur_value); cur = &(*cur)->next; } } else if (cbor_value_is_array(&root_value)) { err |= cbor_value_enter_container(&root_value, &map); err |= cbor_value_enter_container(&map, &cur_value); *out_rep = 0; oc_rep_t **cur = out_rep; while (cbor_value_is_valid(&cur_value)) { *cur = _alloc_rep(); (*cur)->type = OBJECT; oc_parse_rep_value(&cur_value, &(*cur)->value_object, &err); err |= cbor_value_advance(&cur_value); (*cur)->next = 0; cur = &(*cur)->next; } } return (uint16_t)err; }