static int64_t OCConvertSingleRepPayload(CborEncoder *repMap, const OCRepPayload *payload) { int64_t err = CborNoError; OCRepPayloadValue *value = payload->values; while (value) { err |= cbor_encode_text_string(repMap, value->name, strlen(value->name)); VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding tag name"); switch (value->type) { case OCREP_PROP_NULL: err |= cbor_encode_null(repMap); break; case OCREP_PROP_INT: err |= cbor_encode_int(repMap, value->i); break; case OCREP_PROP_DOUBLE: err |= cbor_encode_double(repMap, value->d); break; case OCREP_PROP_BOOL: err |= cbor_encode_boolean(repMap, value->b); break; case OCREP_PROP_STRING: err |= cbor_encode_text_string(repMap, value->str, strlen(value->str)); break; case OCREP_PROP_BYTE_STRING: err |= cbor_encode_byte_string(repMap, value->ocByteStr.bytes, value->ocByteStr.len); break; case OCREP_PROP_OBJECT: err |= OCConvertRepMap(repMap, value->obj); break; case OCREP_PROP_ARRAY: err |= OCConvertArray(repMap, &value->arr); break; default: OIC_LOG_V(ERROR, TAG, "Invalid Prop type: %d", value->type); break; } VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding single rep value"); value = value->next; } exit: return err; }
static int64_t OCConvertSingleRepPayload(CborEncoder* parent, const OCRepPayload* payload) { int64_t err = 0; CborEncoder map; err = err | cbor_encoder_create_map(parent, &map, CborIndefiniteLength); // Uri err = err | ConditionalAddTextStringToMap(&map, OC_RSRVD_HREF, sizeof(OC_RSRVD_HREF) - 1, payload->uri); // Prop Map // resource types, interfaces if(payload->types || payload->interfaces) { OC_LOG(INFO, TAG, "Payload has types or interfaces"); err = err | cbor_encode_text_string(&map, OC_RSRVD_PROPERTY, sizeof(OC_RSRVD_PROPERTY) - 1); CborEncoder propMap; err = err | cbor_encoder_create_map(&map, &propMap, CborIndefiniteLength); if (payload->types) { char* joinedTypes = OCStringLLJoin(payload->types); if (joinedTypes) { err = err | cbor_encode_text_string(&propMap, OC_RSRVD_RESOURCE_TYPE, sizeof(OC_RSRVD_RESOURCE_TYPE) - 1); err = err | cbor_encode_text_string(&propMap, joinedTypes, strlen(joinedTypes)); OICFree(joinedTypes); } else { return OC_STACK_NO_MEMORY; } } if (payload->interfaces) { char* joinedInterfaces = OCStringLLJoin(payload->interfaces); if (joinedInterfaces) { err = err | cbor_encode_text_string(&propMap, OC_RSRVD_INTERFACE, sizeof(OC_RSRVD_INTERFACE) - 1); err = err | cbor_encode_text_string(&propMap, joinedInterfaces, strlen(joinedInterfaces)); OICFree(joinedInterfaces); } else { return OC_STACK_NO_MEMORY; } } err = err | cbor_encoder_close_container(&map, &propMap); } // Rep Map { CborEncoder repMap; err = err | cbor_encode_text_string(&map, OC_RSRVD_REPRESENTATION, sizeof(OC_RSRVD_REPRESENTATION) - 1); err = err | cbor_encoder_create_map(&map, &repMap, CborIndefiniteLength); OCRepPayloadValue* value = payload->values; while(value) { err = err | cbor_encode_text_string(&repMap, value->name, strlen(value->name)); switch(value->type) { case OCREP_PROP_NULL: err = err | cbor_encode_null(&repMap); break; case OCREP_PROP_INT: err = err | cbor_encode_int(&repMap, value->i); break; case OCREP_PROP_DOUBLE: err = err | cbor_encode_double(&repMap, value->d); break; case OCREP_PROP_BOOL: err = err | cbor_encode_boolean(&repMap, value->b); break; case OCREP_PROP_STRING: err = err | cbor_encode_text_string(&repMap, value->str, strlen(value->str)); break; case OCREP_PROP_BYTE_STRING: err = err | cbor_encode_byte_string(&repMap, value->ocByteStr.bytes, value->ocByteStr.len); break; case OCREP_PROP_OBJECT: err = err | OCConvertSingleRepPayload(&repMap, value->obj); break; case OCREP_PROP_ARRAY: err = err | OCConvertArray(&repMap, &value->arr); break; default: OC_LOG_V(ERROR, TAG, "Invalid Prop type: %d", value->type); break; } value = value->next; } err = err | cbor_encoder_close_container(&map, &repMap); } // Close Map err = err | cbor_encoder_close_container(parent, &map); return err; }
static bool OCConvertSingleRepPayload(CborEncoder* parent, const OCRepPayload* payload) { bool err = false; CborEncoder map; err = err || cbor_encoder_create_map(parent, &map, CborIndefiniteLength); // Uri err = err || ConditionalAddTextStringToMap(&map, OC_RSRVD_HREF, sizeof(OC_RSRVD_HREF) - 1, payload->uri); // Prop Map // resource types, interfaces if(payload->types || payload->interfaces) { OC_LOG_V(INFO, TAG, "Payload has types or interfaces"); err = err || cbor_encode_text_string(&map, OC_RSRVD_PROPERTY, sizeof(OC_RSRVD_PROPERTY) - 1); CborEncoder propMap; err = err || cbor_encoder_create_map(&map, &propMap, 2); CborEncoder curArray; if(payload->types) { err = err || cbor_encode_text_string(&propMap, OC_RSRVD_RESOURCE_TYPE, sizeof(OC_RSRVD_RESOURCE_TYPE) - 1); err = err || cbor_encoder_create_array(&propMap, &curArray, CborIndefiniteLength); OCStringLL* val = payload->types; while(val) { err = err || cbor_encode_text_string(&curArray, val->value, strlen(val->value)); val = val->next; } err = err || cbor_encoder_close_container(&propMap, &curArray); } if(payload->interfaces) { err = err || cbor_encode_text_string(&propMap, OC_RSRVD_INTERFACE, sizeof(OC_RSRVD_INTERFACE) - 1); err = err || cbor_encoder_create_array(&propMap, &curArray, CborIndefiniteLength); OCStringLL* val = payload->interfaces; while(val) { err = err || cbor_encode_text_string(&curArray, val->value, strlen(val->value)); val = val->next; } err = err || cbor_encoder_close_container(&propMap, &curArray); } err = err || cbor_encoder_close_container(&map, &propMap); } // Rep Map { CborEncoder repMap; err = err || cbor_encode_text_string(&map, OC_RSRVD_REPRESENTATION, sizeof(OC_RSRVD_REPRESENTATION) - 1); err = err || cbor_encoder_create_map(&map, &repMap, CborIndefiniteLength); OCRepPayloadValue* value = payload->values; while(value) { err = err || cbor_encode_text_string(&repMap, value->name, strlen(value->name)); switch(value->type) { case OCREP_PROP_NULL: err = err || cbor_encode_null(&repMap); break; case OCREP_PROP_INT: err = err || cbor_encode_int(&repMap, value->i); break; case OCREP_PROP_DOUBLE: err = err || cbor_encode_double(&repMap, value->d); break; case OCREP_PROP_BOOL: err = err || cbor_encode_boolean(&repMap, value->b); break; case OCREP_PROP_STRING: err = err || cbor_encode_text_string(&repMap, value->str, strlen(value->str)); break; case OCREP_PROP_OBJECT: err = err || OCConvertSingleRepPayload(&repMap, value->obj); break; case OCREP_PROP_ARRAY: err = err || OCConvertArray(&repMap, &value->arr); break; default: OC_LOG_V(ERROR, TAG, "Invalid Prop type: %d", value->type); break; } value = value->next; } err = err || cbor_encoder_close_container(&map, &repMap); } // Close Map err = err || cbor_encoder_close_container(parent, &map); return err; }