Convert href, if, rt on links payload
authoruzchoi <uzchoi@samsung.com>
Wed, 26 Jul 2017 09:04:47 +0000 (18:04 +0900)
committerAshok Babu Channa <ashok.channa@samsung.com>
Tue, 8 Aug 2017 06:06:02 +0000 (06:06 +0000)
Previously OCPayloadConvert logic in sever side only convert uri,
types and interfaces for the top level element.
Even if a RepPayload exists in the RepPayload, uri and so on are not
converted.

This patch move the uri, type and interface convert logic into
OCConvertSingleRepPayload which is recrsively called function.

Previous code skipped to convert href in case array payload size is 1
on the top level payload. This logic should be removed at least
considering collection resource with linked-list interface request.
Furthermore, this skip logic is not mandatory code for certification
as of now.

Change-Id: I17b1cc02aed37e9af55126d3af2d28310a3ae733
Signed-off-by: uzchoi <uzchoi@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/21629
Tested-by: jenkins-iotivity <jenkins@iotivity.org>
Reviewed-by: Todd Malsbary <todd.malsbary@intel.com>
Reviewed-by: Ashok Babu Channa <ashok.channa@samsung.com>
resource/csdk/stack/src/ocpayloadconvert.c

index 629b055..99ff6e1 100644 (file)
@@ -931,6 +931,29 @@ static int64_t OCConvertSingleRepPayloadValue(CborEncoder *parent, const OCRepPa
 static int64_t OCConvertSingleRepPayload(CborEncoder *repMap, const OCRepPayload *payload)
 {
     int64_t err = CborNoError;
+    VERIFY_PARAM_NON_NULL(TAG, payload, "Input param, payload is NULL");
+    VERIFY_PARAM_NON_NULL(TAG, repMap, "Input param, repMap is NULL");
+
+    if (payload->uri && strlen(payload->uri) > 0)
+    {
+        OIC_LOG(INFO, TAG, "Payload has uri");
+        err |= cbor_encode_text_string(repMap, OC_RSRVD_HREF, strlen(OC_RSRVD_HREF));
+        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep href tag");
+        err |= cbor_encode_text_string(repMap, payload->uri, strlen(payload->uri));
+        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep href value");
+    }
+    if (payload->types)
+    {
+        OIC_LOG(INFO, TAG, "Payload has types");
+        err |= OCStringLLJoin(repMap, 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 |= OCStringLLJoin(repMap, OC_RSRVD_INTERFACE, payload->interfaces);
+        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform interface type.");
+    }
     OCRepPayloadValue *value = payload->values;
     while (value)
     {
@@ -972,28 +995,6 @@ static int64_t OCConvertRepPayload(OCRepPayload *payload, uint8_t *outPayload, s
                                             &rootMap, CborIndefiniteLength);
         VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating root map");
 
-        // Only in case of collection href is included.
-        if (arrayCount > 1 && payload->uri && strlen(payload->uri) > 0)
-        {
-            OIC_LOG(INFO, TAG, "Payload has uri");
-            err |= cbor_encode_text_string(&rootMap, OC_RSRVD_HREF, strlen(OC_RSRVD_HREF));
-            VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep href tag");
-            err |= cbor_encode_text_string(&rootMap, payload->uri, strlen(payload->uri));
-            VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep href value");
-        }
-        if (payload->types)
-        {
-            OIC_LOG(INFO, TAG, "Payload has types");
-            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 |= OCStringLLJoin(&rootMap, OC_RSRVD_INTERFACE, payload->interfaces);
-            VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform interface type.");
-        }
-
         err |= OCConvertSingleRepPayload(&rootMap, payload);
         VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting rep payload");