From: Jay Sharma Date: Thu, 22 Dec 2016 00:05:35 +0000 (+0000) Subject: Handling of missing parent property in collection response X-Git-Tag: 1.3.0~586 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c2d1c8081b27f90ede5ae9d04d926e5e8154a1c5;p=platform%2Fupstream%2Fiotivity.git 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 --- 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();