From 22932f7aefc633d90011f8fc474f416305976cfc Mon Sep 17 00:00:00 2001 From: hekra Date: Wed, 9 Mar 2016 17:58:19 -0800 Subject: [PATCH] [IOT-972] add type and interface to platform representation Change-Id: Ie02a201507ffcc0c6a640846dc57341832ea3158 Signed-off-by: Hugues Ekra Reviewed-on: https://gerrit.iotivity.org/gerrit/5655 Tested-by: jenkins-iotivity Reviewed-by: Habib Virji --- resource/csdk/stack/include/octypes.h | 2 ++ resource/csdk/stack/include/payload_logging.h | 14 ++++++++++++ resource/csdk/stack/src/ocpayload.c | 18 +++++++++++++++ resource/csdk/stack/src/ocpayloadconvert.c | 21 +++++++++++++++++ resource/csdk/stack/src/ocpayloadparse.c | 26 ++++++++++++++++++++-- resource/src/OCRepresentation.cpp | 9 ++++++++ .../unittests/OCRepresentationEncodingTest.cpp | 4 ++++ 7 files changed, 92 insertions(+), 2 deletions(-) diff --git a/resource/csdk/stack/include/octypes.h b/resource/csdk/stack/include/octypes.h index 7445b44..fff433a 100644 --- a/resource/csdk/stack/include/octypes.h +++ b/resource/csdk/stack/include/octypes.h @@ -1185,6 +1185,8 @@ typedef struct OCPayload base; char* uri; OCPlatformInfo info; + char* rt; + OCStringLL* interfaces; } OCPlatformPayload; typedef struct diff --git a/resource/csdk/stack/include/payload_logging.h b/resource/csdk/stack/include/payload_logging.h index f94500a..6626241 100644 --- a/resource/csdk/stack/include/payload_logging.h +++ b/resource/csdk/stack/include/payload_logging.h @@ -229,6 +229,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) diff --git a/resource/csdk/stack/src/ocpayload.c b/resource/csdk/stack/src/ocpayload.c index 8719abb..030b1c8 100755 --- a/resource/csdk/stack/src/ocpayload.c +++ b/resource/csdk/stack/src/ocpayload.c @@ -1612,6 +1612,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; @@ -1627,6 +1635,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; @@ -1655,6 +1671,8 @@ void OCPlatformPayloadDestroy(OCPlatformPayload* payload) } OICFree(payload->uri); OCPlatformInfoDestroy(&payload->info); + OICFree(payload->rt); + OCFreeOCStringLL(payload->interfaces); OICFree(payload); } diff --git a/resource/csdk/stack/src/ocpayloadconvert.c b/resource/csdk/stack/src/ocpayloadconvert.c index a03f9e6..946cdd9 100644 --- a/resource/csdk/stack/src/ocpayloadconvert.c +++ b/resource/csdk/stack/src/ocpayloadconvert.c @@ -482,6 +482,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"); diff --git a/resource/csdk/stack/src/ocpayloadparse.c b/resource/csdk/stack/src/ocpayloadparse.c index ba6bf5b..82a4674 100755 --- a/resource/csdk/stack/src/ocpayloadparse.c +++ b/resource/csdk/stack/src/ocpayloadparse.c @@ -389,6 +389,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"); @@ -476,11 +479,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: diff --git a/resource/src/OCRepresentation.cpp b/resource/src/OCRepresentation.cpp index 051c0cc..7158d9f 100644 --- a/resource/src/OCRepresentation.cpp +++ b/resource/src/OCRepresentation.cpp @@ -130,6 +130,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)); } diff --git a/resource/unittests/OCRepresentationEncodingTest.cpp b/resource/unittests/OCRepresentationEncodingTest.cpp index e3e50ee..2ce6bb2 100644 --- a/resource/unittests/OCRepresentationEncodingTest.cpp +++ b/resource/unittests/OCRepresentationEncodingTest.cpp @@ -126,6 +126,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; @@ -148,6 +150,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); -- 2.7.4