replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderSubscription.c
index db2b8a0..3116cbb 100644 (file)
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
 \r
 #include "NSProviderSubscription.h"\r
+#include "NSProviderListener.h"\r
 \r
 NSResult NSInitSubscriptionList()\r
 {\r
     NS_LOG(DEBUG, "NSInitSubscriptionList - IN");\r
 \r
-    consumerSubList = NSStorageCreate();\r
+    consumerSubList = NSProviderStorageCreate();\r
+    NS_VERIFY_NOT_NULL(consumerSubList, NS_FAIL);\r
     consumerSubList->cacheType = NS_PROVIDER_CACHE_SUBSCRIBER;\r
 \r
     NS_LOG(DEBUG, "NSInitSubscriptionList - OUT");\r
@@ -77,11 +79,23 @@ NSResult NSSendAccessPolicyResponse(OCEntityHandlerRequest *entityHandlerRequest
         return NS_ERROR;\r
     }\r
 \r
-    NS_LOG_V(DEBUG, "NS Provider ID: %s", NSGetProviderInfo()->providerId);\r
+    NS_LOG_V(INFO_PRIVATE, "NS Provider ID: %s", NSGetProviderInfo()->providerId);\r
 \r
+    char * copyReq = OICStrdup(entityHandlerRequest->query);\r
+    char * reqInterface = NSGetValueFromQuery(copyReq, 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
+    NSOICFree(copyReq);\r
     OCRepPayloadSetUri(payload, NS_ROOT_URI);\r
     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
-    OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_POLICY, NSGetPolicy());\r
+    OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_VERSION, VERSION);\r
+    OCRepPayloadSetPropBool(payload, NS_ATTRIBUTE_POLICY, NSGetPolicy());\r
     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_MESSAGE, NS_COLLECTION_MESSAGE_URI);\r
     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_SYNC, NS_COLLECTION_SYNC_URI);\r
     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_TOPIC, NS_COLLECTION_TOPIC_URI);\r
