Add logic for sending responses according to the interface of requests.
authorjaesick.shin <jaesick.shin@samsung.com>
Wed, 5 Oct 2016 08:39:16 +0000 (17:39 +0900)
committerUze Choi <uzchoi@samsung.com>
Mon, 10 Oct 2016 08:16:46 +0000 (08:16 +0000)
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 <jaesick.shin@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/12787
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
(cherry picked from commit c7a5965ec9778c92fa3a36431155d0697424e76f)
Reviewed-on: https://gerrit.iotivity.org/gerrit/12983

service/notification/src/common/NSConstants.h
service/notification/src/provider/NSProviderListener.c
service/notification/src/provider/NSProviderResource.c
service/notification/src/provider/NSProviderSubscription.c
service/notification/src/provider/NSProviderTopic.c

index 12c6f05..cbfca9a 100644 (file)
@@ -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_ */
index 8e1c653..f551541 100644 (file)
 \r
 #include "NSProviderListener.h"\r
 \r
+bool NSProviderIsSyncAttributes(OCRepPayload * payload);\r
+bool NSProviderIsTopicAttributes(OCRepPayload * payload);\r
+OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerRequest,\r
+        OCRepPayload * payload, char * reqInterface, OCEntityHandlerResult ehResult,\r
+        NSInterfaceType interfaceType, NSResourceType resourceType);\r
+\r
 OCEntityHandlerResult NSEntityHandlerNotificationCb(OCEntityHandlerFlag flag,\r
         OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
 {\r
     NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - IN");\r
 \r
-    OCEntityHandlerResult ehResult = OC_EH_OK;\r
+    OCEntityHandlerResult ehResult = OC_EH_ERROR;\r
 \r
     (void)callback;\r
 \r
     if (!entityHandlerRequest)\r
     {\r
         NS_LOG(ERROR, "Invalid request pointer");\r
-        return OC_EH_ERROR;\r
+        return ehResult;\r
     }\r
 \r
     if (flag & OC_REQUEST_FLAG)\r
@@ -43,9 +49,20 @@ OCEntityHandlerResult NSEntityHandlerNotificationCb(OCEntityHandlerFlag flag,
         {\r
             NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - OC_REST_GET");\r
 \r
+            char * reqInterface =\r
+                    NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE);\r
+\r
+            if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
+                    && strcmp(reqInterface, NS_INTERFACE_READ) != 0)\r
+            {\r
+                NS_LOG(ERROR, "Invalid interface");\r
+                return ehResult;\r
+            }\r
+\r
             NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_POLICY,\r
                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
 \r
+            ehResult = OC_EH_OK;\r
         }\r
         else\r
         {\r
@@ -62,26 +79,43 @@ OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag,
 {\r
     NS_LOG(DEBUG, "NSEntityHandlerMessageCb - IN");\r
 \r
-    OCEntityHandlerResult ehResult = OC_EH_OK;\r
+    OCEntityHandlerResult ehResult = OC_EH_ERROR;\r
+    char * reqInterface = NULL;\r
+    OCRepPayload * payload = NULL;\r
 \r
     (void)callback;\r
 \r
     if (!entityHandlerRequest)\r
     {\r
         NS_LOG (ERROR,"Invalid request pointer");\r
-        return OC_EH_ERROR;\r
+        return ehResult;\r
     }\r
 \r
-    OCEntityHandlerResponse response;\r
-    response.numSendVendorSpecificHeaderOptions = 0;\r
-    memset(response.sendVendorSpecificHeaderOptions, 0,\r
-            sizeof response.sendVendorSpecificHeaderOptions);\r
-    memset(response.resourceUri, 0, sizeof response.resourceUri);\r
-\r
     if (flag & OC_REQUEST_FLAG)\r
     {\r
         NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");\r
         NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
+\r
+        if (OC_REST_GET == entityHandlerRequest->method)\r
+        {\r
+            NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_REST_GET");\r
+\r
+            reqInterface =\r
+                    NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE);\r
+\r
+            if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
+                    && strcmp(reqInterface, NS_INTERFACE_READ) != 0)\r
+            {\r
+                NS_LOG(ERROR, "Invalid interface");\r
+                return ehResult;\r
+            }\r
+\r
+            ehResult = OC_EH_OK;\r
+        }\r
+        else\r
+        {\r
+            NS_LOG_V (DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
+        }\r
     }\r
 \r
     if (flag & OC_OBSERVE_FLAG)\r
@@ -97,6 +131,12 @@ OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag,
                     "Register message observerID : %d\n", entityHandlerRequest->obsInfo.obsId);\r
             NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_SUBSCRIPTION,\r
                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
+            ehResult = OC_EH_OK;\r
+\r
+            if (NSGetPolicy() == NS_POLICY_CONSUMER)\r
+            {\r
+                return ehResult;\r
+            }\r
         }\r
         else if(ocObAction == OC_OBSERVE_DEREGISTER)\r
         {\r
@@ -105,50 +145,50 @@ OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag,
                     "Deregister Message observerID : %d\n", entityHandlerRequest->obsInfo.obsId);\r
             NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_UNSUBSCRIPTION,\r
                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
