From c7a5965ec9778c92fa3a36431155d0697424e76f Mon Sep 17 00:00:00 2001 From: "jaesick.shin" Date: Wed, 5 Oct 2016 17:39:16 +0900 Subject: [PATCH] Add logic for sending responses according to the interface of requests. This patch include, Generate response for each of interface and Add handling about exception cases. Second patch include, 1. change NS_DEFAULT_INTERFACE to NS_INTERFACE_BASELINE 2. Add first patch logic into Topic case. Change-Id: I7aa5868fc9a4b4537964c8bdf92b1f15d058d892 Signed-off-by: jaesick.shin Reviewed-on: https://gerrit.iotivity.org/gerrit/12787 Tested-by: jenkins-iotivity Reviewed-by: Uze Choi --- service/notification/src/common/NSConstants.h | 9 +- .../notification/src/provider/NSProviderListener.c | 344 ++++++++++++++++----- .../notification/src/provider/NSProviderResource.c | 8 +- .../src/provider/NSProviderSubscription.c | 12 +- .../notification/src/provider/NSProviderTopic.c | 18 +- 5 files changed, 306 insertions(+), 85 deletions(-) diff --git a/service/notification/src/common/NSConstants.h b/service/notification/src/common/NSConstants.h index 12c6f05..cbfca9a 100644 --- a/service/notification/src/common/NSConstants.h +++ b/service/notification/src/common/NSConstants.h @@ -81,7 +81,7 @@ #define NS_INTERFACE_READ "oic.if.r" #define NS_INTERFACE_READWRITE "oic.if.rw" -#define NS_DEFAULT_INTERFACE "oic.if.baseline" +#define NS_INTERFACE_BASELINE "oic.if.baseline" #define NS_ROOT_URI "/notification" #define NS_COLLECTION_MESSAGE_URI "/notification/message" @@ -93,6 +93,7 @@ #define NS_QUERY_CONSUMER_ID "consumerId" #define NS_QUERY_PROVIDER_ID "providerId" +#define NS_QUERY_INTERFACE "if" #define NS_QUERY_ID_SIZE 10 @@ -308,4 +309,10 @@ typedef enum eResourceType NS_RESOURCE_TOPIC = 1002, } NSResourceType; +typedef enum eInterfaceType +{ + NS_INTERFACE_TYPE_READ = 1, + NS_INTERFACE_TYPE_READWRITE = 2, +} NSInterfaceType; + #endif /* _NS_CONSTANTS_H_ */ diff --git a/service/notification/src/provider/NSProviderListener.c b/service/notification/src/provider/NSProviderListener.c index 8e1c653..f551541 100644 --- a/service/notification/src/provider/NSProviderListener.c +++ b/service/notification/src/provider/NSProviderListener.c @@ -20,19 +20,25 @@ #include "NSProviderListener.h" +bool NSProviderIsSyncAttributes(OCRepPayload * payload); +bool NSProviderIsTopicAttributes(OCRepPayload * payload); +OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerRequest, + OCRepPayload * payload, char * reqInterface, OCEntityHandlerResult ehResult, + NSInterfaceType interfaceType, NSResourceType resourceType); + OCEntityHandlerResult NSEntityHandlerNotificationCb(OCEntityHandlerFlag flag, OCEntityHandlerRequest *entityHandlerRequest, void* callback) { NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - IN"); - OCEntityHandlerResult ehResult = OC_EH_OK; + OCEntityHandlerResult ehResult = OC_EH_ERROR; (void)callback; if (!entityHandlerRequest) { NS_LOG(ERROR, "Invalid request pointer"); - return OC_EH_ERROR; + return ehResult; } if (flag & OC_REQUEST_FLAG) @@ -43,9 +49,20 @@ OCEntityHandlerResult NSEntityHandlerNotificationCb(OCEntityHandlerFlag flag, { NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - OC_REST_GET"); + char * reqInterface = + NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE); + + if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0 + && strcmp(reqInterface, NS_INTERFACE_READ) != 0) + { + NS_LOG(ERROR, "Invalid interface"); + return ehResult; + } + NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_POLICY, NSCopyOCEntityHandlerRequest(entityHandlerRequest)); + ehResult = OC_EH_OK; } else { @@ -62,26 +79,43 @@ OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag, { NS_LOG(DEBUG, "NSEntityHandlerMessageCb - IN"); - OCEntityHandlerResult ehResult = OC_EH_OK; + OCEntityHandlerResult ehResult = OC_EH_ERROR; + char * reqInterface = NULL; + OCRepPayload * payload = NULL; (void)callback; if (!entityHandlerRequest) { NS_LOG (ERROR,"Invalid request pointer"); - return OC_EH_ERROR; + return ehResult; } - OCEntityHandlerResponse response; - response.numSendVendorSpecificHeaderOptions = 0; - memset(response.sendVendorSpecificHeaderOptions, 0, - sizeof response.sendVendorSpecificHeaderOptions); - memset(response.resourceUri, 0, sizeof response.resourceUri); - if (flag & OC_REQUEST_FLAG) { NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG"); NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method); + + if (OC_REST_GET == entityHandlerRequest->method) + { + NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_REST_GET"); + + reqInterface = + NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE); + + if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0 + && strcmp(reqInterface, NS_INTERFACE_READ) != 0) + { + NS_LOG(ERROR, "Invalid interface"); + return ehResult; + } + + ehResult = OC_EH_OK; + } + else + { + NS_LOG_V (DEBUG, "Received method %d from client", entityHandlerRequest->method); + } } if (flag & OC_OBSERVE_FLAG) @@ -97,6 +131,12 @@ OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag, "Register message observerID : %d\n", entityHandlerRequest->obsInfo.obsId); NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_SUBSCRIPTION, NSCopyOCEntityHandlerRequest(entityHandlerRequest)); + ehResult = OC_EH_OK; + + if (NSGetPolicy() == NS_POLICY_CONSUMER) + { + return ehResult; + } } else if(ocObAction == OC_OBSERVE_DEREGISTER) { @@ -105,50 +145,50 @@ OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag, "Deregister Message observerID : %d\n", entityHandlerRequest->obsInfo.obsId); NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_UNSUBSCRIPTION, NSCopyOCEntityHandlerRequest(entityHandlerRequest)); + ehResult = OC_EH_OK; } } - response.requestHandle = entityHandlerRequest->requestHandle; - response.resourceHandle = entityHandlerRequest->resource; - response.persistentBufferFlag = 0; - response.ehResult = OC_EH_OK; - response.payload = (OCPayload *) NULL; - - if (OCDoResponse(&response) != OC_STACK_OK) - { - NS_LOG(ERROR, "Fail to AccessPolicy send response"); - return NS_ERROR; - } - NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OUT"); - return ehResult; + return NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult, + NS_INTERFACE_TYPE_READ, NS_RESOURCE_MESSAGE); } OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag, OCEntityHandlerRequest *entityHandlerRequest, void* callback) { NS_LOG(DEBUG, "NSEntityHandlerSyncCb - IN"); - OCEntityHandlerResult ehResult = OC_EH_OK; + OCEntityHandlerResult ehResult = OC_EH_ERROR; + char * reqInterface = NULL; + OCRepPayload * payload = NULL; (void)callback; if (!entityHandlerRequest) { NS_LOG(ERROR, "Invalid request pointer"); - return OC_EH_ERROR; + return ehResult; } - OCEntityHandlerResponse response; - response.numSendVendorSpecificHeaderOptions = 0; - memset(response.sendVendorSpecificHeaderOptions, 0, - sizeof response.sendVendorSpecificHeaderOptions); - memset(response.resourceUri, 0, sizeof response.resourceUri); - if (flag & OC_REQUEST_FLAG) { NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG"); - if (OC_REST_POST == entityHandlerRequest->method) + if (OC_REST_GET == entityHandlerRequest->method) + { + reqInterface = + NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE); + + if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0 + && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0) + { + NS_LOG(ERROR, "Invalid interface"); + return ehResult; + } + + ehResult = OC_EH_OK; + } + else if (OC_REST_POST == entityHandlerRequest->method) { /** Receive sync data from consumer which read or dismiss notification message. And broadcast the sync data to all subscribers including provider app @@ -156,12 +196,17 @@ OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag, NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_POST"); - NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ, - NSGetSyncInfo(entityHandlerRequest->payload)); - + if(NSProviderIsSyncAttributes((OCRepPayload *)entityHandlerRequest->payload)) + { + NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ, + NSGetSyncInfo(entityHandlerRequest->payload)); + ehResult = OC_EH_OK; + } + } + else + { + NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method); } - - NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method); } if (flag & OC_OBSERVE_FLAG) @@ -191,34 +236,25 @@ OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag, } } - response.requestHandle = entityHandlerRequest->requestHandle; - response.resourceHandle = entityHandlerRequest->resource; - response.persistentBufferFlag = 0; - response.ehResult = OC_EH_OK; - response.payload = (OCPayload *) NULL; - - if (OCDoResponse(&response) != OC_STACK_OK) - { - NS_LOG(ERROR, "Fail to AccessPolicy send response"); - return OC_EH_ERROR; - } - NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OUT"); - return ehResult; + return NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult, + NS_INTERFACE_TYPE_READWRITE, NS_RESOURCE_SYNC); } OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag, OCEntityHandlerRequest *entityHandlerRequest, void* callback) { NS_LOG(DEBUG, "NSEntityHandlerTopicCb - IN"); - OCEntityHandlerResult ehResult = OC_EH_OK; + OCEntityHandlerResult ehResult = OC_EH_ERROR; + char * reqInterface = NULL; + OCRepPayload * payload = NULL; (void)callback; if (!entityHandlerRequest) { NS_LOG(ERROR, "Invalid request pointer"); - return OC_EH_ERROR; + return ehResult; } if (flag & OC_REQUEST_FLAG) @@ -229,6 +265,15 @@ OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag, { NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_GET"); + reqInterface = + NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE); + + if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0 + && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0) + { + NS_LOG(ERROR, "Invalid interface"); + return ehResult; + } // send consumer's interesting topic list if consumer id exists // otherwise send registered topic list NSPushQueue(TOPIC_SCHEDULER, TASK_SEND_TOPICS, @@ -242,33 +287,13 @@ OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag, // Send topic notice message(id = TOPIC) to the consumer // which requests to post. NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_POST"); - // Accepter is provider. our service is not support sendtopiclist from OC_REST_POST - ehResult = OC_EH_ERROR; - // Accepter is consumer. our service is support sendtopiclist from OC_REST_POST if(NSGetPolicy() == false) { NSPushQueue(TOPIC_SCHEDULER, TASK_POST_TOPIC, NSCopyOCEntityHandlerRequest(entityHandlerRequest)); ehResult = OC_EH_OK; - OCEntityHandlerResponse response; - response.numSendVendorSpecificHeaderOptions = 0; - memset(response.sendVendorSpecificHeaderOptions, 0, - sizeof response.sendVendorSpecificHeaderOptions); - memset(response.resourceUri, 0, sizeof response.resourceUri); - - response.requestHandle = entityHandlerRequest->requestHandle; - response.resourceHandle = entityHandlerRequest->resource; - response.persistentBufferFlag = 0; - response.ehResult = ehResult; - response.payload = (OCPayload *) NULL; - - if (OCDoResponse(&response) != OC_STACK_OK) - { - NS_LOG(ERROR, "Fail to AccessPolicy send response"); - return OC_EH_ERROR; - } } } else @@ -280,12 +305,12 @@ OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag, } NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OUT"); - return ehResult; + return NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult, + NS_INTERFACE_TYPE_READWRITE, NS_RESOURCE_TOPIC); } void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected) { - NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN"); if (connected) @@ -305,7 +330,6 @@ void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected } else { - NS_LOG(DEBUG, "DISCONNECTED"); // Set Connection State @@ -348,3 +372,173 @@ void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled) NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT"); } +bool NSProviderCompareSyncAttributes(const char * name) +{ + if (!strcmp(name, NS_ATTRIBUTE_MESSAGE_ID) || + !strcmp(name, NS_ATTRIBUTE_PROVIDER_ID) || + !strcmp(name, NS_ATTRIBUTE_STATE)) + { + return true; + } + + return false; +} + +bool NSProviderIsSyncAttributes(OCRepPayload * payload) +{ + NS_LOG(DEBUG, "get extra info"); + + OCRepPayloadValue * curr = payload->values; + while(curr) + { + if (!NSProviderCompareSyncAttributes(curr->name)) + { + return false; + } + curr = curr->next; + } + + return true; +} + +bool NSProviderCompareTopicAttributes(const char * name) +{ + if (!strcmp(name, NS_ATTRIBUTE_TOPIC_LIST) || + !strcmp(name, NS_ATTRIBUTE_CONSUMER_ID)) + { + return true; + } + + return false; +} + +bool NSProviderCompareSubTopicAttributes(const char * name) +{ + if (!strcmp(name, NS_ATTRIBUTE_TOPIC_NAME) || + !strcmp(name, NS_ATTRIBUTE_TOPIC_SELECTION)) + { + return true; + } + + return false; +} + +bool NSProviderIsTopicAttributes(OCRepPayload * payload) +{ + NS_LOG(DEBUG, "get extra info"); + + OCRepPayloadValue * curr = payload->values; + while(curr) + { + if (!NSProviderCompareSyncAttributes(curr->name)) + { + return false; + } + + if (!strcmp(curr->name, NS_ATTRIBUTE_TOPIC_LIST)) + { + OCRepPayload ** topicListPayload = NULL; + OCRepPayloadValue * payloadValue = NULL; + payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST); + size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions); + size_t dimensions[3] = { dimensionSize, 0, 0 }; + + if (!dimensionSize) + { + return false; + } + + OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload, + dimensions); + + for (int i = 0; i < (int) dimensionSize; i++) + { + OCRepPayloadValue * subCurr = topicListPayload[i]->values; + while(subCurr) + { + if (!NSProviderCompareSubTopicAttributes(subCurr->name)) + { + for(int j = i; j < (int) dimensionSize; ++j) + { + OCRepPayloadDestroy(topicListPayload[i]); + } + + OCRepPayloadDestroy(payload); + return false; + } + subCurr = subCurr->next; + } + OCRepPayloadDestroy(topicListPayload[i]); + } + } + curr = curr->next; + } + + OCRepPayloadDestroy(payload); + return true; +} + +OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerRequest, + OCRepPayload * payload, char * reqInterface, OCEntityHandlerResult ehResult, + NSInterfaceType interfaceType, NSResourceType resourceType) +{ + if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0) + { + payload = OCRepPayloadCreate(); + + if (!payload) + { + NS_LOG(ERROR, "payload is NULL"); + return ehResult; + } + + OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE); + interfaceType == NS_INTERFACE_TYPE_READ ? + OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ) + : OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READWRITE); + + char * rtStr = NULL; + switch (resourceType) + { + case NS_RESOURCE_MESSAGE: + rtStr = NS_COLLECTION_MESSAGE_TYPE; + break; + case NS_RESOURCE_SYNC: + rtStr = NS_COLLECTION_SYNC_TYPE; + break; + case NS_RESOURCE_TOPIC: + rtStr = NS_COLLECTION_TOPIC_TYPE; + break; + default: + NS_LOG(ERROR, "sendResponseError"); + return ehResult; + } + + OCResourcePayloadAddStringLL(&payload->types, rtStr); + } + + if(resourceType != NS_RESOURCE_TOPIC) + { + OCEntityHandlerResponse response; + response.numSendVendorSpecificHeaderOptions = 0; + memset(response.sendVendorSpecificHeaderOptions, 0, + sizeof response.sendVendorSpecificHeaderOptions); + memset(response.resourceUri, 0, sizeof response.resourceUri); + + response.requestHandle = entityHandlerRequest->requestHandle; + response.resourceHandle = entityHandlerRequest->resource; + response.persistentBufferFlag = 0; + response.ehResult = ehResult; + response.payload = (OCPayload *) payload; + + if (OCDoResponse(&response) != OC_STACK_OK) + { + NS_LOG(ERROR, "Fail to AccessPolicy send response"); + OCRepPayloadDestroy(payload); + return ehResult; + } + } + + OCRepPayloadDestroy(payload); + return ehResult; +} diff --git a/service/notification/src/provider/NSProviderResource.c b/service/notification/src/provider/NSProviderResource.c index 83eaba4..2520c01 100644 --- a/service/notification/src/provider/NSProviderResource.c +++ b/service/notification/src/provider/NSProviderResource.c @@ -101,7 +101,7 @@ NSResult NSCreateResource(char *uri) resourceProperties = OC_DISCOVERABLE; } - if (OCCreateResource(&NotificationResource.handle, NS_ROOT_TYPE, NS_DEFAULT_INTERFACE, + if (OCCreateResource(&NotificationResource.handle, NS_ROOT_TYPE, NS_INTERFACE_BASELINE, NS_ROOT_URI, NSEntityHandlerNotificationCb, NULL, resourceProperties) != OC_STACK_OK) { @@ -142,7 +142,7 @@ NSResult NSCreateResource(char *uri) } if (OCCreateResource(&NotificationMessageResource.handle, NS_COLLECTION_MESSAGE_TYPE, - NS_DEFAULT_INTERFACE, NS_COLLECTION_MESSAGE_URI, NSEntityHandlerMessageCb, NULL, + NS_INTERFACE_BASELINE, NS_COLLECTION_MESSAGE_URI, NSEntityHandlerMessageCb, NULL, resourceProperties) != OC_STACK_OK) { NS_LOG(NS_ERROR, "Fail to Create Notification Message Resource"); @@ -174,7 +174,7 @@ NSResult NSCreateResource(char *uri) } if (OCCreateResource(&(NotificationSyncResource.handle), NS_COLLECTION_SYNC_TYPE, - NS_DEFAULT_INTERFACE, NS_COLLECTION_SYNC_URI, NSEntityHandlerSyncCb, NULL, + NS_INTERFACE_BASELINE, NS_COLLECTION_SYNC_URI, NSEntityHandlerSyncCb, NULL, resourceProperties) != OC_STACK_OK) { NS_LOG(NS_ERROR, "Fail to Create Notification Sync Resource"); @@ -207,7 +207,7 @@ NSResult NSCreateResource(char *uri) } if (OCCreateResource(&(NotificationTopicResource.handle), NS_COLLECTION_TOPIC_TYPE, - NS_DEFAULT_INTERFACE, NS_COLLECTION_TOPIC_URI, NSEntityHandlerTopicCb, NULL, + NS_INTERFACE_BASELINE, NS_COLLECTION_TOPIC_URI, NSEntityHandlerTopicCb, NULL, resourceProperties) != OC_STACK_OK) { NS_LOG(NS_ERROR, "Fail to Create Notification Sync Resource"); diff --git a/service/notification/src/provider/NSProviderSubscription.c b/service/notification/src/provider/NSProviderSubscription.c index c537c61..1c0d70b 100644 --- a/service/notification/src/provider/NSProviderSubscription.c +++ b/service/notification/src/provider/NSProviderSubscription.c @@ -80,6 +80,15 @@ NSResult NSSendAccessPolicyResponse(OCEntityHandlerRequest *entityHandlerRequest NS_LOG_V(DEBUG, "NS Provider ID: %s", NSGetProviderInfo()->providerId); + char * reqInterface = + NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE); + + if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0) + { + OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE); + OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ); + OCResourcePayloadAddStringLL(&payload->types, NS_ROOT_TYPE); + } OCRepPayloadSetUri(payload, NS_ROOT_URI); OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId); OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_VERSION, VERSION); @@ -98,6 +107,7 @@ NSResult NSSendAccessPolicyResponse(OCEntityHandlerRequest *entityHandlerRequest if (OCDoResponse(&response) != OC_STACK_OK) { NS_LOG(ERROR, "Fail to AccessPolicy send response"); + OCRepPayloadDestroy(payload); return NS_ERROR; } OCRepPayloadDestroy(payload); @@ -304,7 +314,7 @@ NSResult NSSendConsumerSubResponse(OCEntityHandlerRequest * entityHandlerRequest if (!entityHandlerRequest) { NS_LOG(ERROR, "Invalid request pointer"); - return OC_EH_ERROR; + return NS_ERROR; } char * id = NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_CONSUMER_ID); diff --git a/service/notification/src/provider/NSProviderTopic.c b/service/notification/src/provider/NSProviderTopic.c index e83288e..4626fd7 100644 --- a/service/notification/src/provider/NSProviderTopic.c +++ b/service/notification/src/provider/NSProviderTopic.c @@ -319,6 +319,16 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest) (OCRepPayload **) NULL, dimensions); } + char * reqInterface = + NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE); + + if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0) + { + OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE); + OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ); + OCResourcePayloadAddStringLL(&payload->types, NS_ROOT_TYPE); + } + response.requestHandle = entityHandlerRequest->requestHandle; response.resourceHandle = entityHandlerRequest->resource; response.persistentBufferFlag = 0; @@ -363,8 +373,7 @@ NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest) OCRepPayloadValue * payloadValue = NULL; payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST); size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions); - size_t dimensions[3] = - { dimensionSize, 0, 0 }; + size_t dimensions[3] = { dimensionSize, 0, 0 }; OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload, dimensions); for (int i = 0; i < (int) dimensionSize; i++) @@ -383,7 +392,7 @@ NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest) NS_VERIFY_NOT_NULL(topicSubData, NS_FAIL); OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId); - topicSubData->topicName = OICStrdup(topicName); + topicSubData->topicName = topicName; NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement)); @@ -391,6 +400,7 @@ NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest) { OICFree(topicSubData->topicName); OICFree(topicSubData); + OICFree(consumerId); return NS_FAIL; } @@ -401,7 +411,7 @@ NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest) } } NSSendTopicUpdationToConsumer(consumerId); - + OICFree(consumerId); NS_LOG(DEBUG, "NSPostConsumerTopics() - OUT"); return NS_OK; } -- 2.7.4