[IOT-972] add type and interface to platform representation
authorhekra <hekra@cisco.com>
Thu, 10 Mar 2016 01:58:19 +0000 (17:58 -0800)
committerHabib Virji <habib.virji@samsung.com>
Wed, 20 Apr 2016 10:25:55 +0000 (10:25 +0000)
Change-Id: Ie02a201507ffcc0c6a640846dc57341832ea3158
Signed-off-by: Hugues Ekra <hekra@cisco.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/5655
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Habib Virji <habib.virji@samsung.com>
(cherry picked from commit 22932f7aefc633d90011f8fc474f416305976cfc)
Reviewed-on: https://gerrit.iotivity.org/gerrit/7857

resource/csdk/stack/include/octypes.h
resource/csdk/stack/include/payload_logging.h
resource/csdk/stack/src/ocpayload.c
resource/csdk/stack/src/ocpayloadconvert.c
resource/csdk/stack/src/ocpayloadparse.c
resource/src/OCRepresentation.cpp
resource/unittests/OCRepresentationEncodingTest.cpp

index c5b7938..891fea9 100644 (file)
@@ -1222,6 +1222,8 @@ typedef struct
     OCPayload base;
     char* uri;
     OCPlatformInfo info;
+    char* rt;
+    OCStringLL* interfaces;
 } OCPlatformPayload;
 
 typedef struct
index b87f267..088dd19 100644 (file)
@@ -259,6 +259,20 @@ static inline void OCPayloadLogPlatform(LogLevel level, OCPlatformPayload* paylo
     OIC_LOG_V(level, PL_TAG, "\tFirmware Version:%s", payload->info.firmwareVersion);
     OIC_LOG_V(level, PL_TAG, "\tSupport URL:%s", payload->info.supportUrl);
     OIC_LOG_V(level, PL_TAG, "\tSystem Time:%s", payload->info.systemTime);
+
+    if (payload->rt)
+    {
+        OIC_LOG(level, PL_TAG, "\tResource Types:");
+        OIC_LOG_V(level, PL_TAG, "\t\t%s", payload->rt);
+    }
+    if (payload->interfaces)
+    {
+        OIC_LOG(level, PL_TAG, "\tResource Interfaces:");
+        for (OCStringLL *strll = payload->interfaces; strll; strll = strll->next)
+        {
+            OIC_LOG_V(level, PL_TAG, "\t\t%s", strll->value);
+        }
+    }
 }
 
 static inline void OCPayloadLogPresence(LogLevel level, OCPresencePayload* payload)
index ae0c37a..7955152 100755 (executable)
@@ -1631,6 +1631,14 @@ OCPlatformPayload* OCPlatformPayloadCreateAsOwner(OCPlatformInfo* platformInfo)
     }
 
     payload->base.type = PAYLOAD_TYPE_PLATFORM;
+
+    payload->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
+    if (!payload->interfaces)
+    {
+        return NULL;
+    }
+    payload->interfaces->value = OICStrdup(OC_RSRVD_INTERFACE_READ);
+    payload->rt = OICStrdup(OC_RSRVD_RESOURCE_TYPE_PLATFORM);
     payload->info = *platformInfo;
 
     return payload;
@@ -1646,6 +1654,14 @@ OCPlatformPayload* OCPlatformPayloadCreate(const OCPlatformInfo* platformInfo)
     }
 
     payload->base.type = PAYLOAD_TYPE_PLATFORM;
+
+    payload->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
+    if (!payload->interfaces)
+    {
+        return NULL;
+    }
+    payload->interfaces->value = OICStrdup(OC_RSRVD_INTERFACE_READ);
+    payload->rt = OICStrdup(OC_RSRVD_RESOURCE_TYPE_PLATFORM);
     OCCopyPlatformInfo(platformInfo, payload);
 
     return payload;
@@ -1674,6 +1690,8 @@ void OCPlatformPayloadDestroy(OCPlatformPayload* payload)
     }
     OICFree(payload->uri);
     OCPlatformInfoDestroy(&payload->info);
+    OICFree(payload->rt);
+    OCFreeOCStringLL(payload->interfaces);
     OICFree(payload);
 }
 
index 35b2103..528d326 100644 (file)
@@ -523,6 +523,27 @@ static int64_t OCConvertPlatformPayload(OCPlatformPayload *payload, uint8_t *out
             sizeof(OC_RSRVD_SYSTEM_TIME) - 1, payload->info.systemTime);
     VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding system time");
 
