Modified discovery payload to be spec compliant.
authorMandeep Shetty <mandeep.shetty@intel.com>
Mon, 14 Dec 2015 22:52:53 +0000 (14:52 -0800)
committerJon A. Cruz <jonc@osg.samsung.com>
Tue, 15 Dec 2015 01:50:17 +0000 (01:50 +0000)
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 <mandeep.shetty@intel.com>
Signed-off-by: Joseph Morrow <joseph.l.morrow@intel.com>
Signed-off-by: Mandeep Shetty <mandeep.shetty@intel.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/4543
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Markus Jung <markus.jung85@gmail.com>
Reviewed-by: Jon A. Cruz <jonc@osg.samsung.com>
resource/csdk/security/src/amsmgr.c
resource/csdk/stack/include/octypes.h
resource/csdk/stack/include/payload_logging.h
resource/csdk/stack/samples/linux/SimpleClientServer/occlientbasicops.cpp
resource/csdk/stack/src/ocpayload.c
resource/csdk/stack/src/ocpayloadconvert.c
resource/csdk/stack/src/ocpayloadparse.c
resource/csdk/stack/src/ocresource.c
resource/include/OCSerialization.h
resource/unittests/OCRepresentationEncodingTest.cpp

index 8779b0b..5ec9fb4 100644 (file)
@@ -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__);
index 9ac1b27..0507db6 100644 (file)
@@ -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. */
index 4531fdc..bb9e943 100644 (file)
@@ -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)
index bf9452f..419593a 100644 (file)
@@ -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)
index 96c1d5f..485eda3 100755 (executable)
@@ -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);
 }
index e5ae680..a68ce86 100644 (file)
@@ -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);
     }
 
index c114efe..1131d7d 100644 (file)
@@ -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);
index 15649aa..cda1d18 100644 (file)
@@ -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)
                 {
index 4c21ea3..59a16bb 100644 (file)
@@ -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';
                         }
index 33c90e3..e1b0807 100644 (file)
@@ -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;