X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsrc%2Focpayloadconvert.c;h=daa9003d988f091d1dc3adcb3f70074744775478;hb=7f00f942c39b7bc27c7eeecf213a239c3fe4173c;hp=8099df80e4095f8a86ef02daabb55eb316c70531;hpb=2fe1c5ea6741015a119958911e34613f4852c175;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 8099df8..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,7 +32,6 @@ #include "ocrandom.h" #include "ocresourcehandler.h" #include "cbor.h" -#include "rdpayload.h" #define TAG "OIC_RI_PAYLOADCONVERT" @@ -42,14 +45,12 @@ 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 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); @@ -65,7 +66,7 @@ OCStackResult OCConvertPayload(OCPayload* payload, uint8_t** outPayload, size_t* // 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 @@ -101,12 +102,14 @@ OCStackResult OCConvertPayload(OCPayload* payload, uint8_t** outPayload, size_t* // reallocate "out" and try again! 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); } @@ -142,18 +145,14 @@ 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: OIC_LOG_V(INFO,TAG, "ConvertPayload default %d", payload->type); return CborErrorUnknownType; @@ -164,7 +163,7 @@ 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 != CborNoError) @@ -174,7 +173,7 @@ static int64_t checkError(int64_t err, CborEncoder* encoder, uint8_t* outPayload } else { - *size = encoder->ptr - outPayload; + *size = cbor_encoder_get_buffer_size(encoder, outPayload); return err; } } @@ -214,45 +213,48 @@ static int64_t OCStringLLJoin(CborEncoder *map, char *type, OCStringLL *val) } static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload *payload, uint8_t *outPayload, - size_t *size) + size_t *size) { CborEncoder encoder; int64_t err = CborNoError; cbor_encoder_init(&encoder, outPayload, *size, 0); - if (payload->resources) - { - /* - 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 - }, - . - . - . - ] - } - ] - */ - // Open the main root array - CborEncoder rootArray; - size_t resourceCount = OCDiscoveryPayloadGetResourceCount(payload); - err |= cbor_encoder_create_array(&encoder, &rootArray, 1); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating discovery root array"); + /* + 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 + ... + } + ] + */ + + // 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); @@ -269,31 +271,31 @@ static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload *payload, uint8_t *o VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting device id"); // Insert Resource Type - err |= ConditionalAddTextStringToMap(&rootMap, OC_RSRVD_RESOURCE_TYPE, - sizeof(OC_RSRVD_RESOURCE_TYPE) - 1, payload->type); + err |= OCStringLLJoin(&rootMap, OC_RSRVD_RESOURCE_TYPE, payload->type); VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting RT"); // Insert interfaces - if (payload->interface) + if (payload->iface) { - err |= OCStringLLJoin(&rootMap, OC_RSRVD_INTERFACE, payload->interface); + err |= OCStringLLJoin(&rootMap, OC_RSRVD_INTERFACE, payload->iface); VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding interface types tag/value"); } // Insert baseURI if present err |= ConditionalAddTextStringToMap(&rootMap, OC_RSRVD_BASE_URI, - sizeof(OC_RSRVD_BASE_URI) - 1, - payload->baseURI); + 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) + for (size_t i = 0; i < resourceCount; ++i) { CborEncoder linkMap; OCResourcePayload *resource = OCDiscoveryPayloadGetResource(payload, i); @@ -313,51 +315,70 @@ static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload *payload, uint8_t *o if (resource->types) { err |= OCStringLLJoin(&linkMap, OC_RSRVD_RESOURCE_TYPE, resource->types); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resourceType tag/value to links map"); + VERIFY_CBOR_SUCCESS(TAG, err, + "Failed adding resourceType tag/value to links map"); } // Interface Types if (resource->interfaces) { err |= OCStringLLJoin(&linkMap, OC_RSRVD_INTERFACE, resource->interfaces); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding interfaces tag/value to links map"); + VERIFY_CBOR_SUCCESS(TAG, err, + "Failed adding interfaces tag/value to links map"); } // Policy CborEncoder policyMap; - err |= cbor_encode_text_string(&linkMap, OC_RSRVD_POLICY, sizeof(OC_RSRVD_POLICY) - 1); + 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); + 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"); - if (resource->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, OC_RESOURCE_SECURE); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding secure value to policy map"); - } - if ((resource->secure && resource->port != 0) || payload->baseURI) + // 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) { err |= cbor_encode_text_string(&policyMap, OC_RSRVD_HOSTING_PORT, - sizeof(OC_RSRVD_HOSTING_PORT) - 1); + 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"); } #ifdef TCP_ADAPTER - 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"); +#ifdef __WITH_TLS__ + // tls + if (resource->secure) + { + 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"); + } + + // 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 err |= cbor_encoder_close_container(&linkMap, &policyMap); @@ -373,155 +394,13 @@ static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload *payload, uint8_t *o // close root map inside the root array. err |= cbor_encoder_close_container(&rootArray, &rootMap); VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing root map"); - // 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 OCConvertDevicePayload(OCDevicePayload *payload, uint8_t *outPayload, - size_t *size) -{ - if (!payload) - { - return CborUnknownError; - } - int64_t err = CborNoError; - CborEncoder encoder; - - cbor_encoder_init(&encoder, outPayload, *size, 0); - CborEncoder repMap; - err |= cbor_encoder_create_map(&encoder, &repMap, CborIndefiniteLength); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating device map"); - - // Resource Type - if (payload->types) - { - OIC_LOG(INFO, TAG, "Payload has types"); - err |= OCStringLLJoin(&repMap, OC_RSRVD_RESOURCE_TYPE, payload->types); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resource type tag/value."); - } - - if (payload->interfaces) - { - OIC_LOG(INFO, TAG, "Payload has interface"); - err |= OCStringLLJoin(&repMap, OC_RSRVD_INTERFACE, payload->interfaces); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding interface type tag/value."); - } - - // Device ID - err |= AddTextStringToMap(&repMap, OC_RSRVD_DEVICE_ID, sizeof(OC_RSRVD_DEVICE_ID) - 1 , payload->sid); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding device id"); - - // Device Name - err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_DEVICE_NAME, - sizeof(OC_RSRVD_DEVICE_NAME) - 1, payload->deviceName); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding device name"); - - // Device Spec Version - err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SPEC_VERSION, - sizeof(OC_RSRVD_SPEC_VERSION) - 1, payload->specVersion); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding data spec version"); - // Device data Model Version - err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_DATA_MODEL_VERSION, - sizeof(OC_RSRVD_DATA_MODEL_VERSION) - 1, payload->dataModelVersion); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding data model version"); - - err |= cbor_encoder_close_container(&encoder, &repMap); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing device map"); - -exit: - return checkError(err, &encoder, outPayload, size); -} - -static int64_t OCConvertPlatformPayload(OCPlatformPayload *payload, uint8_t *outPayload, - size_t *size) -{ - int64_t err = CborNoError; - CborEncoder encoder; - - cbor_encoder_init(&encoder, outPayload, *size, 0); - - CborEncoder repMap; - err |= cbor_encoder_create_map(&encoder, &repMap, CborIndefiniteLength); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating platform map"); - - // Platform ID - err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_PLATFORM_ID, - sizeof(OC_RSRVD_PLATFORM_ID) - 1, payload->info.platformID); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform id"); - - // MFG Name - err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_NAME, - sizeof(OC_RSRVD_MFG_NAME) - 1, payload->info.manufacturerName); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding mfg name"); - - // MFG Url - err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_URL, - sizeof(OC_RSRVD_MFG_URL) - 1, payload->info.manufacturerUrl); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding mfg url"); - - // Model Num - err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MODEL_NUM, - sizeof(OC_RSRVD_MODEL_NUM) -1, payload->info.modelNumber); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding model num"); - - // Date of Mfg - err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_DATE, - sizeof(OC_RSRVD_MFG_DATE) - 1, payload->info.dateOfManufacture); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding mfg date"); - - // Platform Version - err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_PLATFORM_VERSION, - sizeof(OC_RSRVD_PLATFORM_VERSION) - 1, payload->info.platformVersion); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform version"); - - // OS Version - err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_OS_VERSION, - sizeof(OC_RSRVD_OS_VERSION) - 1, payload->info.operatingSystemVersion); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding OS version"); - - // Hardware Version - err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_HARDWARE_VERSION, - sizeof(OC_RSRVD_HARDWARE_VERSION) - 1, payload->info.hardwareVersion); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding HW version"); - - // Firmware Version - err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_FIRMWARE_VERSION, - sizeof(OC_RSRVD_FIRMWARE_VERSION) - 1, payload->info.firmwareVersion); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding firmware version"); - - // Support URL - err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SUPPORT_URL, - sizeof(OC_RSRVD_SUPPORT_URL) - 1, payload->info.supportUrl); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding support url"); - - // System Time - err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SYSTEM_TIME, - sizeof(OC_RSRVD_SYSTEM_TIME) - 1, payload->info.systemTime); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding system time"); - - // Resource type - if (payload->rt) - { - err |= OCStringLLJoin(&repMap, OC_RSRVD_RESOURCE_TYPE, payload->rt); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resource type."); - } - - // Resource interfaces - if (payload->interfaces) - { - err |= OCStringLLJoin(&repMap, OC_RSRVD_INTERFACE, payload->interfaces); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform interface type."); + payload = payload->next; } - // Close Map - err |= cbor_encoder_close_container(&encoder, &repMap); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep map"); + // 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); @@ -538,44 +417,39 @@ static int64_t OCConvertArrayItem(CborEncoder *array, const OCRepPayloadValueArr err = CborUnknownError; break; case OCREP_PROP_INT: - 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 |= 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 |= cbor_encode_boolean(array, valArray->bArray[index]); - break; - case OCREP_PROP_STRING: - if (!valArray->strArray[index]) + if (valArray->bArray != 0) { - err |= cbor_encode_null(array); + err |= cbor_encode_boolean(array, valArray->bArray[index]); } - else + break; + case OCREP_PROP_STRING: + if (valArray->strArray != 0) { - 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 |= cbor_encode_null(array); - } - else - { - 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]) - { - err |= cbor_encode_null(array); - } - else + if (valArray->objArray != 0) { - err |= OCConvertRepMap(array, valArray->objArray[index]); + err |= (!valArray->objArray[index]) ? cbor_encode_null(array): OCConvertRepMap(array, + valArray->objArray[index]); } break; case OCREP_PROP_ARRAY: @@ -593,47 +467,55 @@ static int64_t OCConvertArray(CborEncoder *parent, const OCRepPayloadValueArray CborEncoder array; err |= cbor_encoder_create_array(parent, &array, valArray->dimensions[0]); VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array"); - - for (size_t i = 0; i < valArray->dimensions[0]; ++i) + // empty array + if (valArray->dimensions[0] == 0) { - if (0 != valArray->dimensions[1]) + err |= OCConvertArrayItem(&array, valArray, 0); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array value"); + } + else + { + for (size_t i = 0; i < valArray->dimensions[0]; ++i) { - 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) + if (0 != valArray->dimensions[1]) { - 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"); + CborEncoder array2; + err |= cbor_encoder_create_array(&array, &array2, valArray->dimensions[1]); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array2"); - for(size_t k = 0; k < valArray->dimensions[2]; ++k) + for (size_t j = 0; j < valArray->dimensions[1]; ++j) + { + if (0 != valArray->dimensions[2]) { - 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"); + 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) + { + 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 + { + err |= OCConvertArrayItem(&array2, valArray, i * valArray->dimensions[1] + j); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array2 value"); } - err |= cbor_encoder_close_container(&array2, &array3); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep array3"); - } - else - { - err |= OCConvertArrayItem(&array2, valArray, i * valArray->dimensions[1] + j); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array2 value"); } + 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 |= 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 |= cbor_encoder_close_container(parent, &array); @@ -771,6 +653,7 @@ exit: return checkError(err, &encoder, outPayload, size); } +#ifdef WITH_PRESENCE static int64_t OCConvertPresencePayload(OCPresencePayload *payload, uint8_t *outPayload, size_t *size) { @@ -815,6 +698,7 @@ static int64_t OCConvertPresencePayload(OCPresencePayload *payload, uint8_t *out 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)