+    // Resource type
+    if (payload->rt)
+    {
+        err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_RESOURCE_TYPE,
+                sizeof(OC_RSRVD_RESOURCE_TYPE) - 1, payload->rt);
+        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resource type");
+    }
+
+    // Resource interfaces
+    if (payload->interfaces)
+    {
+        err |= cbor_encode_text_string(&repMap, OC_RSRVD_INTERFACE,
+                sizeof(OC_RSRVD_INTERFACE) - 1);
+        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform interface tag");
+        char* joinedInterfaces = OCStringLLJoin(payload->interfaces);
+        VERIFY_PARAM_NON_NULL(TAG, joinedInterfaces, "Failed creating joined string");
+        err |= cbor_encode_text_string(&repMap, joinedInterfaces, strlen(joinedInterfaces));
+        OICFree(joinedInterfaces);
+        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform interface value");
+    }
+
     // Close Map
     err |= cbor_encoder_close_container(&encoder, &repMap);
     VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep map");
index 5ad6edf..c22de9a 100755 (executable)
@@ -433,6 +433,9 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
     OCStackResult ret = OC_STACK_INVALID_PARAM;
     CborError err = CborNoError;
     OCPlatformInfo info = {0};
+    char* rt = NULL;
+    OCStringLL* interfaces = NULL;
+    OCPlatformPayload* out = NULL;
 
     VERIFY_PARAM_NON_NULL(TAG, outPayload, "Invalid Parameter outPayload");
 
@@ -520,11 +523,30 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
             VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find systemTume in the platform payload");
         }
 
+        // Resource type
+        err = cbor_value_map_find_value(rootValue, OC_RSRVD_RESOURCE_TYPE, &repVal);
+        if(cbor_value_is_valid(&repVal))
+        {
+            err = cbor_value_dup_text_string(&repVal, &rt, &len, NULL);
+            VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find resource type in the platform payload");
+        }
+
+        // Interface Types
+        err = cbor_value_map_find_value(rootValue, OC_RSRVD_INTERFACE, &repVal);
+        if(cbor_value_is_valid(&repVal))
+        {
+            err =  OCParseStringLL(rootValue, OC_RSRVD_INTERFACE, &interfaces);
+            VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find interfaces tag/value");
+        }
+
         err = cbor_value_advance(rootValue);
         VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find supportUrl in the platform payload");
 
-        *outPayload = (OCPayload *)OCPlatformPayloadCreateAsOwner(&info);
-        return OC_STACK_OK;
+       out = (OCPlatformPayload *)OCPlatformPayloadCreateAsOwner(&info);
+       out->rt = rt;
+       out->interfaces = interfaces;
+       *outPayload = (OCPayload *)out;
+       return OC_STACK_OK;
     }
 
 exit:
index a8d5ef3..47dce71 100644 (file)
@@ -134,6 +134,15 @@ namespace OC
             std::string(payload->info.systemTime) :
             std::string();
 
+        if (payload->rt)
+        {
+            rep.addResourceType(payload->rt);
+        }
+        for (OCStringLL *strll = payload->interfaces; strll; strll = strll->next)
+        {
+            rep.addResourceInterface(strll->value);
+        }
+
         m_reps.push_back(std::move(rep));
     }
 
index 08d8858..4982757 100644 (file)
@@ -135,6 +135,8 @@ namespace OCRepresentationEncodingTest
         EXPECT_STREQ(fwver1, platform->info.firmwareVersion);
         EXPECT_STREQ(url1, platform->info.supportUrl);
         EXPECT_STREQ(time1, platform->info.systemTime);
+        EXPECT_STREQ(OC_RSRVD_INTERFACE_READ, platform->interfaces->value);
+        EXPECT_STREQ(OC_RSRVD_RESOURCE_TYPE_PLATFORM, platform->rt);
 
         uint8_t* cborData;
         size_t cborSize;
@@ -157,6 +159,8 @@ namespace OCRepresentationEncodingTest
         EXPECT_STREQ(platform->info.firmwareVersion, platform->info.firmwareVersion);
         EXPECT_STREQ(platform->info.supportUrl, platform->info.supportUrl);
         EXPECT_STREQ(platform->info.systemTime, platform2->info.systemTime);
+        EXPECT_STREQ(platform->interfaces->value, platform2->interfaces->value);
+        EXPECT_STREQ(platform->rt, platform2->rt);
 
         OCPayloadDestroy((OCPayload*)platform);