@@ -96,6 +110,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
@@ -109,34 +124,38 @@ void NSHandleSubscription(OCEntityHandlerRequest *entityHandlerRequest, NSResour
 {\r
     NS_LOG(DEBUG, "NSHandleSubscription - IN");\r
 \r
-    char * id = NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_CONSUMER_ID);\r
+    char * copyReq = OICStrdup(entityHandlerRequest->query);\r
+    char * id = NSGetValueFromQuery(copyReq, NS_QUERY_CONSUMER_ID);\r
 \r
-    if(!id)\r
+    if (!id)\r
     {\r
+        NSOICFree(copyReq);\r
         NSFreeOCEntityHandlerRequest(entityHandlerRequest);\r
         NS_LOG(ERROR, "Invalid ConsumerID");\r
         return;\r
     }\r
 \r
-    NS_LOG_V(DEBUG, "consumerId = %s", id);\r
+    NS_LOG_V(INFO_PRIVATE, "consumerId = %s", id);\r
     if (resourceType == NS_RESOURCE_MESSAGE)\r
     {\r
         NS_LOG(DEBUG, "resourceType == NS_RESOURCE_MESSAGE");\r
         NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
+        NS_VERIFY_NOT_NULL_V(element);\r
         NSCacheSubData * subData = (NSCacheSubData *) OICMalloc(sizeof(NSCacheSubData));\r
+        NS_VERIFY_NOT_NULL_V(subData);\r
 \r
         OICStrcpy(subData->id, UUID_STRING_SIZE, id);\r
-        NS_LOG_V(DEBUG, "SubList ID = [%s]", subData->id);\r
+        NS_LOG_V(INFO_PRIVATE, "SubList ID = [%s]", subData->id);\r
 \r
-        NS_LOG_V(DEBUG, "Consumer Address: %s", entityHandlerRequest->devAddr.addr);\r
+        NS_LOG_V(INFO_PRIVATE, "Consumer Address: %s", entityHandlerRequest->devAddr.addr);\r
 \r
         subData->remote_messageObId = subData->messageObId = 0;\r
 \r
         bool iSRemoteServer = false;\r
 \r
-#ifdef RD_CLIEND\r
+#if(defined WITH_CLOUD)\r
         iSRemoteServer = NSIsRemoteServerAddress(entityHandlerRequest->devAddr.addr);\r
-        if(iSRemoteServer)\r
+        if (iSRemoteServer)\r
         {\r
             NS_LOG(DEBUG, "Requested by remote server");\r
             subData->remote_messageObId = entityHandlerRequest->obsInfo.obsId;\r
@@ -144,7 +163,7 @@ void NSHandleSubscription(OCEntityHandlerRequest *entityHandlerRequest, NSResour
         }\r
 #endif\r
 \r
-        if(!iSRemoteServer)\r
+        if (!iSRemoteServer)\r
         {\r
             NS_LOG(DEBUG, "Requested by local consumer");\r
             subData->messageObId = entityHandlerRequest->obsInfo.obsId;\r
@@ -158,41 +177,45 @@ void NSHandleSubscription(OCEntityHandlerRequest *entityHandlerRequest, NSResour
         element->data = (void*) subData;\r
         element->next = NULL;\r
 \r
-        if (NSStorageWrite(consumerSubList, element) != NS_OK)\r
+        if (NSProviderStorageWrite(consumerSubList, element) != NS_OK)\r
         {\r
             NS_LOG(DEBUG, "fail to write cache");\r
         }\r
 \r
         bool currPolicy = NSGetPolicy();\r
+        NSAskAcceptanceToUser(NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
 \r
         if (currPolicy == NS_POLICY_PROVIDER)\r
         {\r
             NS_LOG(DEBUG, "NSGetSubscriptionAccepter == NS_ACCEPTER_PROVIDER");\r
-            NSAskAcceptanceToUser(entityHandlerRequest);\r
         }\r
         else if (currPolicy == NS_POLICY_CONSUMER)\r
         {\r
             NS_LOG(DEBUG, "NSGetSubscriptionAccepter == NS_ACCEPTER_CONSUMER");\r
-            NSSendSubscriptionResponse(entityHandlerRequest, true);\r
+            NSSendConsumerSubResponse(NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
         }\r
+\r
+        NSFreeOCEntityHandlerRequest(entityHandlerRequest);\r
     }\r
     else if (resourceType == NS_RESOURCE_SYNC)\r
     {\r
         NS_LOG(DEBUG, "resourceType == NS_RESOURCE_SYNC");\r
         NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
+        NS_VERIFY_NOT_NULL_V(element);\r
         NSCacheSubData * subData = (NSCacheSubData *) OICMalloc(sizeof(NSCacheSubData));\r
+        NS_VERIFY_NOT_NULL_V(subData);\r
 \r
         OICStrcpy(subData->id, UUID_STRING_SIZE, id);\r
-        NS_LOG_V(DEBUG, "SubList ID = [%s]", subData->id);\r
+        NS_LOG_V(INFO_PRIVATE, "SubList ID = [%s]", subData->id);\r
 \r
-        NS_LOG_V(DEBUG, "Consumer Address: %s", entityHandlerRequest->devAddr.addr);\r
+        NS_LOG_V(INFO_PRIVATE, "Consumer Address: %s", entityHandlerRequest->devAddr.addr);\r
 \r
         subData->remote_syncObId = subData->syncObId = 0;\r
         bool isRemoteServer = false;\r
 \r
-#ifdef RD_CLIENT\r
+#if (defined WITH_CLOUD)\r
         isRemoteServer = NSIsRemoteServerAddress(entityHandlerRequest->devAddr.addr);\r
-        if(isRemoteServer)\r
+        if (isRemoteServer)\r
         {\r
             NS_LOG(DEBUG, "Requested by remote server");\r
             subData->remote_syncObId = entityHandlerRequest->obsInfo.obsId;\r
@@ -200,7 +223,7 @@ void NSHandleSubscription(OCEntityHandlerRequest *entityHandlerRequest, NSResour
         }\r
 #endif\r
 \r
-        if(!isRemoteServer)\r
+        if (!isRemoteServer)\r
         {\r
             NS_LOG(DEBUG, "Requested by local consumer");\r
             subData->syncObId = entityHandlerRequest->obsInfo.obsId;\r
@@ -214,13 +237,14 @@ void NSHandleSubscription(OCEntityHandlerRequest *entityHandlerRequest, NSResour
         element->data = (void*) subData;\r
         element->next = NULL;\r
 \r
-        if (NSStorageWrite(consumerSubList, element) != NS_OK)\r
+        if (NS_OK != NSProviderStorageWrite(consumerSubList, element))\r
         {\r
             NS_LOG(ERROR, "Fail to write cache");\r
         }\r
 \r
         NSFreeOCEntityHandlerRequest(entityHandlerRequest);\r
     }\r
+    NSOICFree(copyReq);\r
 \r
     NS_LOG(DEBUG, "NSHandleSubscription - OUT");\r
 }\r
@@ -229,10 +253,13 @@ void NSHandleUnsubscription(OCEntityHandlerRequest *entityHandlerRequest)
 {\r
     NS_LOG(DEBUG, "NSHandleUnsubscription - IN");\r
 \r
-    NSProviderDeleteSubDataFromObId(consumerSubList, entityHandlerRequest->obsInfo.obsId);\r
+    consumerSubList->cacheType = NS_PROVIDER_CACHE_SUBSCRIBER_OBSERVE_ID;\r
 \r
-    NSFreeOCEntityHandlerRequest(entityHandlerRequest);\r
+    while (NSProviderStorageDelete(consumerSubList, (char *)\r
+            &(entityHandlerRequest->obsInfo.obsId)) != NS_FAIL);\r
 \r
+    consumerSubList->cacheType = NS_PROVIDER_CACHE_SUBSCRIBER;\r
+    NSFreeOCEntityHandlerRequest(entityHandlerRequest);\r
     NS_LOG(DEBUG, "NSHandleUnsubscription - OUT");\r
 }\r
 \r
@@ -268,78 +295,90 @@ NSResult NSSendResponse(const char * id, bool accepted)
         : OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, NS_DENY);\r
     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
 \r
-    NSCacheElement * element = NSStorageRead(consumerSubList, id);\r
+    NSCacheElement * element = NSProviderStorageRead(consumerSubList, id);\r
 \r
-    if(element == NULL)\r
+    if (element == NULL)\r
     {\r
         NS_LOG(ERROR, "element is NULL");\r
         return NS_ERROR;\r
     }\r
+\r
     NSCacheSubData * subData = (NSCacheSubData*) element->data;\r
 \r
-    if (OCNotifyListOfObservers(rHandle, (OCObservationId*)&subData->messageObId, 1, payload, OC_LOW_QOS)\r
-            != OC_STACK_OK)\r
+    if (OCNotifyListOfObservers(rHandle, (OCObservationId*)&subData->messageObId, 1,\r
+            payload, OC_LOW_QOS) != OC_STACK_OK)\r
     {\r
         NS_LOG(ERROR, "fail to send Acceptance");\r
         OCRepPayloadDestroy(payload);\r
         return NS_ERROR;\r
 \r
     }\r
-    OCRepPayloadDestroy(payload);\r
 \r
+    OCRepPayloadDestroy(payload);\r
     NS_LOG(DEBUG, "NSSendResponse - OUT");\r
     return NS_OK;\r
 }\r
 \r
-NSResult NSSendSubscriptionResponse(OCEntityHandlerRequest *entityHandlerRequest, bool accepted)\r
+NSResult NSSendConsumerSubResponse(OCEntityHandlerRequest * entityHandlerRequest)\r
 {\r
     NS_LOG(DEBUG, "NSSendSubscriptionResponse - IN");\r
 \r
     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
+    char * copyReq = OICStrdup(entityHandlerRequest->query);\r
+    char * id = NSGetValueFromQuery(copyReq, NS_QUERY_CONSUMER_ID);\r
 \r
-    if(!id)\r
+    if (!id)\r
     {\r
+        NSOICFree(copyReq);\r
         NSFreeOCEntityHandlerRequest(entityHandlerRequest);\r
         NS_LOG(ERROR, "Invalid ConsumerID");\r
         return NS_ERROR;\r
     }\r
 \r
-    if (accepted)\r
-    {\r
-        NS_LOG(DEBUG, "accepted is true");\r
-        NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
-        NSCacheSubData * subData = (NSCacheSubData *) OICMalloc(sizeof(NSCacheSubData));\r
+    NSCacheUpdateSubScriptionState(consumerSubList, id, true);\r
+    NSSendResponse(id, true);\r
+    NSOICFree(copyReq);\r
+    NSFreeOCEntityHandlerRequest(entityHandlerRequest);\r
+    NS_LOG(DEBUG, "NSSendSubscriptionResponse - OUT");\r
+    return NS_OK;\r
+}\r
 \r
-        OICStrcpy(subData->id, UUID_STRING_SIZE, id);\r
+#ifdef WITH_MQ\r
+void NSProviderMQSubscription(NSMQTopicAddress * topicAddr)\r
+{\r
+    char * serverUri = topicAddr->serverAddr;\r
+    char * topicName = topicAddr->topicName;\r
 \r
-        subData->isWhite = true;\r
-        subData->remote_messageObId = 0;\r
-        subData->remote_syncObId = 0;\r
-        subData->syncObId = 0;\r
-        subData->messageObId = entityHandlerRequest->obsInfo.obsId;\r
+    NS_LOG_V(DEBUG, "input Topic Name2 : %s", topicAddr->topicName);\r
 \r
-        element->data = (void*) subData;\r
-        element->next = NULL;\r
+    OCDevAddr * addr = NSChangeAddress(serverUri);\r
+    OCCallbackData cbdata = { NULL, NULL, NULL };\r
+    cbdata.cb = NSProviderGetMQResponseCB;\r
+    cbdata.context = OICStrdup(topicName);\r
+    cbdata.cd = NSOICFree;\r
 \r
-        if (NSStorageWrite(consumerSubList, element) != NS_OK)\r
-        {\r
-            NS_LOG(ERROR, "fail to write consumer white list");\r
-        }\r
-    }\r
+    char requestUri[100] = "coap+tcp://";\r
 \r
-    NSSendResponse(id, accepted);\r
+    NS_LOG_V(DEBUG, "requestUri1 = %s", requestUri);\r
+    OICStrcat(requestUri, strlen(requestUri)+strlen(serverUri)+1, serverUri);\r
+    NS_LOG_V(DEBUG, "requestUri2 = %s", requestUri);\r
+    OICStrcat(requestUri, strlen(requestUri)+ strlen("/oic/ps") + 1, "/oic/ps");\r
+    NS_LOG_V(DEBUG, "requestUri3 = %s", requestUri);\r
+    OCStackResult ret = OCDoResource(NULL, OC_REST_GET, requestUri, addr,\r
+                                     NULL, CT_DEFAULT, OC_HIGH_QOS, &cbdata, NULL, 0);\r
 \r
-    NSFreeOCEntityHandlerRequest(entityHandlerRequest);\r
+    NSOCResultToSuccess(ret);\r
 \r
-    NS_LOG(DEBUG, "NSSendSubscriptionResponse - OUT");\r
-    return NS_OK;\r
+    NSOICFree(topicAddr->serverAddr);\r
+    NSOICFree(topicAddr->topicName);\r
+    NSOICFree(topicAddr);\r
 }\r
+#endif\r
 \r
 void * NSSubScriptionSchedule(void *ptr)\r
 {\r
@@ -379,21 +418,21 @@ void * NSSubScriptionSchedule(void *ptr)
                 case TASK_SEND_ALLOW:\r
                 {\r
                     NS_LOG(DEBUG, "CASE TASK_SEND_ALLOW : ");\r
-                    NSConsumer * consumer = (NSConsumer *) node->taskData;\r
+                    char * consumerId = (char *) node->taskData;\r
 \r
-                    NSCacheUpdateSubScriptionState(consumerSubList, consumer->consumerId, true);\r
-                    NSSendResponse(consumer->consumerId, true);\r
-                    NSFreeConsumer(consumer);\r
+                    NSCacheUpdateSubScriptionState(consumerSubList, consumerId, true);\r
+                    NSSendResponse(consumerId, true);\r
+                    NSOICFree(consumerId);\r
                     break;\r
                 }\r
                 case TASK_SEND_DENY:\r
                 {\r
                     NS_LOG(DEBUG, "CASE TASK_SEND_DENY : ");\r
-                    NSConsumer * consumer = (NSConsumer *) node->taskData;\r
+                    char * consumerId = (char *) node->taskData;\r
 \r
-                    NSCacheUpdateSubScriptionState(consumerSubList, consumer->consumerId, false);\r
-                    NSSendResponse(consumer->consumerId, false);\r
-                    NSFreeConsumer(consumer);\r
+                    NSCacheUpdateSubScriptionState(consumerSubList, consumerId, false);\r
+                    NSSendResponse(consumerId, false);\r
+                    NSOICFree(consumerId);\r
 \r
                     break;\r
                 }\r
@@ -402,11 +441,17 @@ void * NSSubScriptionSchedule(void *ptr)
                     NSHandleSubscription((OCEntityHandlerRequest*) node->taskData,\r
                             NS_RESOURCE_SYNC);\r
                     break;\r
+#ifdef WITH_MQ\r
+                case TASK_MQ_REQ_SUBSCRIBE:\r
+                    NS_LOG(DEBUG, "CASE TASK_MQ_REQ_SUBSCRIBE : ");\r
+                    NSProviderMQSubscription((NSMQTopicAddress*) node->taskData);\r
+                    break;\r
+#endif\r
                 default:\r
                     break;\r
 \r
             }\r
-            OICFree(node);\r
+            NSOICFree(node);\r
         }\r
 \r
         pthread_mutex_unlock(&NSMutex[SUBSCRIPTION_SCHEDULER]);\r