+            ehResult = OC_EH_OK;\r
         }\r
     }\r
 \r
-    response.requestHandle = entityHandlerRequest->requestHandle;\r
-    response.resourceHandle = entityHandlerRequest->resource;\r
-    response.persistentBufferFlag = 0;\r
-    response.ehResult = OC_EH_OK;\r
-    response.payload = (OCPayload *) NULL;\r
-\r
-    if (OCDoResponse(&response) != OC_STACK_OK)\r
-    {\r
-        NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
-        return NS_ERROR;\r
-    }\r
-\r
     NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OUT");\r
-    return ehResult;\r
+    return NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,\r
+            NS_INTERFACE_TYPE_READ, NS_RESOURCE_MESSAGE);\r
 }\r
 \r
 OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,\r
         OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
 {\r
     NS_LOG(DEBUG, "NSEntityHandlerSyncCb - IN");\r
-    OCEntityHandlerResult ehResult = OC_EH_OK;\r
+    OCEntityHandlerResult ehResult = OC_EH_ERROR;\r
+    char * reqInterface = NULL;\r
+    OCRepPayload * payload = NULL;\r
 \r
     (void)callback;\r
 \r
     if (!entityHandlerRequest)\r
     {\r
         NS_LOG(ERROR, "Invalid request pointer");\r
-        return OC_EH_ERROR;\r
+        return ehResult;\r
     }\r
 \r
-    OCEntityHandlerResponse response;\r
-    response.numSendVendorSpecificHeaderOptions = 0;\r
-    memset(response.sendVendorSpecificHeaderOptions, 0,\r
-            sizeof response.sendVendorSpecificHeaderOptions);\r
-    memset(response.resourceUri, 0, sizeof response.resourceUri);\r
-\r
     if (flag & OC_REQUEST_FLAG)\r
     {\r
         NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");\r
 \r
-        if (OC_REST_POST == entityHandlerRequest->method)\r
+        if (OC_REST_GET == entityHandlerRequest->method)\r
+        {\r
+            reqInterface =\r
+                    NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE);\r
+\r
+            if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
+                    && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0)\r
+            {\r
+                NS_LOG(ERROR, "Invalid interface");\r
+                return ehResult;\r
+            }\r
+\r
+            ehResult = OC_EH_OK;\r
+        }\r
+        else if (OC_REST_POST == entityHandlerRequest->method)\r
         {\r
             /** Receive sync data from consumer which read or dismiss notification message.\r
                 And broadcast the sync data to all subscribers including provider app\r
@@ -156,12 +196,17 @@ OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,
 \r
             NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_POST");\r
 \r
-            NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ,\r
-                    NSGetSyncInfo(entityHandlerRequest->payload));\r
-\r
+            if(NSProviderIsSyncAttributes((OCRepPayload *)entityHandlerRequest->payload))\r
+            {\r
+                NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ,\r
+                                    NSGetSyncInfo(entityHandlerRequest->payload));\r
+                ehResult = OC_EH_OK;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
         }\r
-\r
-        NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
     }\r
 \r
     if (flag & OC_OBSERVE_FLAG)\r
@@ -191,34 +236,25 @@ OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,
         }\r
     }\r
 \r
-    response.requestHandle = entityHandlerRequest->requestHandle;\r
-    response.resourceHandle = entityHandlerRequest->resource;\r
-    response.persistentBufferFlag = 0;\r
-    response.ehResult = OC_EH_OK;\r
-    response.payload = (OCPayload *) NULL;\r
-\r
-    if (OCDoResponse(&response) != OC_STACK_OK)\r
-    {\r
-        NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
-        return OC_EH_ERROR;\r
-    }\r
-\r
     NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OUT");\r
-    return ehResult;\r
+    return NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,\r
+            NS_INTERFACE_TYPE_READWRITE, NS_RESOURCE_SYNC);\r
 }\r
 \r
 OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag,\r
         OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
 {\r
     NS_LOG(DEBUG, "NSEntityHandlerTopicCb - IN");\r
-    OCEntityHandlerResult ehResult = OC_EH_OK;\r
+    OCEntityHandlerResult ehResult = OC_EH_ERROR;\r
+    char * reqInterface = NULL;\r
+    OCRepPayload * payload = NULL;\r
 \r
     (void)callback;\r
 \r
     if (!entityHandlerRequest)\r
     {\r
         NS_LOG(ERROR, "Invalid request pointer");\r
-        return OC_EH_ERROR;\r
+        return ehResult;\r
     }\r
 \r
     if (flag & OC_REQUEST_FLAG)\r
@@ -229,6 +265,15 @@ OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag,
         {\r
             NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_GET");\r
 \r
+            reqInterface =\r
+                    NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE);\r
+\r
+            if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
+                    && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0)\r
+            {\r
+                NS_LOG(ERROR, "Invalid interface");\r
+                return ehResult;\r
+            }\r
             // send consumer's interesting topic list if consumer id exists\r
             // otherwise send  registered topic list\r
             NSPushQueue(TOPIC_SCHEDULER, TASK_SEND_TOPICS,\r
@@ -242,33 +287,13 @@ OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag,
             // Send topic notice message(id = TOPIC) to the consumer \r
             // which requests to post.\r
             NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_POST");\r
-\r
             // Accepter is provider. our service is not support sendtopiclist from OC_REST_POST\r
-            ehResult = OC_EH_ERROR;\r
-\r
             // Accepter is consumer. our service is support sendtopiclist from OC_REST_POST\r
             if(NSGetPolicy() == false)\r
             {\r
                 NSPushQueue(TOPIC_SCHEDULER, TASK_POST_TOPIC,\r
                         NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
                 ehResult = OC_EH_OK;\r
-                OCEntityHandlerResponse response;\r
-                response.numSendVendorSpecificHeaderOptions = 0;\r
-                memset(response.sendVendorSpecificHeaderOptions, 0,\r
-                        sizeof response.sendVendorSpecificHeaderOptions);\r
-                memset(response.resourceUri, 0, sizeof response.resourceUri);\r
-\r
-                response.requestHandle = entityHandlerRequest->requestHandle;\r
-                response.resourceHandle = entityHandlerRequest->resource;\r
-                response.persistentBufferFlag = 0;\r
-                response.ehResult = ehResult;\r
-                response.payload = (OCPayload *) NULL;\r
-\r
-                if (OCDoResponse(&response) != OC_STACK_OK)\r
-                {\r
-                    NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
-                    return OC_EH_ERROR;\r
-                }\r
             }\r
         }\r
         else\r
@@ -280,12 +305,12 @@ OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag,
     }\r
 \r
     NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OUT");\r
-    return ehResult;\r
+    return NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,\r
+            NS_INTERFACE_TYPE_READWRITE, NS_RESOURCE_TOPIC);\r
 }\r
 \r
 void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected)\r
 {\r
-\r
     NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");\r
 \r
     if (connected)\r
@@ -305,7 +330,6 @@ void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected
     }\r
     else\r
     {\r
-\r
         NS_LOG(DEBUG, "DISCONNECTED");\r
 \r
         // Set Connection State\r
@@ -348,3 +372,173 @@ void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)
     NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT");\r
 }\r
 \r
+bool NSProviderCompareSyncAttributes(const char * name)\r
+{\r
+    if (!strcmp(name, NS_ATTRIBUTE_MESSAGE_ID) ||\r
+        !strcmp(name, NS_ATTRIBUTE_PROVIDER_ID) ||\r
+        !strcmp(name, NS_ATTRIBUTE_STATE))\r
+    {\r
+        return true;\r
+    }\r
+\r
+    return false;\r
+}\r
+\r
+bool NSProviderIsSyncAttributes(OCRepPayload * payload)\r
+{\r
+    NS_LOG(DEBUG, "get extra info");\r
+\r
+    OCRepPayloadValue * curr = payload->values;\r
+    while(curr)\r
+    {\r
+        if (!NSProviderCompareSyncAttributes(curr->name))\r
+        {\r
+            return false;\r
+        }\r
+        curr = curr->next;\r
+    }\r
+\r
+    return true;\r
+}\r
+\r
+bool NSProviderCompareTopicAttributes(const char * name)\r
+{\r
+    if (!strcmp(name, NS_ATTRIBUTE_TOPIC_LIST) ||\r
+        !strcmp(name, NS_ATTRIBUTE_CONSUMER_ID))\r
+    {\r
+        return true;\r
+    }\r
+\r
+    return false;\r
+}\r
+\r
+bool NSProviderCompareSubTopicAttributes(const char * name)\r
+{\r
+    if (!strcmp(name, NS_ATTRIBUTE_TOPIC_NAME) ||\r
+        !strcmp(name, NS_ATTRIBUTE_TOPIC_SELECTION))\r
+    {\r
+        return true;\r
+    }\r
+\r
+    return false;\r
+}\r
+\r
+bool NSProviderIsTopicAttributes(OCRepPayload * payload)\r
+{\r
+    NS_LOG(DEBUG, "get extra info");\r
+\r
+    OCRepPayloadValue * curr = payload->values;\r
+    while(curr)\r
+    {\r
+        if (!NSProviderCompareSyncAttributes(curr->name))\r
+        {\r
+            return false;\r
+        }\r
+\r
+        if (!strcmp(curr->name, NS_ATTRIBUTE_TOPIC_LIST))\r
+        {\r
+            OCRepPayload ** topicListPayload = NULL;\r
+            OCRepPayloadValue * payloadValue = NULL;\r
+            payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);\r
+            size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);\r
+            size_t dimensions[3] = { dimensionSize, 0, 0 };\r
+\r
+            if (!dimensionSize)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload,\r
+                    dimensions);\r
+\r
+            for (int i = 0; i < (int) dimensionSize; i++)\r
+            {\r
+                OCRepPayloadValue * subCurr = topicListPayload[i]->values;\r
+                while(subCurr)\r
+                {\r
+                    if (!NSProviderCompareSubTopicAttributes(subCurr->name))\r
+                    {\r
+                        for(int j = i; j < (int) dimensionSize; ++j)\r
+                        {\r
+                            OCRepPayloadDestroy(topicListPayload[i]);\r
+                        }\r
+\r
+                        OCRepPayloadDestroy(payload);\r
+                        return false;\r
+                    }\r
+                    subCurr = subCurr->next;\r
+                }\r
+                OCRepPayloadDestroy(topicListPayload[i]);\r
+            }\r
+        }\r
+        curr = curr->next;\r
+    }\r
+\r
+    OCRepPayloadDestroy(payload);\r
+    return true;\r
+}\r
+\r
+OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerRequest,\r
+        OCRepPayload * payload, char * reqInterface, OCEntityHandlerResult ehResult,\r
+        NSInterfaceType interfaceType, NSResourceType resourceType)\r
+{\r
+    if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)\r
+    {\r
+        payload = OCRepPayloadCreate();\r
+\r
+        if (!payload)\r
+        {\r
+            NS_LOG(ERROR, "payload is NULL");\r
+            return ehResult;\r
+        }\r
+\r
+        OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);\r
+        interfaceType == NS_INTERFACE_TYPE_READ ?\r
+                OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ)\r
+                : OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READWRITE);\r
+\r
+        char * rtStr = NULL;\r
+        switch (resourceType)\r
+        {\r
+            case NS_RESOURCE_MESSAGE:\r
+                rtStr = NS_COLLECTION_MESSAGE_TYPE;\r
+                break;\r
+            case NS_RESOURCE_SYNC:\r
+                rtStr = NS_COLLECTION_SYNC_TYPE;\r
+                break;\r
+            case NS_RESOURCE_TOPIC:\r
+                rtStr = NS_COLLECTION_TOPIC_TYPE;\r
+                break;\r
+            default:\r
+                NS_LOG(ERROR, "sendResponseError");\r
+                return ehResult;\r
+        }\r
+\r
+        OCResourcePayloadAddStringLL(&payload->types, rtStr);\r
+    }\r
+\r
+    if(resourceType != NS_RESOURCE_TOPIC)\r
+    {\r
+        OCEntityHandlerResponse response;\r
+        response.numSendVendorSpecificHeaderOptions = 0;\r
+        memset(response.sendVendorSpecificHeaderOptions, 0,\r
+                sizeof response.sendVendorSpecificHeaderOptions);\r
+        memset(response.resourceUri, 0, sizeof response.resourceUri);\r
+\r
+        response.requestHandle = entityHandlerRequest->requestHandle;\r
+        response.resourceHandle = entityHandlerRequest->resource;\r
+        response.persistentBufferFlag = 0;\r
+        response.ehResult = ehResult;\r
+        response.payload = (OCPayload *) payload;\r
+\r
+        if (OCDoResponse(&response) != OC_STACK_OK)\r
+        {\r
+            NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
+            OCRepPayloadDestroy(payload);\r
+            return ehResult;\r
+        }\r
+    }\r
+\r
+    OCRepPayloadDestroy(payload);\r
+    return ehResult;\r
+}\r
index 83eaba4..2520c01 100644 (file)
@@ -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");
index c537c61..1c0d70b 100644 (file)
@@ -80,6 +80,15 @@ NSResult NSSendAccessPolicyResponse(OCEntityHandlerRequest *entityHandlerRequest
 \r
     NS_LOG_V(DEBUG, "NS Provider ID: %s", NSGetProviderInfo()->providerId);\r
 \r
+    char * reqInterface =\r
+            NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE);\r
+\r
+    if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)\r
+    {\r
+        OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);\r
+        OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ);\r
+        OCResourcePayloadAddStringLL(&payload->types, NS_ROOT_TYPE);\r
+    }\r
     OCRepPayloadSetUri(payload, NS_ROOT_URI);\r
     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_VERSION, VERSION);\r
@@ -98,6 +107,7 @@ NSResult NSSendAccessPolicyResponse(OCEntityHandlerRequest *entityHandlerRequest
     if (OCDoResponse(&response) != OC_STACK_OK)\r
     {\r
         NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
+        OCRepPayloadDestroy(payload);\r
         return NS_ERROR;\r
     }\r
     OCRepPayloadDestroy(payload);\r
@@ -304,7 +314,7 @@ NSResult NSSendConsumerSubResponse(OCEntityHandlerRequest * entityHandlerRequest
     if (!entityHandlerRequest)\r
     {\r
         NS_LOG(ERROR, "Invalid request pointer");\r
-        return OC_EH_ERROR;\r
+        return NS_ERROR;\r
     }\r
 \r
     char * id = NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_CONSUMER_ID);\r
index e83288e..4626fd7 100644 (file)
@@ -319,6 +319,16 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest)
                 (OCRepPayload **) NULL, dimensions);\r
     }\r
 \r
+    char * reqInterface =\r
+            NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE);\r
+\r
+    if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)\r
+    {\r
+        OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);\r
+        OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ);\r
+        OCResourcePayloadAddStringLL(&payload->types, NS_ROOT_TYPE);\r
+    }\r
+\r
     response.requestHandle = entityHandlerRequest->requestHandle;\r
     response.resourceHandle = entityHandlerRequest->resource;\r
     response.persistentBufferFlag = 0;\r
@@ -363,8 +373,7 @@ NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest)
     OCRepPayloadValue * payloadValue = NULL;\r
     payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);\r
     size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);\r
-    size_t dimensions[3] =\r
-    { dimensionSize, 0, 0 };\r
+    size_t dimensions[3] = { dimensionSize, 0, 0 };\r
     OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload, dimensions);\r
 \r
     for (int i = 0; i < (int) dimensionSize; i++)\r
@@ -383,7 +392,7 @@ NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest)
             NS_VERIFY_NOT_NULL(topicSubData, NS_FAIL);\r
 \r
             OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId);\r
-            topicSubData->topicName = OICStrdup(topicName);\r
+            topicSubData->topicName = topicName;\r
 \r
             NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
 \r
@@ -391,6 +400,7 @@ NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest)
             {\r
                 OICFree(topicSubData->topicName);\r
                 OICFree(topicSubData);\r
+                OICFree(consumerId);\r
                 return NS_FAIL;\r
             }\r
 \r
@@ -401,7 +411,7 @@ NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest)
         }\r
     }\r
     NSSendTopicUpdationToConsumer(consumerId);\r
-\r
+    OICFree(consumerId);\r
     NS_LOG(DEBUG, "NSPostConsumerTopics() - OUT");\r
     return NS_OK;\r
 }\r