X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsrc%2Focpayloadconvert.c;h=daa9003d988f091d1dc3adcb3f70074744775478;hb=7f00f942c39b7bc27c7eeecf213a239c3fe4173c;hp=49f31e734507181aa17bf2bec33aa6df719f82b5;hpb=f3b3b46cfc7ab430320433d27048dace37902a06;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 49f31e7..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 @@ -79,9 +80,20 @@ OCStackResult OCConvertPayload(OCPayload* payload, uint8_t** outPayload, size_t* VERIFY_PARAM_NON_NULL(TAG, size, "size parameter is NULL"); OIC_LOG_V(INFO, TAG, "Converting payload of type %d", payload->type); - - out = (uint8_t *)OICCalloc(1, curSize); - VERIFY_PARAM_NON_NULL(TAG, out, "Failed to allocate payload"); + if (PAYLOAD_TYPE_SECURITY == payload->type) + { + 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 (out == NULL) + { + out = (uint8_t *)OICCalloc(1, curSize); + VERIFY_PARAM_NON_NULL(TAG, out, "Failed to allocate payload"); + } err = OCConvertPayloadHelper(payload, out, &curSize); ret = OC_STACK_NO_MEMORY; @@ -90,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); } @@ -103,7 +117,7 @@ OCStackResult OCConvertPayload(OCPayload* payload, uint8_t** outPayload, size_t* if (err == CborNoError) { - if (curSize < INIT_SIZE) + if (curSize < INIT_SIZE && PAYLOAD_TYPE_SECURITY != payload->type) { uint8_t *out2 = (uint8_t *)OICRealloc(out, curSize); VERIFY_PARAM_NON_NULL(TAG, out2, "Failed to increase payload size"); @@ -112,7 +126,8 @@ OCStackResult OCConvertPayload(OCPayload* payload, uint8_t** outPayload, size_t* *size = curSize; *outPayload = out; - OIC_LOG_V(DEBUG, TAG, "Payload Size: %zd Payload : %s \n", *size, *outPayload); + OIC_LOG_V(DEBUG, TAG, "Payload Size: %zd Payload : ", *size); + OIC_LOG_BUFFER(DEBUG, TAG, *outPayload, *size); return OC_STACK_OK; } @@ -130,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; @@ -152,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) @@ -162,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; } } @@ -170,116 +181,121 @@ static int64_t checkError(int64_t err, CborEncoder* encoder, uint8_t* outPayload static int64_t OCConvertSecurityPayload(OCSecurityPayload* payload, uint8_t* outPayload, size_t* size) { - CborEncoder encoder; - cbor_encoder_init(&encoder, outPayload, *size, 0); + memcpy(outPayload, payload->securityData, payload->payloadSize); + *size = payload->payloadSize; - CborEncoder map; - int64_t err = cbor_encoder_create_map(&encoder, &map, CborIndefiniteLength); - VERIFY_CBOR_SUCCESS(TAG, err, "Creating security map"); - - if (payload->securityData) - { - err |= cbor_encode_text_string(&map, payload->securityData, - strlen(payload->securityData)); - VERIFY_CBOR_SUCCESS(TAG, err, "Retrieving security data"); - } - - err |= cbor_encoder_close_container(&encoder, &map); - VERIFY_CBOR_SUCCESS(TAG, err, "closing security map"); -exit: - 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) + 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 - 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); 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 |= cbor_encode_text_string(&rootMap, OC_RSRVD_DEVICE_ID, sizeof(OC_RSRVD_DEVICE_ID) - 1); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting tag device id"); - err |= cbor_encode_byte_string(&rootMap, payload->sid, UUID_SIZE); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting value of device id"); + 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) + { + 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); @@ -298,58 +314,73 @@ static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload *payload, uint8_t *o // Resource Type if (resource->types) { - err |= cbor_encode_text_string(&linkMap, OC_RSRVD_RESOURCE_TYPE, - sizeof(OC_RSRVD_RESOURCE_TYPE) - 1); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resource types tag to links map"); - char *joinedTypes = OCStringLLJoin(resource->types); - VERIFY_PARAM_NON_NULL(TAG, joinedTypes, "Failed creating joined string"); - err |= cbor_encode_text_string(&linkMap, joinedTypes, strlen(joinedTypes)); - OICFree(joinedTypes); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resource types value to links map"); + err |= OCStringLLJoin(&linkMap, OC_RSRVD_RESOURCE_TYPE, resource->types); + VERIFY_CBOR_SUCCESS(TAG, err, + "Failed adding resourceType tag/value to links map"); } // Interface Types if (resource->interfaces) { - err |= cbor_encode_text_string(&linkMap, OC_RSRVD_INTERFACE, - sizeof(OC_RSRVD_INTERFACE) - 1); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding interfaces tag to links map"); - char* joinedInterfaces = OCStringLLJoin(resource->interfaces); - VERIFY_PARAM_NON_NULL(TAG, joinedInterfaces, "Failed creating joined string"); - err |= cbor_encode_text_string(&linkMap, joinedInterfaces, strlen(joinedInterfaces)); - OICFree(joinedInterfaces); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding interfaces value to links map"); + err |= OCStringLLJoin(&linkMap, OC_RSRVD_INTERFACE, resource->interfaces); + 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 +#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); VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing policy map"); @@ -363,124 +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) -{ - 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"); - - // Device ID - err |= cbor_encode_text_string(&repMap, OC_RSRVD_DEVICE_ID, sizeof(OC_RSRVD_DEVICE_ID) - 1); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding device id tag"); - err |= cbor_encode_byte_string(&repMap, payload->sid, UUID_SIZE); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding data 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"); + 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); @@ -497,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]) + if (valArray->objArray != 0) { - err |= cbor_encode_null(array); - } - else - { - err |= OCConvertRepMap(array, valArray->objArray[index]); + err |= (!valArray->objArray[index]) ? cbor_encode_null(array): OCConvertRepMap(array, + valArray->objArray[index]); } break; case OCREP_PROP_ARRAY: @@ -552,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); @@ -701,26 +624,14 @@ static int64_t OCConvertRepPayload(OCRepPayload *payload, uint8_t *outPayload, s if (payload->types) { OIC_LOG(INFO, TAG, "Payload has types"); - err |= cbor_encode_text_string(&rootMap, OC_RSRVD_RESOURCE_TYPE, - sizeof(OC_RSRVD_RESOURCE_TYPE) - 1); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep resource type tag"); - char* joinedTypes = OCStringLLJoin(payload->types); - VERIFY_PARAM_NON_NULL(TAG, joinedTypes, "Failed creating joined string"); - err |= cbor_encode_text_string(&rootMap, joinedTypes, strlen(joinedTypes)); - OICFree(joinedTypes); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep resource type value"); + 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 |= cbor_encode_text_string(&rootMap, OC_RSRVD_INTERFACE, - sizeof(OC_RSRVD_INTERFACE) - 1); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep interface tag"); - char* joinedInterfaces = OCStringLLJoin(payload->interfaces); - VERIFY_PARAM_NON_NULL(TAG, joinedInterfaces, "Failed creating joined string"); - err |= cbor_encode_text_string(&rootMap, joinedInterfaces, strlen(joinedInterfaces)); - OICFree(joinedInterfaces); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep interface value"); + err |= OCStringLLJoin(&rootMap, OC_RSRVD_INTERFACE, payload->interfaces); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform interface type."); } err |= OCConvertSingleRepPayload(&rootMap, payload); @@ -742,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) { @@ -786,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)