From c2d1c8081b27f90ede5ae9d04d926e5e8154a1c5 Mon Sep 17 00:00:00 2001 From: Jay Sharma Date: Thu, 22 Dec 2016 00:05:35 +0000 Subject: [PATCH] Handling of missing parent property in collection response In case parent is not included in the response. It creates an empty representation. The first node is not considered parent. Change-Id: I088a2bdb552cf6b75e67cc2f16fb9150878d717d Signed-off-by: Jay Sharma Signed-off-by: Habib Virji Reviewed-on: https://gerrit.iotivity.org/gerrit/15879 Reviewed-by: Harish Marappa Tested-by: jenkins-iotivity Reviewed-by: Ashok Babu Channa --- resource/csdk/stack/src/ocstack.c | 41 ++++++++++++++++++++++++++++++++++++ resource/src/InProcClientWrapper.cpp | 16 ++++++-------- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/resource/csdk/stack/src/ocstack.c b/resource/csdk/stack/src/ocstack.c index 7ce6a7c..f55880c 100644 --- a/resource/csdk/stack/src/ocstack.c +++ b/resource/csdk/stack/src/ocstack.c @@ -1274,6 +1274,43 @@ exit: return result; } +OCStackResult HandleBatchResponse(char *requestUri, OCRepPayload **payload) +{ + if (requestUri && *payload) + { + char *interfaceName = NULL; + char *rtTypeName = NULL; + char *uriQuery = NULL; + char *uriWithoutQuery = NULL; + if (OC_STACK_OK == getQueryFromUri(requestUri, &uriQuery, &uriWithoutQuery)) + { + if (OC_STACK_OK == ExtractFiltersFromQuery(uriQuery, &interfaceName, &rtTypeName)) + { + if (0 == strcmp(OC_RSRVD_INTERFACE_BATCH, interfaceName)) + { + char *uri = (*payload)->uri; + if (uri && 0 != strcmp(uriWithoutQuery, uri)) + { + OCRepPayload *newPayload = OCRepPayloadCreate(); + if (newPayload) + { + OCRepPayloadSetUri(newPayload, uri); + newPayload->next = *payload; + *payload = newPayload; + } + } + } + } + } + OICFree(interfaceName); + OICFree(rtTypeName); + OICFree(uriQuery); + OICFree(uriWithoutQuery); + return OC_STACK_OK; + } + return OC_STACK_INVALID_PARAM; +} + void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* responseInfo) { OIC_LOG(DEBUG, TAG, "Enter OCHandleResponse"); @@ -1607,6 +1644,10 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp #endif } } + if (response->payload && response->payload->type == PAYLOAD_TYPE_REPRESENTATION) + { + HandleBatchResponse(cbNode->requestUri, (OCRepPayload **)&response->payload); + } OCStackApplicationResult appFeedback = cbNode->callBack(cbNode->context, cbNode->handle, diff --git a/resource/src/InProcClientWrapper.cpp b/resource/src/InProcClientWrapper.cpp index 872a812..194cb5c 100644 --- a/resource/src/InProcClientWrapper.cpp +++ b/resource/src/InProcClientWrapper.cpp @@ -140,13 +140,11 @@ namespace OC ) ) { - //OCPayloadDestroy(clientResponse->payload); return OCRepresentation(); } MessageContainer oc; oc.setPayload(clientResponse->payload); - //OCPayloadDestroy(clientResponse->payload); std::vector::const_iterator it = oc.representations().begin(); if (it == oc.representations().end()) @@ -155,16 +153,15 @@ namespace OC } // first one is considered the root, everything else is considered a child of this one. - OCRepresentation root = *it; - root.setDevAddr(clientResponse->devAddr); - root.setUri(clientResponse->resourceUri); - ++it; + OCRepresentation root = *it; + root.setDevAddr(clientResponse->devAddr); + root.setUri(clientResponse->resourceUri); + ++it; std::for_each(it, oc.representations().end(), [&root](const OCRepresentation& repItr) {root.addChild(repItr);}); return root; - } OCStackApplicationResult listenCallback(void* ctx, OCDoHandle /*handle*/, @@ -886,7 +883,6 @@ namespace OC { ClientCallbackContext::GetContext* context = static_cast(ctx); - OCRepresentation rep; HeaderOptions serverHeaderOptions; OCStackResult result = clientResponse->result; @@ -920,12 +916,12 @@ namespace OC OCStackResult result; ClientCallbackContext::GetContext* ctx = new ClientCallbackContext::GetContext(callback); + OCCallbackData cbdata; - cbdata.context = static_cast(ctx), + cbdata.context = static_cast(ctx); cbdata.cb = getResourceCallback; cbdata.cd = [](void* c){delete (ClientCallbackContext::GetContext*)c;}; - std::string uri = assembleSetResourceUri(resourceUri, queryParams); auto cLock = m_csdkLock.lock(); -- 2.7.4