replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / resource / csdk / resource-directory / src / rd_client.c
index eb2ac3b..fd65aeb 100644 (file)
@@ -19,6 +19,9 @@
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 #include "rd_client.h"
 
+#include <stdlib.h>
+#include <string.h>
+
 #include "oic_malloc.h"
 #include "oic_string.h"
 #include "octypes.h"
@@ -30,8 +33,8 @@
 
 #ifdef RD_CLIENT
 
-OCStackResult OCRDDiscover(OCConnectivityType connectivityType, OCCallbackData *cbBiasFactor,
-                           OCQualityOfService qos)
+OCStackResult OCRDDiscover(OCDoHandle *handle, OCConnectivityType connectivityType,
+                           OCCallbackData *cbBiasFactor, OCQualityOfService qos)
 {
     if (!cbBiasFactor || !cbBiasFactor->cb)
     {
@@ -44,11 +47,12 @@ OCStackResult OCRDDiscover(OCConnectivityType connectivityType, OCCallbackData *
     snprintf(queryUri, MAX_URI_LENGTH, "coap://%s%s", OC_MULTICAST_PREFIX, OC_RSRVD_RD_URI);
     OIC_LOG_V(DEBUG, TAG, "Querying RD: %s\n", queryUri);
 
-    return OCDoResource(NULL, OC_REST_DISCOVER, queryUri, NULL, NULL, connectivityType, qos,
+    return OCDoResource(handle, OC_REST_DISCOVER, queryUri, NULL, NULL, connectivityType, qos,
                         cbBiasFactor, NULL, 0);
 }
 
-OCStackResult OCRDPublish(const char *host, OCConnectivityType connectivityType,
+OCStackResult OCRDPublish(OCDoHandle *handle, const char *host,
+                          OCConnectivityType connectivityType,
                           OCResourceHandle *resourceHandles, uint8_t nHandles,
                           OCCallbackData *cbData, OCQualityOfService qos)
 {
@@ -66,11 +70,12 @@ OCStackResult OCRDPublish(const char *host, OCConnectivityType connectivityType,
     // Get Device ID from stack.
     const unsigned char *id = (const unsigned char *) OCGetServerInstanceIDString();
 
-    return OCRDPublishWithDeviceId(host, id, connectivityType, resourceHandles, nHandles,
-                                   cbData, qos);
+    return OCRDPublishWithDeviceId(handle, host, id, connectivityType, resourceHandles,
+                                   nHandles, cbData, qos);
 }
 
-OCStackResult OCRDPublishWithDeviceId(const char *host, const unsigned char *id,
+OCStackResult OCRDPublishWithDeviceId(OCDoHandle *handle, const char *host,
+                                      const unsigned char *id,
                                       OCConnectivityType connectivityType,
                                       OCResourceHandle *resourceHandles, uint8_t nHandles,
                                       OCCallbackData *cbData, OCQualityOfService qos)
@@ -84,13 +89,12 @@ OCStackResult OCRDPublishWithDeviceId(const char *host, const unsigned char *id,
     OIC_LOG_V(DEBUG, TAG, "Publish Resource to RD with device id [%s]", id);
 
     OCResourceHandle *pubResHandle = resourceHandles;
+    OCResourceHandle defaultResHandles[OIC_RD_DEFAULT_RESOURCE] = { 0 };
     uint8_t nPubResHandles = nHandles;
 
     // if resource handles is null, "/oic/p" and "/oic/d" resource will be published to RD.
-    if (!pubResHandle && !nPubResHandles)
+    if (!pubResHandle)
     {
-        OCResourceHandle defaultResHandles[OIC_RD_DEFAULT_RESOURCE] = { 0 };
-
         // get "/oic/d" and "/oic/p" resource handle from stack.
         defaultResHandles[0] = OCGetResourceHandleAtUri(OC_RSRVD_DEVICE_URI);
         defaultResHandles[1] = OCGetResourceHandleAtUri(OC_RSRVD_PLATFORM_URI);
@@ -119,14 +123,32 @@ OCStackResult OCRDPublishWithDeviceId(const char *host, const unsigned char *id,
         return OC_STACK_NO_MEMORY;
     }
 
-    const char *deviceId = OCGetServerInstanceIDString();
-    if (deviceId)
+    OCRepPayloadSetPropString(rdPayload, OC_RSRVD_DEVICE_ID, (const char *) id);
+
+    char *deviceName = NULL;
+    OCGetPropertyValue(PAYLOAD_TYPE_DEVICE, OC_RSRVD_DEVICE_NAME, (void **) &deviceName);
+    if (deviceName)
     {
-        OCRepPayloadSetPropString(rdPayload, OC_RSRVD_DEVICE_ID, deviceId);
+        OCRepPayloadSetPropString(rdPayload, OC_RSRVD_DEVICE_NAME, deviceName);
+        OICFree(deviceName);
     }
+
+    char *platformModelName = NULL;
+    OCGetPropertyValue(PAYLOAD_TYPE_PLATFORM, OC_RSRVD_MODEL_NUM, (void **) &platformModelName);
+    if (platformModelName)
+    {
+        OCRepPayloadSetPropString(rdPayload, OC_DATA_MODEL_NUMBER, platformModelName);
+        OICFree(platformModelName);
+    }
+
     OCRepPayloadSetPropInt(rdPayload, OC_RSRVD_DEVICE_TTL, OIC_RD_PUBLISH_TTL);
 
-    const OCRepPayload *linkArr[nPubResHandles];
+    OCRepPayload **linkArr = OICCalloc(nPubResHandles, sizeof(OCRepPayload *));
+    if (!linkArr)
+    {
+       OCRepPayloadDestroy(rdPayload);
+       return OC_STACK_NO_MEMORY;
+    }
     size_t dimensions[MAX_REP_ARRAY_DEPTH] = {nPubResHandles, 0, 0};
 
     for (uint8_t j = 0; j < nPubResHandles; j++)
@@ -153,7 +175,7 @@ OCStackResult OCRDPublishWithDeviceId(const char *host, const unsigned char *id,
                     OIC_LOG_V(DEBUG, TAG, "value: %s", value);
                     rt[i] = OICStrdup(value);
                 }
-                OCRepPayloadSetStringArray(link, OC_RSRVD_RESOURCE_TYPE, (const char **)rt, rtDim);
+                OCRepPayloadSetStringArrayAsOwner(link, OC_RSRVD_RESOURCE_TYPE, rt, rtDim);
             }
 
             numElement = 0;
@@ -167,10 +189,10 @@ OCStackResult OCRDPublishWithDeviceId(const char *host, const unsigned char *id,
                     OIC_LOG_V(DEBUG, TAG, "value: %s", value);
                     itf[i] = OICStrdup(value);
                 }
-                OCRepPayloadSetStringArray(link, OC_RSRVD_INTERFACE, (const char **)itf, ifDim);
+                OCRepPayloadSetStringArrayAsOwner(link, OC_RSRVD_INTERFACE, itf, ifDim);
             }
 
-            uint8_t ins = 0;
+            int64_t ins = 0;
             if (OC_STACK_OK == OCGetResourceIns(handle, &ins))
             {
                 OCRepPayloadSetPropInt(link, OC_RSRVD_INS, ins);
@@ -178,9 +200,21 @@ OCStackResult OCRDPublishWithDeviceId(const char *host, const unsigned char *id,
 
             size_t mtDim[MAX_REP_ARRAY_DEPTH] = {1, 0, 0};
             char **mediaType = (char **)OICMalloc(sizeof(char *) * 1);
+            if (!mediaType)
+            {
+                OIC_LOG(ERROR, TAG, "Memory allocation failed!");
+
+                for(uint8_t i = 0; i < nPubResHandles; i++)
+                {
+                    OCRepPayloadDestroy(linkArr[i]);
+                }
+                OICFree(linkArr);
+                OCRepPayloadDestroy(rdPayload);
+                return OC_STACK_NO_MEMORY;
+            }
+
             mediaType[0] = OICStrdup(DEFAULT_MESSAGE_TYPE);
-            OCRepPayloadSetStringArray(link, OC_RSRVD_MEDIA_TYPE, (const char **)mediaType,
-            mtDim);
+            OCRepPayloadSetStringArrayAsOwner(link, OC_RSRVD_MEDIA_TYPE, mediaType, mtDim);
 
             OCResourceProperty p = OCGetResourceProperties(handle);
             p = (OCResourceProperty) ((p & OC_DISCOVERABLE) | (p & OC_OBSERVABLE));
@@ -192,22 +226,21 @@ OCStackResult OCRDPublishWithDeviceId(const char *host, const unsigned char *id,
         }
     }
 
-    OCRepPayloadSetPropObjectArray(rdPayload, OC_RSRVD_LINKS, linkArr, dimensions);
+    OCRepPayloadSetPropObjectArray(rdPayload, OC_RSRVD_LINKS, (const OCRepPayload **)linkArr, dimensions);
     OIC_LOG_PAYLOAD(DEBUG, (OCPayload *) rdPayload);
 
-    if (OC_STACK_OK == OCStopMulticastServer())
-    {
-        OIC_LOG_V(DEBUG, TAG, "Stopped receiving the multicast traffic.");
-    }
-    else
+    for (uint8_t i = 0; i < nPubResHandles; i++)
     {
-        OIC_LOG_V(DEBUG, TAG, "Failed stopping the multicast traffic.");
+        OCRepPayloadDestroy(linkArr[i]);
     }
-    return OCDoResource(NULL, OC_REST_POST, targetUri, NULL, (OCPayload *)rdPayload,
+    OICFree(linkArr);
+
+    return OCDoResource(handle, OC_REST_POST, targetUri, NULL, (OCPayload *)rdPayload,
                         connectivityType, qos, cbData, NULL, 0);
 }
 
-OCStackResult OCRDDelete(const char *host, OCConnectivityType connectivityType,
+OCStackResult OCRDDelete(OCDoHandle *handle, const char *host,
+                         OCConnectivityType connectivityType,
                          OCResourceHandle *resourceHandles, uint8_t nHandles,
                          OCCallbackData *cbData, OCQualityOfService qos)
 {
@@ -224,11 +257,12 @@ OCStackResult OCRDDelete(const char *host, OCConnectivityType connectivityType,
 
     const unsigned char *id = (const unsigned char *) OCGetServerInstanceIDString();
 
-    return OCRDDeleteWithDeviceId(host, id, connectivityType, resourceHandles, nHandles,
-                                  cbData, qos);
+    return OCRDDeleteWithDeviceId(handle, host, id, connectivityType, resourceHandles,
+                                  nHandles, cbData, qos);
 }
 
-OCStackResult OCRDDeleteWithDeviceId(const char *host, const unsigned char *id,
+OCStackResult OCRDDeleteWithDeviceId(OCDoHandle *handle, const char *host,
+                                     const unsigned char *id,
                                      OCConnectivityType connectivityType,
                                      OCResourceHandle *resourceHandles, uint8_t nHandles,
                                      OCCallbackData *cbData, OCQualityOfService qos)
@@ -249,16 +283,16 @@ OCStackResult OCRDDeleteWithDeviceId(const char *host, const unsigned char *id,
     for (uint8_t j = 0; j < nHandles; j++)
     {
         OCResource *handle = (OCResource *) resourceHandles[j];
-        uint8_t ins = 0;
+        int64_t ins = 0;
         OCGetResourceIns(handle, &ins);
-        len += snprintf(queryParam + len, MAX_URI_LENGTH, "&ins=%d", ins);
+        len += snprintf(queryParam + len, MAX_URI_LENGTH, "&ins=%" PRId64, ins);
         OIC_LOG_V(DEBUG, TAG, "queryParam [%s]", queryParam);
     }
 
     OICStrcatPartial(targetUri, sizeof(targetUri), queryParam, strlen(queryParam));
     OIC_LOG_V(DEBUG, TAG, "Target URI: %s", targetUri);
 
-    return OCDoResource(NULL, OC_REST_DELETE, targetUri, NULL, NULL, connectivityType,
+    return OCDoResource(handle, OC_REST_DELETE, targetUri, NULL, NULL, connectivityType,
                         qos, cbData, NULL, 0);
 }