X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsrc%2Focpayloadconvert.c;h=daa9003d988f091d1dc3adcb3f70074744775478;hb=3c093548382bb2542c87a67e6e5fa32552c29cb3;hp=4e80fc020191db4e37c99e7e582ba2c41db6f14c;hpb=d0baf5ae6936a16de6a49588428204d8c386ac9e;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/stack/src/ocpayloadconvert.c b/resource/csdk/stack/src/ocpayloadconvert.c old mode 100644 new mode 100755 index 4e80fc0..daa9003 --- a/resource/csdk/stack/src/ocpayloadconvert.c +++ b/resource/csdk/stack/src/ocpayloadconvert.c @@ -18,6 +18,10 @@ // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#ifdef ARDUINO +#define __STDC_LIMIT_MACROS +#endif + #include "ocpayloadcbor.h" #include "platform_features.h" #include @@ -28,109 +32,111 @@ #include "ocrandom.h" #include "ocresourcehandler.h" #include "cbor.h" -#include "rdpayload.h" -#define TAG "OCPayloadConvert" +#define TAG "OIC_RI_PAYLOADCONVERT" + // Arbitrarily chosen size that seems to contain the majority of packages #define INIT_SIZE (255) -// CBOR Array Length -#define DISCOVERY_CBOR_ARRAY_LEN 1 -// CBOR Res Map Length -#define DISCOVERY_CBOR_RES_MAP_LEN 2 -// CBOR Links Map Length -#define DISCOVERY_CBOR_LINKS_MAP_LEN 4 +// Discovery Links Map Length. +#define LINKS_MAP_LEN 4 // Functions all return either a CborError, or a negative version of the OC_STACK return values -static int64_t OCConvertPayloadHelper(OCPayload* payload, uint8_t* outPayload, size_t* size); -static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload* payload, uint8_t* outPayload, - size_t* size); -static int64_t OCConvertDevicePayload(OCDevicePayload* payload, uint8_t* outPayload, - size_t* size); -static int64_t OCConvertPlatformPayload(OCPlatformPayload* payload, uint8_t* outPayload, - size_t* size); -static int64_t OCConvertRepPayload(OCRepPayload* payload, uint8_t* outPayload, size_t* size); -static int64_t OCConvertPresencePayload(OCPresencePayload* payload, uint8_t* outPayload, - size_t* size); -static int64_t OCConvertSecurityPayload(OCSecurityPayload* payload, uint8_t* outPayload, - size_t* size); -static int64_t OCConvertSingleRepPayload(CborEncoder* parent, const OCRepPayload* payload); -static int64_t OCConvertArray(CborEncoder* parent, const OCRepPayloadValueArray* valArray); - -static int64_t AddTextStringToMap(CborEncoder* map, const char* key, size_t keylen, - const char* value); - -static int64_t ConditionalAddTextStringToMap(CborEncoder* map, const char* key, size_t keylen, - const char* value); +static int64_t OCConvertPayloadHelper(OCPayload *payload, uint8_t *outPayload, size_t *size); +static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload *payload, uint8_t *outPayload, + size_t *size); +static int64_t OCConvertRepPayload(OCRepPayload *payload, uint8_t *outPayload, size_t *size); +static int64_t OCConvertRepMap(CborEncoder *map, const OCRepPayload *payload); +#ifdef WITH_PRESENCE +static int64_t OCConvertPresencePayload(OCPresencePayload *payload, uint8_t *outPayload, + size_t *size); +#endif +static int64_t OCConvertSecurityPayload(OCSecurityPayload *payload, uint8_t *outPayload, + size_t *size); +static int64_t OCConvertSingleRepPayload(CborEncoder *parent, const OCRepPayload *payload); +static int64_t OCConvertArray(CborEncoder *parent, const OCRepPayloadValueArray *valArray); + +static int64_t AddTextStringToMap(CborEncoder *map, const char *key, size_t keylen, + const char *value); +static int64_t ConditionalAddTextStringToMap(CborEncoder *map, const char *key, size_t keylen, + const char *value); OCStackResult OCConvertPayload(OCPayload* payload, uint8_t** outPayload, size_t* size) { // TinyCbor Version 47a78569c0 or better on master is required for the re-allocation // strategy to work. If you receive the following assertion error, please do a git-pull // from the extlibs/tinycbor/tinycbor directory - #define CborNeedsUpdating (CborErrorOutOfMemory < CborErrorDataTooLarge) + #define CborNeedsUpdating (((unsigned int)CborErrorOutOfMemory) < ((unsigned int)CborErrorDataTooLarge)) OC_STATIC_ASSERT(!CborNeedsUpdating, "tinycbor needs to be updated to at least 47a78569c0"); #undef CborNeedsUpdating - if (!payload) + + OCStackResult ret = OC_STACK_INVALID_PARAM; + int64_t err; + uint8_t *out = NULL; + size_t curSize = INIT_SIZE; + + VERIFY_PARAM_NON_NULL(TAG, payload, "Input param, payload is NULL"); + VERIFY_PARAM_NON_NULL(TAG, outPayload, "OutPayload parameter is NULL"); + VERIFY_PARAM_NON_NULL(TAG, size, "size parameter is NULL"); + + OIC_LOG_V(INFO, TAG, "Converting payload of type %d", payload->type); + if (PAYLOAD_TYPE_SECURITY == payload->type) { - OC_LOG(ERROR, TAG, "Payload parameter NULL"); - return OC_STACK_INVALID_PARAM; + size_t securityPayloadSize = ((OCSecurityPayload *)payload)->payloadSize; + if (securityPayloadSize > 0) + { + out = (uint8_t *)OICCalloc(1, ((OCSecurityPayload *)payload)->payloadSize); + VERIFY_PARAM_NON_NULL(TAG, out, "Failed to allocate security payload"); + } } - - if (!outPayload || !size) + if (out == NULL) { - OC_LOG(ERROR, TAG, "Out parameter/s parameter NULL"); - return OC_STACK_INVALID_PARAM; + out = (uint8_t *)OICCalloc(1, curSize); + VERIFY_PARAM_NON_NULL(TAG, out, "Failed to allocate payload"); } - - OC_LOG_V(INFO, TAG, "Converting payload of type %d", payload->type); - - size_t curSize = INIT_SIZE; - uint8_t* out = (uint8_t*)OICCalloc(1, curSize); - int64_t err = OCConvertPayloadHelper(payload, out, &curSize); + err = OCConvertPayloadHelper(payload, out, &curSize); + ret = OC_STACK_NO_MEMORY; if (err == CborErrorOutOfMemory) { // reallocate "out" and try again! - uint8_t* out2 = (uint8_t*)OICRealloc(out, curSize); - - if (!out2) - { - OICFree(out); - return OC_STACK_NO_MEMORY; - } - + uint8_t *out2 = (uint8_t *)OICRealloc(out, curSize); + VERIFY_PARAM_NON_NULL(TAG, out2, "Failed to increase payload size"); + memset(out2, 0, curSize); out = out2; err = OCConvertPayloadHelper(payload, out, &curSize); + while (err == CborErrorOutOfMemory) + { + uint8_t *out2 = (uint8_t *)OICRealloc(out, curSize); + VERIFY_PARAM_NON_NULL(TAG, out2, "Failed to increase payload size"); + memset(out2, 0, curSize); + out = out2; + err = OCConvertPayloadHelper(payload, out, &curSize); + } } - if (err == 0) + if (err == CborNoError) { - if (curSize < INIT_SIZE) + if (curSize < INIT_SIZE && PAYLOAD_TYPE_SECURITY != payload->type) { - uint8_t* out2 = (uint8_t*)OICRealloc(out, curSize); - - if (!out2) - { - OICFree(out); - return OC_STACK_NO_MEMORY; - } - + uint8_t *out2 = (uint8_t *)OICRealloc(out, curSize); + VERIFY_PARAM_NON_NULL(TAG, out2, "Failed to increase payload size"); out = out2; } *size = curSize; *outPayload = out; + OIC_LOG_V(DEBUG, TAG, "Payload Size: %zd Payload : ", *size); + OIC_LOG_BUFFER(DEBUG, TAG, *outPayload, *size); return OC_STACK_OK; } - else if (err < 0) - { - return (OCStackResult)-err; - } - else - { - return OC_STACK_ERROR; - } + + //TODO: Proper conversion from CborError to OCStackResult. + ret = (OCStackResult)-err; + +exit: + OICFree(out); + return ret; } static int64_t OCConvertPayloadHelper(OCPayload* payload, uint8_t* outPayload, size_t* size) @@ -139,21 +145,17 @@ static int64_t OCConvertPayloadHelper(OCPayload* payload, uint8_t* outPayload, s { case PAYLOAD_TYPE_DISCOVERY: return OCConvertDiscoveryPayload((OCDiscoveryPayload*)payload, outPayload, size); - case PAYLOAD_TYPE_DEVICE: - return OCConvertDevicePayload((OCDevicePayload*)payload, outPayload, size); - case PAYLOAD_TYPE_PLATFORM: - return OCConvertPlatformPayload((OCPlatformPayload*)payload, outPayload, size); case PAYLOAD_TYPE_REPRESENTATION: return OCConvertRepPayload((OCRepPayload*)payload, outPayload, size); +#ifdef WITH_PRESENCE case PAYLOAD_TYPE_PRESENCE: return OCConvertPresencePayload((OCPresencePayload*)payload, outPayload, size); +#endif case PAYLOAD_TYPE_SECURITY: return OCConvertSecurityPayload((OCSecurityPayload*)payload, outPayload, size); - case PAYLOAD_TYPE_RD: - return OCRDPayloadToCbor((OCRDPayload*)payload, outPayload, size); default: - OC_LOG_V(INFO,TAG, "ConvertPayload default %d", payload->type); - return OC_STACK_NOTIMPL; + OIC_LOG_V(INFO,TAG, "ConvertPayload default %d", payload->type); + return CborErrorUnknownType; } } @@ -161,689 +163,552 @@ static int64_t checkError(int64_t err, CborEncoder* encoder, uint8_t* outPayload { if (err == CborErrorOutOfMemory) { - *size += encoder->ptr - encoder->end; + *size += cbor_encoder_get_extra_bytes_needed(encoder); return err; } - else if (err != 0) + else if (err != CborNoError) { - OC_LOG_V(ERROR, TAG, "Convert Payload failed : %zd", err); + OIC_LOG_V(ERROR, TAG, "Convert Payload failed : %s", cbor_error_string(err)); return err; } else { - *size = encoder->ptr - outPayload; - return 0; + *size = cbor_encoder_get_buffer_size(encoder, outPayload); + return err; } } static int64_t OCConvertSecurityPayload(OCSecurityPayload* payload, uint8_t* outPayload, size_t* size) { - CborEncoder encoder; - int64_t err = 0; + memcpy(outPayload, payload->securityData, payload->payloadSize); + *size = payload->payloadSize; - cbor_encoder_init(&encoder, outPayload, *size, 0); - - CborEncoder rootArray; - err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); - CborEncoder map; - - err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); - - if(payload->securityData) - { - err = err | AddTextStringToMap(&map, OC_RSRVD_REPRESENTATION, - sizeof(OC_RSRVD_REPRESENTATION) - 1, - payload->securityData); - } - - err = err | cbor_encoder_close_container(&rootArray, &map); - - err = err | cbor_encoder_close_container(&encoder, &rootArray); - return checkError(err, &encoder, outPayload, size); + return CborNoError; } -static char* OCStringLLJoin(OCStringLL* val) +static int64_t OCStringLLJoin(CborEncoder *map, char *type, OCStringLL *val) { - OCStringLL* temp = val; - size_t size = strlen(temp->value); + uint16_t count = 0; + int64_t err = CborNoError; - while (temp->next) + for (OCStringLL *temp = val; temp; temp = temp->next) { - ++size; - temp = temp->next; - size += strlen(temp->value); + ++count; } - - char* joinedStr = (char*)OICCalloc(sizeof(char), size + 1); - - if (!joinedStr) + if (count > 0) { - return NULL; + CborEncoder array; + err |= cbor_encode_text_string(map, type, strlen(type)); + err |= cbor_encoder_create_array(map, &array, count); + while (val) + { + err |= cbor_encode_text_string(&array, val->value, strlen(val->value)); + val = val->next; + } + err |= cbor_encoder_close_container(map, &array); } - OICStrcat(joinedStr, size + 1, val->value); - while (val->next) - { - val = val->next; - OICStrcat(joinedStr, size + 1, " "); - OICStrcat(joinedStr, size + 1, val->value); - } - return joinedStr; + return err; } -static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload* payload, uint8_t* outPayload, - size_t* size) +static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload *payload, uint8_t *outPayload, + size_t *size) { - CborEncoder encoder = {0}; - CborEncoder rootArray = {0}; - int64_t err = 0; + CborEncoder encoder; + int64_t err = CborNoError; cbor_encoder_init(&encoder, outPayload, *size, 0); - if (payload->collectionResources) - { - CborError cborEncoderResult; - cborEncoderResult = cbor_encoder_create_array(&encoder, &rootArray, DISCOVERY_CBOR_ARRAY_LEN); - if (CborNoError != cborEncoderResult) - { - OC_LOG(ERROR, TAG, "Failed creating root array."); - goto cbor_error; + /* + The format for the payload is "modelled" as JSON. + + [ // rootArray + { // rootMap + "di" : UUID, // device ID + "rt": ["oic.wk.res"] + "n":"MyDevice" + "if":"oic.if.ll oic.if.baseline" + "di": "0685B960-736F-46F7-BEC0-9E6CBD61ADC1", + links :[ // linksArray contains maps of resources + { + href, rt, if, policy // Resource 1 + }, + { + href, rt, if, policy // Resource 2 + }, + . + . + . + ] + } + { // rootMap + ... } + ] + */ - CborEncoder colArray; - cborEncoderResult = cbor_encoder_create_array(&rootArray, &colArray, CborIndefiniteLength); - if (CborNoError != cborEncoderResult) + // Open the main root array + CborEncoder rootArray; + err |= cbor_encoder_create_array(&encoder, &rootArray, 1); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating discovery root array"); + + while (payload && payload->resources) + { + // Open the root map in the root array + CborEncoder rootMap; + err |= cbor_encoder_create_map(&rootArray, &rootMap, CborIndefiniteLength); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating discovery map"); + + // Insert Name + err |= ConditionalAddTextStringToMap(&rootMap, OC_RSRVD_DEVICE_NAME, + sizeof(OC_RSRVD_DEVICE_NAME) - 1, payload->name); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting name"); + + // Insert Device ID into the root map + err |= AddTextStringToMap(&rootMap, OC_RSRVD_DEVICE_ID, sizeof(OC_RSRVD_DEVICE_ID) - 1, + payload->sid); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting device id"); + + // Insert Resource Type + err |= OCStringLLJoin(&rootMap, OC_RSRVD_RESOURCE_TYPE, payload->type); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting RT"); + + // Insert interfaces + if (payload->iface) { - OC_LOG(ERROR, TAG, "Failed creating collection array."); - goto cbor_error; + err |= OCStringLLJoin(&rootMap, OC_RSRVD_INTERFACE, payload->iface); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding interface types tag/value"); } - OCResourceCollectionPayload *colResources = payload->collectionResources; - while (colResources) + + // Insert baseURI if present + err |= ConditionalAddTextStringToMap(&rootMap, OC_RSRVD_BASE_URI, + sizeof(OC_RSRVD_BASE_URI) - 1, + payload->baseURI); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting baseURI"); + + // Insert Links into the root map. + CborEncoder linkArray; + err |= cbor_encode_text_string(&rootMap, OC_RSRVD_LINKS, sizeof(OC_RSRVD_LINKS) - 1); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting links array tag"); + size_t resourceCount = OCDiscoveryPayloadGetResourceCount(payload); + err |= cbor_encoder_create_array(&rootMap, &linkArray, resourceCount); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting links array"); + + for (size_t i = 0; i < resourceCount; ++i) { - if (OC_STACK_OK != OCTagsPayloadToCbor(colResources->tags, &colArray)) + CborEncoder linkMap; + OCResourcePayload *resource = OCDiscoveryPayloadGetResource(payload, i); + VERIFY_PARAM_NON_NULL(TAG, resource, "Failed retrieving resource"); + + // resource map inside the links array. + err |= cbor_encoder_create_map(&linkArray, &linkMap, LINKS_MAP_LEN); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating links map"); + + // Below are insertions of the resource properties into the map. + // Uri + err |= AddTextStringToMap(&linkMap, OC_RSRVD_HREF, sizeof(OC_RSRVD_HREF) - 1, + resource->uri); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding uri to links map"); + + // Resource Type + if (resource->types) { - goto cbor_error; + err |= OCStringLLJoin(&linkMap, OC_RSRVD_RESOURCE_TYPE, resource->types); + VERIFY_CBOR_SUCCESS(TAG, err, + "Failed adding resourceType tag/value to links map"); } - if (OC_STACK_OK != OCLinksPayloadToCbor(colResources->setLinks, &colArray)) + // Interface Types + if (resource->interfaces) { - goto cbor_error; + err |= OCStringLLJoin(&linkMap, OC_RSRVD_INTERFACE, resource->interfaces); + VERIFY_CBOR_SUCCESS(TAG, err, + "Failed adding interfaces tag/value to links map"); } - colResources = colResources->next; - } - cborEncoderResult = cbor_encoder_close_container(&rootArray, &colArray); - if (CborNoError != cborEncoderResult) - { - OC_LOG(ERROR, TAG, "Failed closing collection array."); - goto cbor_error; - } - cborEncoderResult = cbor_encoder_close_container(&encoder, &rootArray); - if (CborNoError != cborEncoderResult) - { - OC_LOG(ERROR, TAG, "Failed closing root array."); - goto cbor_error; - } - } - else if (payload->resources) - { - size_t resourceCount = OCDiscoveryPayloadGetResourceCount(payload); - err = err | cbor_encoder_create_array(&encoder, &rootArray, resourceCount); - for(size_t i = 0; i < resourceCount; ++i) - { - CborEncoder map; - OCResourcePayload* resource = OCDiscoveryPayloadGetResource(payload, i); - if(!resource) + // Policy + CborEncoder policyMap; + err |= cbor_encode_text_string(&linkMap, OC_RSRVD_POLICY, + sizeof(OC_RSRVD_POLICY) - 1); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding policy tag to links map"); + err |= cbor_encoder_create_map(&linkMap, &policyMap, CborIndefiniteLength); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding policy map to links map"); + + // Bitmap + err |= cbor_encode_text_string(&policyMap, OC_RSRVD_BITMAP, + sizeof(OC_RSRVD_BITMAP) - 1); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding bitmap tag to policy map"); + err |= cbor_encode_uint(&policyMap, resource->bitmap); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding bitmap value to policy map"); + + // Secure + err |= cbor_encode_text_string(&policyMap, OC_RSRVD_SECURE, + sizeof(OC_RSRVD_SECURE) - 1); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding secure tag to policy map"); + err |= cbor_encode_boolean(&policyMap, resource->secure); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding secure value to policy map"); + + if (resource->secure || payload->baseURI) { - OICFree(outPayload); - return OC_STACK_INVALID_PARAM; + err |= cbor_encode_text_string(&policyMap, OC_RSRVD_HOSTING_PORT, + sizeof(OC_RSRVD_HOSTING_PORT) - 1); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding secure port tag"); + err |= cbor_encode_uint(&policyMap, resource->port); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding secure port value"); } - err = err | cbor_encoder_create_map(&rootArray, &map, DISCOVERY_CBOR_RES_MAP_LEN); - - // Device ID - err = err | cbor_encode_text_string(&map, OC_RSRVD_DEVICE_ID, - sizeof(OC_RSRVD_DEVICE_ID) - 1); - err = err | cbor_encode_byte_string(&map, resource->sid, UUID_SIZE); - +#ifdef TCP_ADAPTER +#ifdef __WITH_TLS__ + // tls + if (resource->secure) { - CborEncoder linkArray; - err = err | cbor_encode_text_string(&map, OC_RSRVD_LINKS, sizeof(OC_RSRVD_LINKS) -1); - err = err | cbor_encoder_create_array(&map, &linkArray, CborIndefiniteLength); - - // Link Map - { - CborEncoder linkMap; - err = err | cbor_encoder_create_map(&linkArray, &linkMap, DISCOVERY_CBOR_LINKS_MAP_LEN); - - // Uri - err = err | AddTextStringToMap(&linkMap, OC_RSRVD_HREF, - sizeof(OC_RSRVD_HREF) - 1, - resource->uri); - // Resource Type - if (resource->types) - { - char* joinedTypes = OCStringLLJoin(resource->types); - if (joinedTypes) - { - err = err | cbor_encode_text_string(&linkMap, OC_RSRVD_RESOURCE_TYPE, - sizeof(OC_RSRVD_RESOURCE_TYPE) - 1); - err = err | cbor_encode_text_string(&linkMap, joinedTypes, - strlen(joinedTypes)); - OICFree(joinedTypes); - } - else - { - return OC_STACK_NO_MEMORY; - } - } - // Interface Types - if (resource->interfaces) - { - char* joinedInterfaces = OCStringLLJoin(resource->interfaces); - if (joinedInterfaces) - { - err = err | cbor_encode_text_string(&linkMap, OC_RSRVD_INTERFACE, - sizeof(OC_RSRVD_INTERFACE) - 1); - err = err | cbor_encode_text_string(&linkMap, joinedInterfaces, - strlen(joinedInterfaces)); - OICFree(joinedInterfaces); - } - else - { - return OC_STACK_NO_MEMORY; - } - } - // Policy - { - CborEncoder policyMap; - err = err | cbor_encode_text_string(&linkMap, OC_RSRVD_POLICY, - sizeof(OC_RSRVD_POLICY) - 1); - err = err | cbor_encoder_create_map(&linkMap, &policyMap, CborIndefiniteLength); - - // Bitmap - err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_BITMAP, - sizeof(OC_RSRVD_BITMAP) - 1); - err = err | cbor_encode_uint(&policyMap, resource->bitmap); - - if(resource->secure) - { - err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_SECURE, - sizeof(OC_RSRVD_SECURE) - 1); - err = err | cbor_encode_boolean(&policyMap, OC_RESOURCE_SECURE); - - if(resource->port != 0) - { - err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_HOSTING_PORT, - sizeof(OC_RSRVD_HOSTING_PORT) - 1); - err = err | cbor_encode_uint(&policyMap, resource->port); - } - } - - err = err | cbor_encoder_close_container(&linkMap, &policyMap); - } - // Close - err = err | cbor_encoder_close_container(&linkArray, &linkMap); - } - err = err | cbor_encoder_close_container(&map, &linkArray); + err |= cbor_encode_text_string(&policyMap, OC_RSRVD_TLS_PORT, + sizeof(OC_RSRVD_TLS_PORT) - 1); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding tcp secure port tag"); + err |= cbor_encode_uint(&policyMap, resource->tcpPort); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding tcp secure port value"); } - err = err | cbor_encoder_close_container(&rootArray, &map); - } - // Close main array - err = err | cbor_encoder_close_container(&encoder, &rootArray); - } - - return checkError(err, &encoder, outPayload, size); -cbor_error: - OICFree(outPayload); - return OC_STACK_ERROR; -} - -static int64_t OCConvertDevicePayload(OCDevicePayload* payload, uint8_t* outPayload, - size_t* size) -{ - CborEncoder encoder = {0}; - int64_t err = 0; - - cbor_encoder_init(&encoder, outPayload, *size, 0); - CborEncoder rootArray; - err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); - - { - CborEncoder map; - err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); - // uri - err = err | ConditionalAddTextStringToMap(&map, OC_RSRVD_HREF, sizeof(OC_RSRVD_HREF) - 1, - payload->uri); - - // 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); - - // Device ID - err = err | cbor_encode_text_string(&repMap, OC_RSRVD_DEVICE_ID, - sizeof(OC_RSRVD_DEVICE_ID) - 1); - err = err | cbor_encode_byte_string(&repMap, payload->sid, UUID_SIZE); - - // Device Name - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_DEVICE_NAME, - sizeof(OC_RSRVD_DEVICE_NAME) - 1, - payload->deviceName); - - // Device Spec Version - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SPEC_VERSION, - sizeof(OC_RSRVD_SPEC_VERSION) - 1, - payload->specVersion); - - // Device data Model Version - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_DATA_MODEL_VERSION, - sizeof(OC_RSRVD_DATA_MODEL_VERSION) - 1, - payload->dataModelVersion); - - err = err | cbor_encoder_close_container(&map, &repMap); - } - - // Close Map - err = err | cbor_encoder_close_container(&rootArray, &map); - } - - // Close main array - err = err | cbor_encoder_close_container(&encoder, &rootArray); - - return checkError(err, &encoder, outPayload, size); -} - -static int64_t OCConvertPlatformPayload(OCPlatformPayload* payload, uint8_t* outPayload, - size_t* size) -{ - CborEncoder encoder = {0}; - int64_t err = 0; - - cbor_encoder_init(&encoder, outPayload, *size, 0); - CborEncoder rootArray; - err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); - { - CborEncoder map; - err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); + // tcp + else +#endif + { + err |= cbor_encode_text_string(&policyMap, OC_RSRVD_TCP_PORT, + sizeof(OC_RSRVD_TCP_PORT) - 1); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding tcp port tag"); + err |= cbor_encode_uint(&policyMap, resource->tcpPort); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding tcp port value"); + } +#endif - // uri - err = err | ConditionalAddTextStringToMap(&map, OC_RSRVD_HREF, sizeof(OC_RSRVD_HREF) - 1, - payload->uri); + err |= cbor_encoder_close_container(&linkMap, &policyMap); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing policy map"); - // 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); - - // Platform ID - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_PLATFORM_ID, - sizeof(OC_RSRVD_PLATFORM_ID) - 1, - payload->info.platformID); - - // MFG Name - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_NAME, - sizeof(OC_RSRVD_MFG_NAME) - 1, - payload->info.manufacturerName); - - // MFG Url - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_URL, - sizeof(OC_RSRVD_MFG_URL) - 1, - payload->info.manufacturerUrl); - - // Model Num - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MODEL_NUM, - sizeof(OC_RSRVD_MODEL_NUM) - 1, - payload->info.modelNumber); - - // Date of Mfg - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_DATE, - sizeof(OC_RSRVD_MFG_DATE) - 1, - payload->info.dateOfManufacture); - - // Platform Version - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_PLATFORM_VERSION, - sizeof(OC_RSRVD_PLATFORM_VERSION) - 1, - payload->info.platformVersion); - - // OS Version - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_OS_VERSION, - sizeof(OC_RSRVD_OS_VERSION) - 1, - payload->info.operatingSystemVersion); - - // Hardware Version - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_HARDWARE_VERSION, - sizeof(OC_RSRVD_HARDWARE_VERSION) - 1, - payload->info.hardwareVersion); - - // Firmware Version - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_FIRMWARE_VERSION, - sizeof(OC_RSRVD_FIRMWARE_VERSION) - 1, - payload->info.firmwareVersion); - - // Support URL - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SUPPORT_URL, - sizeof(OC_RSRVD_SUPPORT_URL) - 1, - payload->info.supportUrl); - - // System Time - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SYSTEM_TIME, - sizeof(OC_RSRVD_SYSTEM_TIME) - 1, - payload->info.systemTime); - err = err | cbor_encoder_close_container(&map, &repMap); + // Finsihed encoding a resource, close the map. + err |= cbor_encoder_close_container(&linkArray, &linkMap); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing link map"); } + // Close links array inside the root map. + err |= cbor_encoder_close_container(&rootMap, &linkArray); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing link array"); + // close root map inside the root array. + err |= cbor_encoder_close_container(&rootArray, &rootMap); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing root map"); - // Close Map - err = err | cbor_encoder_close_container(&rootArray, &map); + payload = payload->next; } - // Close main array - err = err | cbor_encoder_close_container(&encoder, &rootArray); + // Close the final root array. + err |= cbor_encoder_close_container(&encoder, &rootArray); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing root array"); +exit: return checkError(err, &encoder, outPayload, size); } -static int64_t OCConvertArrayItem(CborEncoder* array, const OCRepPayloadValueArray* valArray, +static int64_t OCConvertArrayItem(CborEncoder *array, const OCRepPayloadValueArray *valArray, size_t index) { - int64_t err = 0; + int64_t err = CborNoError; switch (valArray->type) { case OCREP_PROP_NULL: - OC_LOG(ERROR, TAG, "ConvertArray Invalid NULL"); + OIC_LOG(ERROR, TAG, "ConvertArray Invalid NULL"); err = CborUnknownError; break; case OCREP_PROP_INT: - err = err | cbor_encode_int(array, valArray->iArray[index]); + if (valArray->iArray != 0) + { + err |= cbor_encode_int(array, valArray->iArray[index]); + } break; case OCREP_PROP_DOUBLE: - err = err | cbor_encode_double(array, valArray->dArray[index]); + if (valArray->dArray != 0) + { + err |= cbor_encode_double(array, valArray->dArray[index]); + } break; case OCREP_PROP_BOOL: - err = err | cbor_encode_boolean(array, valArray->bArray[index]); - break; - case OCREP_PROP_STRING: - if (!valArray->strArray[index]) + if (valArray->bArray != 0) { - err = err | cbor_encode_null(array); + err |= cbor_encode_boolean(array, valArray->bArray[index]); } - else + break; + case OCREP_PROP_STRING: + if (valArray->strArray != 0) { - err = err | cbor_encode_text_string(array, valArray->strArray[index], - strlen(valArray->strArray[index])); + err |= (!valArray->strArray[index]) ? cbor_encode_null(array) : cbor_encode_text_string(array, + valArray->strArray[index], strlen(valArray->strArray[index])); } break; case OCREP_PROP_BYTE_STRING: - if (!valArray->strArray[index]) - { - err = err | cbor_encode_null(array); - } - else - { - err = err | cbor_encode_byte_string(array, valArray->ocByteStrArray[index].bytes, - valArray->ocByteStrArray[index].len); - } + err |= (!valArray->ocByteStrArray[index].len) ? cbor_encode_null(array) : cbor_encode_byte_string(array, + valArray->ocByteStrArray[index].bytes, valArray->ocByteStrArray[index].len); break; case OCREP_PROP_OBJECT: - if (!valArray->objArray[index]) + if (valArray->objArray != 0) { - err = err | cbor_encode_null(array); - } - else - { - err = OCConvertSingleRepPayload(array, valArray->objArray[index]); + err |= (!valArray->objArray[index]) ? cbor_encode_null(array): OCConvertRepMap(array, + valArray->objArray[index]); } break; case OCREP_PROP_ARRAY: - OC_LOG(ERROR, TAG, "ConvertArray Invalid child array"); + OIC_LOG(ERROR, TAG, "ConvertArray Invalid child array"); err = CborUnknownError; break; } return err; } -static int64_t OCConvertArray(CborEncoder* parent, const OCRepPayloadValueArray* valArray) + +static int64_t OCConvertArray(CborEncoder *parent, const OCRepPayloadValueArray *valArray) { + int64_t err = CborNoError; CborEncoder array; - int64_t err = 0; - - err = err | cbor_encoder_create_array(parent, &array, valArray->dimensions[0]); - - for (size_t i = 0; i < valArray->dimensions[0];++i) + err |= cbor_encoder_create_array(parent, &array, valArray->dimensions[0]); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array"); + // empty array + if (valArray->dimensions[0] == 0) + { + err |= OCConvertArrayItem(&array, valArray, 0); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array value"); + } + else { - if (valArray->dimensions[1] != 0) + for (size_t i = 0; i < valArray->dimensions[0]; ++i) { - CborEncoder array2; - err = err | cbor_encoder_create_array(&array, &array2, valArray->dimensions[1]); - - for (size_t j = 0; j < valArray->dimensions[1]; ++j) + if (0 != valArray->dimensions[1]) { - if (valArray->dimensions[2] != 0) + CborEncoder array2; + err |= cbor_encoder_create_array(&array, &array2, valArray->dimensions[1]); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array2"); + + for (size_t j = 0; j < valArray->dimensions[1]; ++j) { - CborEncoder array3; - err = err | cbor_encoder_create_array(&array2, &array3, - valArray->dimensions[2]); + if (0 != valArray->dimensions[2]) + { + CborEncoder array3; + err |= cbor_encoder_create_array(&array2, &array3, valArray->dimensions[2]); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array3"); - for(size_t k = 0; k < valArray->dimensions[2]; ++k) + for(size_t k = 0; k < valArray->dimensions[2]; ++k) + { + err |= OCConvertArrayItem(&array3, valArray, + j * valArray->dimensions[2] + + i * valArray->dimensions[2] * valArray->dimensions[1] + + k); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array3 value"); + } + err |= cbor_encoder_close_container(&array2, &array3); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep array3"); + } + else { - OCConvertArrayItem(&array3, valArray, - j * valArray->dimensions[2] + - i * valArray->dimensions[2] * valArray->dimensions[1] + - k); + err |= OCConvertArrayItem(&array2, valArray, i * valArray->dimensions[1] + j); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array2 value"); } - err = err | cbor_encoder_close_container(&array2, &array3); - } - else - { - OCConvertArrayItem(&array2, valArray, - i * valArray->dimensions[1] + j); } + err |= cbor_encoder_close_container(&array, &array2); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep array2"); + } + else + { + err |= OCConvertArrayItem(&array, valArray, i); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array value"); } - err = err | cbor_encoder_close_container(&array, &array2); - } - else - { - OCConvertArrayItem(&array, valArray, i); } } - err = err | cbor_encoder_close_container(parent, &array); + err |= cbor_encoder_close_container(parent, &array); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep array"); + +exit: return err; } -static int64_t OCConvertSingleRepPayload(CborEncoder* parent, const OCRepPayload* payload) +static int64_t OCConvertRepMap(CborEncoder *map, 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); + int64_t err = CborNoError; + CborEncoder repMap; + err |= cbor_encoder_create_map(map, &repMap, CborIndefiniteLength); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep map"); + err |= OCConvertSingleRepPayload(&repMap, payload); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed converting single rep payload"); + err |= cbor_encoder_close_container(map, &repMap); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep map"); +exit: + return err; +} - // Prop Map - // resource types, interfaces - if(payload->types || payload->interfaces) +static int64_t OCConvertSingleRepPayload(CborEncoder *repMap, const OCRepPayload *payload) +{ + int64_t err = CborNoError; + OCRepPayloadValue *value = payload->values; + while (value) { - 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, 2); + err |= cbor_encode_text_string(repMap, value->name, strlen(value->name)); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding tag name"); - if (payload->types) + switch (value->type) { - 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; - } + 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; } - 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); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding single rep value"); + value = value->next; } - // Close Map - err = err | cbor_encoder_close_container(parent, &map); - +exit: return err; } -static int64_t OCConvertRepPayload(OCRepPayload* payload, uint8_t* outPayload, size_t* size) +static int64_t OCConvertRepPayload(OCRepPayload *payload, uint8_t *outPayload, size_t *size) { - CborEncoder encoder = {0}; - int64_t err = 0; + CborEncoder encoder; + int64_t err = CborNoError; cbor_encoder_init(&encoder, outPayload, *size, 0); + + size_t arrayCount = 0; + for (OCRepPayload *temp = payload; temp; temp = temp->next) + { + arrayCount++; + } CborEncoder rootArray; - err = err | cbor_encoder_create_array(&encoder, &rootArray, CborIndefiniteLength); + if (arrayCount > 1) + { + err |= cbor_encoder_create_array(&encoder, &rootArray, arrayCount); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep root map"); + } - while(payload != NULL && (err == 0 || err == CborErrorOutOfMemory)) + while (payload != NULL && (err == CborNoError)) { - err = err | OCConvertSingleRepPayload(&rootArray, payload); + CborEncoder rootMap; + err |= cbor_encoder_create_map(((arrayCount == 1)? &encoder: &rootArray), + &rootMap, CborIndefiniteLength); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating root map"); + + // Only in case of collection href is included. + if (arrayCount > 1 && payload->uri && strlen(payload->uri) > 0) + { + OIC_LOG(INFO, TAG, "Payload has uri"); + err |= cbor_encode_text_string(&rootMap, OC_RSRVD_HREF, strlen(OC_RSRVD_HREF)); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep href tag"); + err |= cbor_encode_text_string(&rootMap, payload->uri, strlen(payload->uri)); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep href value"); + } + if (payload->types) + { + OIC_LOG(INFO, TAG, "Payload has types"); + err |= OCStringLLJoin(&rootMap, OC_RSRVD_RESOURCE_TYPE, payload->types); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resource type."); + } + if (payload->interfaces) + { + OIC_LOG(INFO, TAG, "Payload has interfaces"); + err |= OCStringLLJoin(&rootMap, OC_RSRVD_INTERFACE, payload->interfaces); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform interface type."); + } + + err |= OCConvertSingleRepPayload(&rootMap, payload); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting rep payload"); + + // Close main array + err |= cbor_encoder_close_container(((arrayCount == 1) ? &encoder: &rootArray), + &rootMap); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing root map"); payload = payload->next; } + if (arrayCount > 1) + { + err |= cbor_encoder_close_container(&encoder, &rootArray); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing root array"); + } - // Close main array - err = err | cbor_encoder_close_container(&encoder, &rootArray); - +exit: return checkError(err, &encoder, outPayload, size); } -static int64_t OCConvertPresencePayload(OCPresencePayload* payload, - uint8_t* outPayload, size_t* size) +#ifdef WITH_PRESENCE +static int64_t OCConvertPresencePayload(OCPresencePayload *payload, uint8_t *outPayload, + size_t *size) { - CborEncoder encoder = {0}; - int64_t err = 0; + int64_t err = CborNoError; + CborEncoder encoder; cbor_encoder_init(&encoder, outPayload, *size, 0); - CborEncoder rootArray; - - err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); - CborEncoder map; - err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); + err |= cbor_encoder_create_map(&encoder, &map, CborIndefiniteLength); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating presence map"); // Sequence Number - err = err | cbor_encode_text_string(&map, - OC_RSRVD_NONCE, - sizeof(OC_RSRVD_NONCE) - 1); - err = err | cbor_encode_uint(&map, payload->sequenceNumber); + err |= cbor_encode_text_string(&map, OC_RSRVD_NONCE, sizeof(OC_RSRVD_NONCE) - 1); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding nonce tag to presence map"); + err |= cbor_encode_uint(&map, payload->sequenceNumber); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding nonce value to presence map"); // Max Age - err = err | cbor_encode_text_string(&map, - OC_RSRVD_TTL, - sizeof(OC_RSRVD_TTL) - 1); - err = err | cbor_encode_uint(&map, payload->maxAge); + err |= cbor_encode_text_string(&map, OC_RSRVD_TTL, sizeof(OC_RSRVD_TTL) - 1); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding ttl tag to presence map"); + err |= cbor_encode_uint(&map, payload->maxAge); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding ttl value to presence map"); // Trigger - const char* triggerStr = convertTriggerEnumToString(payload->trigger); - err = err | AddTextStringToMap(&map, OC_RSRVD_TRIGGER, sizeof(OC_RSRVD_TRIGGER) - 1, - triggerStr); + err |= cbor_encode_text_string(&map, OC_RSRVD_TRIGGER, sizeof(OC_RSRVD_TRIGGER) - 1); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding trigger tag to presence map"); + err |= cbor_encode_simple_value(&map, payload->trigger); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding trigger value to presence map"); // Resource type name - if(payload->trigger != OC_PRESENCE_TRIGGER_DELETE) + if (payload->trigger != OC_PRESENCE_TRIGGER_DELETE) { - err = err | ConditionalAddTextStringToMap(&map, OC_RSRVD_RESOURCE_TYPE, + err |= ConditionalAddTextStringToMap(&map, OC_RSRVD_RESOURCE_TYPE, sizeof(OC_RSRVD_RESOURCE_TYPE) - 1, payload->resourceType); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resource type to presence map"); } // Close Map - err = err | cbor_encoder_close_container(&rootArray, &map); - err = err | cbor_encoder_close_container(&encoder, &rootArray); + err |= cbor_encoder_close_container(&encoder, &map); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing presence map"); +exit: return checkError(err, &encoder, outPayload, size); } +#endif // WITH_PRESENCE static int64_t AddTextStringToMap(CborEncoder* map, const char* key, size_t keylen, const char* value) { - return cbor_encode_text_string(map, key, keylen) | - cbor_encode_text_string(map, value, strlen(value)); + int64_t err = cbor_encode_text_string(map, key, keylen); + if (CborNoError != err) + { + return err; + } + return cbor_encode_text_string(map, value, strlen(value)); } static int64_t ConditionalAddTextStringToMap(CborEncoder* map, const char* key, size_t keylen,