RD handling of publishing device address
authorHabib Virji <habib.virji@samsung.com>
Wed, 25 Nov 2015 16:44:43 +0000 (16:44 +0000)
committerUze Choi <uzchoi@samsung.com>
Wed, 9 Dec 2015 05:28:28 +0000 (05:28 +0000)
Correct address in the baseURI field for resource directory.

JIRA ISSUE:855

Signed-off-by: Habib Virji <habib.virji@samsung.com>
Change-Id: Idf86fe801e25e32c84268f421feff479270faa1b
Reviewed-on: https://gerrit.iotivity.org/gerrit/4351
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
resource/include/OCSerialization.h
service/resource-directory/src/internal/rd_storage.c
service/resource-directory/src/internal/rd_storage.h
service/resource-directory/src/rd_client.c
service/resource-directory/src/rd_server.c

index b112af1..fc2d44a 100644 (file)
@@ -21,6 +21,7 @@
 #include <StringConstants.h>
 #include "ocpayload.h"
 #include "ocrandom.h"
+#include "oic_string.h"
 
 namespace OC
 {
@@ -81,19 +82,29 @@ namespace OC
                 {
                     while(colRes)
                     {
+                        // currently support for ipv4 is provided.
+                        OCDevAddr colAddr;
+                        colAddr.adapter = OC_ADAPTER_IP;
+                        colAddr.flags   = OC_IP_USE_V4;
+                        char *ptr = strtok(colRes->tags->baseURI, ":");
+                        OICStrcpy(colAddr.addr, sizeof(colAddr.addr), ptr);
+
                         if (colRes->tags->bitmap & OC_SECURE)
                         {
-                            m_devAddr.flags =
+                            colAddr.flags =
                                   (OCTransportFlags)(OC_FLAG_SECURE | m_devAddr.flags);
                         }
-
                         if (colRes->tags->port != 0)
                         {
-                             m_devAddr.port = colRes->tags->port;
+                             colAddr.port = colRes->tags->port;
+                        }
+                        else
+                        {
+                            colAddr.port = atoi(ptr+1);
                         }
 
                         m_resources.push_back(std::shared_ptr<OC::OCResource>(
-                                    new OC::OCResource(m_clientWrapper, m_devAddr,
+                                    new OC::OCResource(m_clientWrapper, colAddr,
                                         std::string(colRes->setLinks->href),
                                         std::string((char*)colRes->tags->di.id),
                                         (colRes->tags->bitmap & OC_OBSERVABLE) == OC_OBSERVABLE,
index 5f80354..1d0ba5a 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "payload_logging.h"
 #include "oic_malloc.h"
+#include "octypes.h"
 
 #include "rdpayload.h"
 
@@ -46,7 +47,7 @@ static void printStoragedResources(OCRDStorePublishResources *payload)
     }
 }
 
-OCStackResult OCRDStorePublishedResources(const OCResourceCollectionPayload *payload)
+OCStackResult OCRDStorePublishedResources(const OCResourceCollectionPayload *payload, const OCDevAddr *address)
 {
     OCResourceCollectionPayload *storeResource = (OCResourceCollectionPayload *)OICCalloc(1, sizeof(OCResourceCollectionPayload));
     if (!storeResource)
@@ -55,11 +56,14 @@ OCStackResult OCRDStorePublishedResources(const OCResourceCollectionPayload *pay
         return OC_STACK_NO_MEMORY;
     }
 
-    OC_LOG(DEBUG, TAG, "Storing Resources ... ");
+    OC_LOG_V(DEBUG, TAG, "Storing Resources for %s:%u", address->addr, address->port);
+
+    char rdPubAddr[MAX_ADDR_STR_SIZE];
+    snprintf(rdPubAddr, MAX_ADDR_STR_SIZE, "%s:%d", address->addr, address->port);
 
     OCTagsPayload *tags = payload->tags;
-    storeResource->tags = OCCopyTagsResources(tags->n.deviceName, tags->di.id, tags->baseURI,
-        tags->bitmap, tags->port, tags->ins, tags->rts, tags->drel, tags->ttl);
+    storeResource->tags = OCCopyTagsResources(tags->n.deviceName, tags->di.id, rdPubAddr,
+        tags->bitmap, address->port, tags->ins, tags->rts, tags->drel, tags->ttl);
     if (!storeResource->tags)
     {
         OC_LOG(ERROR, TAG, "Failed allocating memory for tags.");
index bbc5e48..aefdb46 100644 (file)
@@ -35,10 +35,11 @@ typedef struct OCRDStorePublishResources
  * Stores the publish resources.
  *
  * @param payload RDPublish payload sent from the remote device.
+ * @param address The address of the device publishing resources.
  *
  * @return ::OC_STACK_OK upon success, ::OC_STACK_ERROR in case of error.
  */
-OCStackResult OCRDStorePublishedResources(const OCResourceCollectionPayload *payload);
+OCStackResult OCRDStorePublishedResources(const OCResourceCollectionPayload *payload, const OCDevAddr *address);
 
 #ifdef __cplusplus
 }
index 6b90b86..d8bbfa6 100644 (file)
@@ -330,6 +330,9 @@ OCStackResult OCRDPublish(char *addr, uint16_t port, int numArg, ... )
         goto no_memory;
     }
 
+    OCTagsLog(DEBUG, rdPayload->rdPublish->tags);
+    OCLinksLog(DEBUG, rdPayload->rdPublish->setLinks);
+
     OCDevAddr rdAddr = { 0 };
     OICStrcpy(rdAddr.addr, MAX_ADDR_STR_SIZE, addr);
     rdAddr.port = port;
index 4b67b97..7713679 100644 (file)
@@ -97,7 +97,7 @@ static OCEntityHandlerResult handlePublishRequest(const OCEntityHandlerRequest *
     OCRDPayload *payload = (OCRDPayload *)ehRequest->payload;
     if (payload && payload->rdPublish)
     {
-        OCRDStorePublishedResources(payload->rdPublish);
+        OCRDStorePublishedResources(payload->rdPublish, &ehRequest->devAddr);
     }
 
     OCRDPayload *rdPayload = OCRDPayloadCreate();