From 69661b0c98125497ff32cf8b3b8c9c11a6b4b3c0 Mon Sep 17 00:00:00 2001 From: Mandeep Shetty Date: Mon, 14 Dec 2015 14:52:53 -0800 Subject: [PATCH] Modified discovery payload to be spec compliant. The discovery oic/res payload had the device id "di" and "links" being repeated for every resource. The payload itself was not structured in a spec compliant way. Plucked out di and links from every resource and put in the root map. The format for the payload is "modelled" as JSON. [ { "di" : UUID, links :[ { href, rt, if, policy // Resource 1 }, { href, rt, if, policy // Resource 2 }, . . . ] } ] Change-Id: I2c50a7cc1ee46df633810372e446ac92c5e496f5 Signed-off-by: Mandeep Shetty Signed-off-by: Joseph Morrow Signed-off-by: Mandeep Shetty Reviewed-on: https://gerrit.iotivity.org/gerrit/4543 Tested-by: jenkins-iotivity Reviewed-by: Markus Jung Reviewed-by: Jon A. Cruz --- resource/csdk/security/src/amsmgr.c | 4 +- resource/csdk/stack/include/octypes.h | 4 +- resource/csdk/stack/include/payload_logging.h | 5 +- .../linux/SimpleClientServer/occlientbasicops.cpp | 11 +- resource/csdk/stack/src/ocpayload.c | 8 +- resource/csdk/stack/src/ocpayloadconvert.c | 196 +++++----- resource/csdk/stack/src/ocpayloadparse.c | 406 +++++++++------------ resource/csdk/stack/src/ocresource.c | 4 + resource/include/OCSerialization.h | 2 +- .../unittests/OCRepresentationEncodingTest.cpp | 16 +- 10 files changed, 317 insertions(+), 339 deletions(-) diff --git a/resource/csdk/security/src/amsmgr.c b/resource/csdk/security/src/amsmgr.c index 8779b0b..5ec9fb4 100644 --- a/resource/csdk/security/src/amsmgr.c +++ b/resource/csdk/security/src/amsmgr.c @@ -202,7 +202,9 @@ static OCStackApplicationResult SecurePortDiscoveryCallback(void *ctx, OCDoHandl //Verifying if the ID of the sender is an AMS service that this device trusts. if(resPayload && - memcmp(context->amsMgrContext->amsDeviceId.id, resPayload->sid, + memcmp(context->amsMgrContext->amsDeviceId.id, + ((OCDiscoveryPayload*)clientResponse->payload)->sid, + // resPayload->sid, sizeof(context->amsMgrContext->amsDeviceId.id)) != 0) { OC_LOG_V(ERROR, TAG, "%s Invalid AMS device", __func__); diff --git a/resource/csdk/stack/include/octypes.h b/resource/csdk/stack/include/octypes.h index 9ac1b27..0507db6 100644 --- a/resource/csdk/stack/include/octypes.h +++ b/resource/csdk/stack/include/octypes.h @@ -1023,7 +1023,6 @@ typedef struct OCRepPayload typedef struct OCResourcePayload { char* uri; - uint8_t* sid; OCStringLL* types; OCStringLL* interfaces; uint8_t bitmap; @@ -1117,6 +1116,9 @@ typedef struct OCResourceCollectionPayload typedef struct { OCPayload base; + + uint8_t* sid; + /** This structure holds the old /oic/res response. */ OCResourcePayload *resources; /** This structure holds the collection response for the /oic/res. */ diff --git a/resource/csdk/stack/include/payload_logging.h b/resource/csdk/stack/include/payload_logging.h index 4531fdc..bb9e943 100644 --- a/resource/csdk/stack/include/payload_logging.h +++ b/resource/csdk/stack/include/payload_logging.h @@ -170,15 +170,14 @@ static inline void OCPayloadLogDiscovery(LogLevel level, OCDiscoveryPayload* pay OC_LOG(level, PL_TAG, "\tNO Resources"); return; } - + OC_LOG(level, PL_TAG, "\tSID:"); + OC_LOG_BUFFER(level, PL_TAG, payload->sid, UUID_SIZE); OCResourcePayload* res = payload->resources; while(res) { OC_LOG_V(level, PL_TAG, "\tResource #%d", i); OC_LOG_V(level, PL_TAG, "\tURI:%s", res->uri); - OC_LOG(level, PL_TAG, "\tSID:"); - OC_LOG_BUFFER(level, PL_TAG, res->sid, UUID_SIZE); OC_LOG(level, PL_TAG, "\tResource Types:"); OCStringLL* strll = res->types; while(strll) diff --git a/resource/csdk/stack/samples/linux/SimpleClientServer/occlientbasicops.cpp b/resource/csdk/stack/samples/linux/SimpleClientServer/occlientbasicops.cpp index bf9452f..419593a 100644 --- a/resource/csdk/stack/samples/linux/SimpleClientServer/occlientbasicops.cpp +++ b/resource/csdk/stack/samples/linux/SimpleClientServer/occlientbasicops.cpp @@ -393,7 +393,8 @@ void queryResource() void collectUniqueResource(const OCClientResponse * clientResponse) { - OCResourcePayload* res = ((OCDiscoveryPayload*)clientResponse->payload)->resources; + OCDiscoveryPayload* pay = (OCDiscoveryPayload*) clientResponse->payload; + OCResourcePayload* res = pay->resources; // Including the NUL terminator, length of UUID string of the form: // "a62389f7-afde-00b6-cd3e-12b97d2fcf09" @@ -405,10 +406,10 @@ void collectUniqueResource(const OCClientResponse * clientResponse) int ret = snprintf(sidStr, UUID_LENGTH, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", - res->sid[0], res->sid[1], res->sid[2], res->sid[3], - res->sid[4], res->sid[5], res->sid[6], res->sid[7], - res->sid[8], res->sid[9], res->sid[10], res->sid[11], - res->sid[12], res->sid[13], res->sid[14], res->sid[15] + pay->sid[0], pay->sid[1], pay->sid[2], pay->sid[3], + pay->sid[4], pay->sid[5], pay->sid[6], pay->sid[7], + pay->sid[8], pay->sid[9], pay->sid[10], pay->sid[11], + pay->sid[12], pay->sid[13], pay->sid[14], pay->sid[15] ); if (ret == UUID_LENGTH - 1) diff --git a/resource/csdk/stack/src/ocpayload.c b/resource/csdk/stack/src/ocpayload.c index 96c1d5f..485eda3 100755 --- a/resource/csdk/stack/src/ocpayload.c +++ b/resource/csdk/stack/src/ocpayload.c @@ -1353,13 +1353,12 @@ static OCResourcePayload* OCCopyResource(const OCResource* res, uint16_t port) } pl->uri = OICStrdup(res->uri); - pl->sid = (uint8_t*)OICCalloc(1, UUID_SIZE); - if(!pl->uri || ! pl->sid) + + if(!pl->uri) { FreeOCDiscoveryResource(pl); return NULL; } - memcpy(pl->sid, OCGetServerInstanceID(), UUID_SIZE); // types OCResourceType* typePtr = res->rsrcType; @@ -1574,7 +1573,6 @@ static void FreeOCDiscoveryResource(OCResourcePayload* payload) } OICFree(payload->uri); - OICFree(payload->sid); OCFreeOCStringLL(payload->types); OCFreeOCStringLL(payload->interfaces); FreeOCDiscoveryResource(payload->next); @@ -1587,7 +1585,7 @@ void OCDiscoveryPayloadDestroy(OCDiscoveryPayload* payload) { return; } - + OICFree(payload->sid); FreeOCDiscoveryResource(payload->resources); OICFree(payload); } diff --git a/resource/csdk/stack/src/ocpayloadconvert.c b/resource/csdk/stack/src/ocpayloadconvert.c index e5ae680..a68ce86 100644 --- a/resource/csdk/stack/src/ocpayloadconvert.c +++ b/resource/csdk/stack/src/ocpayloadconvert.c @@ -282,12 +282,50 @@ static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload* payload, uint8_t* o } else 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 + }, + . + . + . + ] + } + ] + */ + CborEncoder rootMap = {}; size_t resourceCount = OCDiscoveryPayloadGetResourceCount(payload); - err = err | cbor_encoder_create_array(&encoder, &rootArray, resourceCount); + + // Open the main root array + err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); + + // Open the root map in the root array + err = err | cbor_encoder_create_map(&rootArray, &rootMap, DISCOVERY_CBOR_RES_MAP_LEN); + + // Insert Device ID into the root map + err = err | cbor_encode_text_string(&rootMap, OC_RSRVD_DEVICE_ID, + sizeof(OC_RSRVD_DEVICE_ID) - 1); + err = err | cbor_encode_byte_string(&rootMap, payload->sid, UUID_SIZE); + + + // Insert Links into the root map. + CborEncoder linkArray = {}; + err = err | cbor_encode_text_string(&rootMap, OC_RSRVD_LINKS, + sizeof(OC_RSRVD_LINKS) - 1); + err = err | cbor_encoder_create_array(&rootMap, &linkArray, resourceCount); for(size_t i = 0; i < resourceCount; ++i) { - CborEncoder map; + CborEncoder resourceMapElement = {}; OCResourcePayload* resource = OCDiscoveryPayloadGetResource(payload, i); if(!resource) { @@ -295,97 +333,85 @@ static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload* payload, uint8_t* o return OC_STACK_INVALID_PARAM; } - err = err | cbor_encoder_create_map(&rootArray, &map, DISCOVERY_CBOR_RES_MAP_LEN); + // resource map inside the links array. + err = err | cbor_encoder_create_map(&linkArray, &resourceMapElement, + DISCOVERY_CBOR_LINKS_MAP_LEN); + + // Below are insertions of the resource properties into the map. + // Uri + err = err | AddTextStringToMap(&resourceMapElement, 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(&resourceMapElement, OC_RSRVD_RESOURCE_TYPE, + sizeof(OC_RSRVD_RESOURCE_TYPE) - 1); + err = err | cbor_encode_text_string(&resourceMapElement, 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(&resourceMapElement, OC_RSRVD_INTERFACE, + sizeof(OC_RSRVD_INTERFACE) - 1); + err = err | cbor_encode_text_string(&resourceMapElement, joinedInterfaces, + strlen(joinedInterfaces)); + OICFree(joinedInterfaces); + } + else + { + return OC_STACK_NO_MEMORY; + } + } + + // Policy + CborEncoder policyMap; + err = err | cbor_encode_text_string(&resourceMapElement, OC_RSRVD_POLICY, + sizeof(OC_RSRVD_POLICY) - 1); + err = err | cbor_encoder_create_map(&resourceMapElement, &policyMap, CborIndefiniteLength); - // 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); + // 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) { - 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); + err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_SECURE, + sizeof(OC_RSRVD_SECURE) - 1); + err = err | cbor_encode_boolean(&policyMap, OC_RESOURCE_SECURE); - // Link Map + if(resource->port != 0) { - 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_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(&map, &linkArray); } - err = err | cbor_encoder_close_container(&rootArray, &map); + + err = err | cbor_encoder_close_container(&resourceMapElement, &policyMap); + + // Finsihed encoding a resource, close the map. + err = err | cbor_encoder_close_container(&linkArray, &resourceMapElement); } - // Close main array + // Close links array inside the root map. + err = err | cbor_encoder_close_container(&rootMap, &linkArray); + // close root map inside the root array. + err = err | cbor_encoder_close_container(&rootArray, &rootMap); + // Close the final root array. err = err | cbor_encoder_close_container(&encoder, &rootArray); } diff --git a/resource/csdk/stack/src/ocpayloadparse.c b/resource/csdk/stack/src/ocpayloadparse.c index c114efe..1131d7d 100644 --- a/resource/csdk/stack/src/ocpayloadparse.c +++ b/resource/csdk/stack/src/ocpayloadparse.c @@ -160,6 +160,8 @@ static OCStackResult OCParseDiscoveryPayload(OCPayload** outPayload, CborValue* bool err = false; OCResourcePayload* resource = NULL; + uint16_t resourceCount = 0; + CborValue resourceMap = {}; OCDiscoveryPayload* out = OCDiscoveryPayloadCreate(); if(!out) @@ -167,275 +169,219 @@ static OCStackResult OCParseDiscoveryPayload(OCPayload** outPayload, CborValue* return OC_STACK_NO_MEMORY; } - CborValue arrayVal; - err = err || cbor_value_enter_container(rootValue, &arrayVal); + // Root value is already inside the main root array + CborValue rootMap = {}; - if (cbor_value_is_array(&arrayVal)) + // Enter the main root map + err = err || cbor_value_enter_container(rootValue, &rootMap); + // Look for DI + CborValue curVal = {}; + err = cbor_value_map_find_value(&rootMap, OC_RSRVD_DEVICE_ID, &curVal); + if (CborNoError != err) { - OCLinksPayload *linksPayload = NULL; - OCTagsPayload *tagsPayload = NULL; - while (cbor_value_is_container(&arrayVal)) - { - linksPayload = NULL; - tagsPayload = NULL; - CborValue colResources; - CborError cborFindResult = cbor_value_enter_container(&arrayVal, &colResources); - if (CborNoError != cborFindResult) - { - goto cbor_error; - } + OC_LOG(ERROR, TAG, "Cbor find value failed."); + goto malformed_cbor; + } + size_t len; + err = cbor_value_dup_byte_string(&curVal, &(out->sid), &len, NULL); - if (OC_STACK_OK != OCTagsCborToPayload(&colResources, &tagsPayload)) - { - OC_LOG(ERROR, TAG, "Tags cbor parsing failed."); - OCFreeTagsResource(tagsPayload); - goto cbor_error; - } + // Look for Links which will have an array as the value + err = cbor_value_map_find_value(&rootMap, OC_RSRVD_LINKS, &curVal); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor find value failed."); + goto malformed_cbor; + } - if (OC_STACK_OK != OCLinksCborToPayload(&colResources, &linksPayload)) - { - OC_LOG(ERROR, TAG, "Links cbor parsing failed."); - OCFreeTagsResource(tagsPayload); - OCFreeLinksResource(linksPayload); - goto cbor_error; - } + // Enter the links array and start iterating through the array processing + // each resource which shows up as a map. + err = err || cbor_value_enter_container(&curVal, &resourceMap); - if (OC_STACK_OK != OCDiscoveryCollectionPayloadAddResource(out, tagsPayload, linksPayload)) - { - OC_LOG(ERROR, TAG, "Memory allocation failed"); - OCFreeLinksResource(linksPayload); - OCFreeTagsResource(tagsPayload); - OCDiscoveryPayloadDestroy(out); - return OC_STACK_NO_MEMORY; - } - if (CborNoError != cbor_value_advance(&arrayVal)) - { - OC_LOG(ERROR, TAG, "Cbor value advanced failed."); - goto cbor_error; - } - } - } - if (cbor_value_is_map(&arrayVal)) + while (cbor_value_is_map(&resourceMap)) { - size_t resourceCount = 0; - while (cbor_value_is_map(&arrayVal)) + resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); + if(!resource) { - resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); - if(!resource) - { - OC_LOG(ERROR, TAG, "Memory allocation failed"); - OCDiscoveryPayloadDestroy(out); - return OC_STACK_NO_MEMORY; - } - CborValue curVal; - // DI - err = cbor_value_map_find_value(&arrayVal, OC_RSRVD_DEVICE_ID, &curVal); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor find value failed."); - goto malformed_cbor; - } - size_t len; - err = cbor_value_dup_byte_string(&curVal, &(resource->sid), &len, NULL); + OC_LOG(ERROR, TAG, "Memory allocation failed"); + OCDiscoveryPayloadDestroy(out); + return OC_STACK_NO_MEMORY; + } + + // Uri + CborValue uriVal = {}; + err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_HREF, &uriVal); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding href type failed."); + goto malformed_cbor; + } + err = cbor_value_dup_text_string(&uriVal, &(resource->uri), &len, NULL); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding href value failed."); + goto malformed_cbor; + } + // ResourceTypes + CborValue rtVal = {}; + err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_RESOURCE_TYPE, &rtVal); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding rt type failed."); + goto malformed_cbor; + } + if (cbor_value_is_text_string(&rtVal)) + { + char* input = NULL; + char* savePtr; + err = cbor_value_dup_text_string(&rtVal, &input, &len, NULL); if (CborNoError != err) { - OC_LOG(ERROR, TAG, "Cbor di finding failed."); + OC_LOG(ERROR, TAG, "Cbor finding rt value failed."); goto malformed_cbor; } - // Links TAG + if (input) { - CborValue linkArray; - err = cbor_value_map_find_value(&arrayVal, OC_RSRVD_LINKS, &linkArray); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor links finding failed."); - goto malformed_cbor; - } - CborValue linkMap; - err = cbor_value_enter_container(&linkArray, &linkMap); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor entering map failed."); - goto malformed_cbor; - } - // Uri - err = cbor_value_map_find_value(&linkMap, OC_RSRVD_HREF, &curVal); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding href type failed."); - goto malformed_cbor; - } - err = cbor_value_dup_text_string(&curVal, &(resource->uri), &len, NULL); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding href value failed."); - goto malformed_cbor; - } - // ResourceTypes - CborValue rtVal; - err = cbor_value_map_find_value(&linkMap, OC_RSRVD_RESOURCE_TYPE, &rtVal); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding rt type failed."); - goto malformed_cbor; - } - if (cbor_value_is_text_string(&rtVal)) + char* curPtr = strtok_r(input, " ", &savePtr); + + while (curPtr) { - char* input = NULL; - char* savePtr; - err = cbor_value_dup_text_string(&rtVal, &input, &len, NULL); - if (CborNoError != err) + char* trimmed = InPlaceStringTrim(curPtr); + if (trimmed[0] !='\0') { - OC_LOG(ERROR, TAG, "Cbor finding rt value failed."); - goto malformed_cbor; - } - if (input) - { - char* curPtr = strtok_r(input, " ", &savePtr); - - while (curPtr) + if (!OCResourcePayloadAddResourceType(resource, trimmed)) { - char* trimmed = InPlaceStringTrim(curPtr); - if (trimmed[0] !='\0') - { - if (!OCResourcePayloadAddResourceType(resource, trimmed)) - { - OICFree(resource->uri); - OICFree(resource->sid); - OCFreeOCStringLL(resource->types); - OICFree(resource); - OCDiscoveryPayloadDestroy(out); - return OC_STACK_NO_MEMORY; - } - } - curPtr = strtok_r(NULL, " ", &savePtr); + OICFree(resource->uri); + OCFreeOCStringLL(resource->types); + OICFree(resource); + OCDiscoveryPayloadDestroy(out); + return OC_STACK_NO_MEMORY; } - OICFree(input); } + curPtr = strtok_r(NULL, " ", &savePtr); } + OICFree(input); + } + } - // Interface Types - CborValue ifVal; - err = cbor_value_map_find_value(&linkMap, OC_RSRVD_INTERFACE, &ifVal); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding if type failed."); - goto malformed_cbor; - } - if (!err && cbor_value_is_text_string(&ifVal)) - { - char* input = NULL; - char* savePtr; - err = cbor_value_dup_text_string(&ifVal, &input, &len, NULL); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding if value failed."); - goto malformed_cbor; - } - if (input) - { - char* curPtr = strtok_r(input, " ", &savePtr); + // Interface Types + CborValue ifVal = {}; + err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_INTERFACE, &ifVal); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding if type failed."); + goto malformed_cbor; + } + if (!err && cbor_value_is_text_string(&ifVal)) + { + char* input = NULL; + char* savePtr; + err = cbor_value_dup_text_string(&ifVal, &input, &len, NULL); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding if value failed."); + goto malformed_cbor; + } + if (input) + { + char* curPtr = strtok_r(input, " ", &savePtr); - while (curPtr) - { - char* trimmed = InPlaceStringTrim(curPtr); - if (trimmed[0] !='\0') - { - if (!OCResourcePayloadAddInterface(resource, trimmed)) - { - OICFree(resource->uri); - OICFree(resource->sid); - OCFreeOCStringLL(resource->types); - OICFree(resource); - OCDiscoveryPayloadDestroy(out); - return OC_STACK_NO_MEMORY; - } - } - curPtr = strtok_r(NULL, " ", &savePtr); - } - OICFree(input); - } - } - // Policy + while (curPtr) { - CborValue policyMap; - err = cbor_value_map_find_value(&linkMap, OC_RSRVD_POLICY, &policyMap); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding policy type failed."); - goto malformed_cbor; - } - // Bitmap - CborValue val; - err = cbor_value_map_find_value(&policyMap, OC_RSRVD_BITMAP, &val); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding bitmap type failed."); - goto malformed_cbor; - } - uint64_t temp = 0; - err = cbor_value_get_uint64(&val, &temp); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding bitmap value failed."); - goto malformed_cbor; - } - resource->bitmap = (uint8_t)temp; - // Secure Flag - err = cbor_value_map_find_value(&policyMap, OC_RSRVD_SECURE, &val); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding secure type failed."); - goto malformed_cbor; - } - if(cbor_value_is_valid(&val)) + char* trimmed = InPlaceStringTrim(curPtr); + if (trimmed[0] !='\0') { - err = cbor_value_get_boolean(&val, &(resource->secure)); - if (CborNoError != err) + if (!OCResourcePayloadAddInterface(resource, trimmed)) { - OC_LOG(ERROR, TAG, "Cbor finding secure value failed."); - goto malformed_cbor; - } - // Port - CborValue port; - err = cbor_value_map_find_value(&policyMap, OC_RSRVD_HOSTING_PORT, - &port); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding port type failed."); - goto malformed_cbor; - } - if(cbor_value_is_valid(&port)) - { - err = cbor_value_get_uint64(&port, &temp); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding port value failed."); - goto malformed_cbor; - } - resource->port = (uint16_t)temp; + OICFree(resource->uri); + OCFreeOCStringLL(resource->types); + OICFree(resource); + OCDiscoveryPayloadDestroy(out); + return OC_STACK_NO_MEMORY; } } + curPtr = strtok_r(NULL, " ", &savePtr); } + OICFree(input); } - err = cbor_value_advance(&arrayVal); + } + + // Policy + CborValue policyMap = {}; + err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_POLICY, &policyMap); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding policy type failed."); + goto malformed_cbor; + } + // Bitmap + CborValue val = {}; + err = cbor_value_map_find_value(&policyMap, OC_RSRVD_BITMAP, &val); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding bitmap type failed."); + goto malformed_cbor; + } + uint64_t temp = 0; + err = cbor_value_get_uint64(&val, &temp); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding bitmap value failed."); + goto malformed_cbor; + } + resource->bitmap = (uint8_t)temp; + // Secure Flag + err = cbor_value_map_find_value(&policyMap, OC_RSRVD_SECURE, &val); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding secure type failed."); + goto malformed_cbor; + } + if(cbor_value_is_valid(&val)) + { + err = cbor_value_get_boolean(&val, &(resource->secure)); if (CborNoError != err) { - OC_LOG(ERROR, TAG, "Cbor advance value failed."); + OC_LOG(ERROR, TAG, "Cbor finding secure value failed."); goto malformed_cbor; } - ++resourceCount; - OCDiscoveryPayloadAddNewResource(out, resource); + // Port + CborValue port; + err = cbor_value_map_find_value(&policyMap, OC_RSRVD_HOSTING_PORT, + &port); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding port type failed."); + goto malformed_cbor; + } + if(cbor_value_is_valid(&port)) + { + err = cbor_value_get_uint64(&port, &temp); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding port value failed."); + goto malformed_cbor; + } + resource->port = (uint16_t)temp; + } } + + err = cbor_value_advance(&resourceMap); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor advance value failed."); + goto malformed_cbor; + } + ++resourceCount; + OCDiscoveryPayloadAddNewResource(out, resource); } - err = err || cbor_value_leave_container(rootValue, &arrayVal); + + err = err || cbor_value_leave_container(rootValue, &resourceMap); *outPayload = (OCPayload*)out; return OC_STACK_OK; malformed_cbor: OICFree(resource->uri); - OICFree(resource->sid); OCFreeOCStringLL(resource->types); OCFreeOCStringLL(resource->interfaces); OICFree(resource); diff --git a/resource/csdk/stack/src/ocresource.c b/resource/csdk/stack/src/ocresource.c index 15649aa..cda1d18 100644 --- a/resource/csdk/stack/src/ocresource.c +++ b/resource/csdk/stack/src/ocresource.c @@ -619,6 +619,10 @@ static OCStackResult HandleVirtualResource (OCServerRequest *request, OCResource if(payload) { + ((OCDiscoveryPayload*)payload)->sid = (uint8_t*)OICCalloc(1, UUID_SIZE); + memcpy(((OCDiscoveryPayload*)payload)->sid, + OCGetServerInstanceID(), UUID_SIZE); + bool foundResourceAtRD = false; for(;resource && discoveryResult == OC_STACK_OK; resource = resource->next) { diff --git a/resource/include/OCSerialization.h b/resource/include/OCSerialization.h index 4c21ea3..59a16bb 100644 --- a/resource/include/OCSerialization.h +++ b/resource/include/OCSerialization.h @@ -51,7 +51,7 @@ namespace OC while(res) { char uuidString[UUID_STRING_SIZE]; - if(OCConvertUuidToString(res->sid, uuidString) != RAND_UUID_OK) + if(OCConvertUuidToString(payload->sid, uuidString) != RAND_UUID_OK) { uuidString[0]= '\0'; } diff --git a/resource/unittests/OCRepresentationEncodingTest.cpp b/resource/unittests/OCRepresentationEncodingTest.cpp index 33c90e3..e1b0807 100644 --- a/resource/unittests/OCRepresentationEncodingTest.cpp +++ b/resource/unittests/OCRepresentationEncodingTest.cpp @@ -647,12 +647,12 @@ namespace OCRepresentationEncodingTest { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); + payload->sid = (uint8_t*)OICMalloc(16); payload->resources = resource; OCResourcePayloadAddResourceType(resource, "rt.singleitem"); OCResourcePayloadAddInterface(resource, "if.singleitem"); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -680,13 +680,13 @@ namespace OCRepresentationEncodingTest TEST(DiscoveryRTandIF, SingleItemFrontTrim) { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); + payload->sid = (uint8_t*)OICMalloc(16); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); payload->resources = resource; OCResourcePayloadAddResourceType(resource, " rt.singleitem"); OCResourcePayloadAddInterface(resource, " if.singleitem"); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -713,13 +713,13 @@ namespace OCRepresentationEncodingTest TEST(DiscoveryRTandIF, SingleItemBackTrim) { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); + payload->sid = (uint8_t*)OICMalloc(16); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); payload->resources = resource; OCResourcePayloadAddResourceType(resource, "rt.singleitem "); OCResourcePayloadAddInterface(resource, "if.singleitem "); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -746,13 +746,13 @@ namespace OCRepresentationEncodingTest TEST(DiscoveryRTandIF, SingleItemBothTrim) { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); + payload->sid = (uint8_t*)OICMalloc(16); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); payload->resources = resource; OCResourcePayloadAddResourceType(resource, " rt.singleitem "); OCResourcePayloadAddInterface(resource, " if.singleitem "); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -779,6 +779,7 @@ namespace OCRepresentationEncodingTest TEST(DiscoveryRTandIF, MultiItemsNormal) { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); + payload->sid = (uint8_t*)OICMalloc(16); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); payload->resources = resource; @@ -787,7 +788,6 @@ namespace OCRepresentationEncodingTest OCResourcePayloadAddInterface(resource, "if.firstitem"); OCResourcePayloadAddInterface(resource, "if.seconditem"); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -816,6 +816,7 @@ namespace OCRepresentationEncodingTest TEST(DiscoveryRTandIF, MultiItemExtraLeadSpaces) { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); + payload->sid = (uint8_t*)OICMalloc(16); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); payload->resources = resource; @@ -824,7 +825,6 @@ namespace OCRepresentationEncodingTest OCResourcePayloadAddInterface(resource, " if.firstitem"); OCResourcePayloadAddInterface(resource, " if.seconditem"); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -853,6 +853,7 @@ namespace OCRepresentationEncodingTest TEST(DiscoveryRTandIF, MultiItemExtraTrailSpaces) { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); + payload->sid = (uint8_t*)OICMalloc(16); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); payload->resources = resource; @@ -861,7 +862,6 @@ namespace OCRepresentationEncodingTest OCResourcePayloadAddInterface(resource, "if.firstitem "); OCResourcePayloadAddInterface(resource, "if.seconditem "); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -890,6 +890,7 @@ namespace OCRepresentationEncodingTest TEST(DiscoveryRTandIF, MultiItemBothSpaces) { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); + payload->sid = (uint8_t*)OICMalloc(16); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); payload->resources = resource; @@ -898,7 +899,6 @@ namespace OCRepresentationEncodingTest OCResourcePayloadAddInterface(resource, " if.firstitem "); OCResourcePayloadAddInterface(resource, " if.seconditem "); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; -- 2.7.4