replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderListener.c
index f8f9858..ea371cc 100644 (file)
@@ -56,11 +56,11 @@ OCEntityHandlerResult NSEntityHandlerNotificationCb(OCEntityHandlerFlag flag,
                     && strcmp(reqInterface, NS_INTERFACE_READ) != 0)\r
             {\r
                 NS_LOG(ERROR, "Invalid interface");\r
-                OICFree(copyQuery);\r
+                NSOICFree(copyQuery);\r
                 return ehResult;\r
             }\r
 \r
-            OICFree(copyQuery);\r
+            NSOICFree(copyQuery);\r
             NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_POLICY,\r
                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
 \r
@@ -104,7 +104,7 @@ OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag,
 \r
             char * copyQuery = OICStrdup(entityHandlerRequest->query);\r
             reqInterface = OICStrdup(NSGetValueFromQuery(copyQuery, NS_QUERY_INTERFACE));\r
-            OICFree(copyQuery);\r
+            NSOICFree(copyQuery);\r
 \r
             if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
                     && strcmp(reqInterface, NS_INTERFACE_READ) != 0)\r
@@ -136,7 +136,7 @@ OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag,
                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
             ehResult = OC_EH_OK;\r
         }\r
-        else if(ocObAction == OC_OBSERVE_DEREGISTER)\r
+        else if (ocObAction == OC_OBSERVE_DEREGISTER)\r
         {\r
             NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_OBSERVE_DEREGISTER");\r
             NS_LOG_V(DEBUG, "NSEntityHandlerMessageCb\n - "\r
@@ -149,7 +149,7 @@ OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag,
 \r
     ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,\r
             NS_INTERFACE_TYPE_READ, NS_RESOURCE_MESSAGE);\r
-    OICFree(reqInterface);\r
+    NSOICFree(reqInterface);\r
     NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OUT");\r
     return ehResult;\r
 }\r
@@ -179,7 +179,7 @@ OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,
 \r
             char * copyQuery = OICStrdup(entityHandlerRequest->query);\r
             reqInterface = OICStrdup(NSGetValueFromQuery(copyQuery, NS_QUERY_INTERFACE));\r
-            OICFree(copyQuery);\r
+            NSOICFree(copyQuery);\r
 \r
             if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
                     && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0)\r
@@ -198,7 +198,7 @@ OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,
 \r
             NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_POST");\r
 \r
-            if(NSProviderIsSyncAttributes((OCRepPayload *)entityHandlerRequest->payload))\r
+            if (NSProviderIsSyncAttributes((OCRepPayload *)entityHandlerRequest->payload))\r
             {\r
                 NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ,\r
                                     NSGetSyncInfo(entityHandlerRequest->payload));\r
@@ -228,7 +228,7 @@ OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,
             NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SYNC_SUBSCRIPTION,\r
                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
         }\r
-        else if(ocObAction == OC_OBSERVE_DEREGISTER)\r
+        else if (ocObAction == OC_OBSERVE_DEREGISTER)\r
         {\r
             NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_DEREGISTER");\r
             NS_LOG_V(DEBUG, "NSEntityHandlerSyncCb\n - "\r
@@ -242,7 +242,7 @@ OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,
 \r
     ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,\r
             NS_INTERFACE_TYPE_READ, NS_RESOURCE_MESSAGE);\r
-    OICFree(reqInterface);\r
+    NSOICFree(reqInterface);\r
 \r
     return ehResult;\r
 }\r
@@ -273,7 +273,7 @@ OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag,
 \r
             char * copyReq = OICStrdup(entityHandlerRequest->query);\r
             reqInterface = OICStrdup(NSGetValueFromQuery(copyReq, NS_QUERY_INTERFACE));\r
-            OICFree(copyReq);\r
+            NSOICFree(copyReq);\r
 \r
             if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
                     && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0)\r
@@ -291,12 +291,12 @@ OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag,
         else if (OC_REST_POST == entityHandlerRequest->method)\r
         {\r
             // Receive interesting topic list from consumers\r
-            // Send topic notice message(id = TOPIC) to the consumer \r
+            // Send topic notice message(id = TOPIC) to the consumer\r
             // which requests to post.\r
             NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_POST");\r
             // Accepter is provider. our service is not support sendtopiclist from OC_REST_POST\r
             // Accepter is consumer. our service is support sendtopiclist from OC_REST_POST\r
-            if(NSGetPolicy() == false &&\r
+            if (NSGetPolicy() == false &&\r
                     NSProviderIsTopicAttributes(OCRepPayloadClone((OCRepPayload *)\r
                             entityHandlerRequest->payload)))\r
             {\r
@@ -316,10 +316,167 @@ OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag,
     NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OUT");\r
     ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,\r
             NS_INTERFACE_TYPE_READWRITE, NS_RESOURCE_TOPIC);\r
-    OICFree(reqInterface);\r
+    NSOICFree(reqInterface);\r
     return ehResult;\r
 }\r
 \r
+#ifdef WITH_MQ\r
+OCStackApplicationResult NSProviderMQListener(void * ctx, OCDoHandle handle,\r
+        OCClientResponse * clientResponse)\r
+{\r
+    (void) ctx;\r
+    (void) handle;\r
+\r
+    NS_LOG_V(DEBUG, "clientResponse->sequenceNumber = %d", clientResponse->sequenceNumber);\r
+\r
+    if (clientResponse->sequenceNumber == OC_OBSERVE_REGISTER)\r
+    {\r
+        NS_LOG(DEBUG, "MQ OC_OBSERVE_RIGSTER");\r
+        NSSetMQServerInfo(clientResponse->resourceUri, &(clientResponse->devAddr));\r
+    }\r
+\r
+    NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);\r
+    NS_VERIFY_STACK_SUCCESS(NSOCResultToSuccess(clientResponse->result), OC_STACK_KEEP_TRANSACTION);\r
+    NS_VERIFY_NOT_NULL(clientResponse->payload, OC_STACK_KEEP_TRANSACTION);\r
+\r
+    NS_LOG(DEBUG, "income observe response of MQ notification");\r
+    NS_LOG_V(INFO_PRIVATE, "MQ OBS response income : %s:%d",\r
+            clientResponse->devAddr.addr, clientResponse->devAddr.port);\r
+    NS_LOG_V(DEBUG, "MQ OBS response result : %d",\r
+            clientResponse->result);\r
+    NS_LOG_V(DEBUG, "MQ OBS response sequenceNum : %d",\r
+            clientResponse->sequenceNumber);\r
+    NS_LOG_V(DEBUG, "MQ OBS response resource uri : %s",\r
+            clientResponse->resourceUri);\r
+    NS_LOG_V(DEBUG, "MQ OBS response Transport Type : %d",\r
+                    clientResponse->devAddr.adapter);\r
+\r
+    OCRepPayload * payload = (OCRepPayload *)clientResponse->payload;\r
+    NS_VERIFY_NOT_NULL(payload, OC_STACK_KEEP_TRANSACTION);\r
+\r
+    NSMessageType type = -1;\r
+    bool getResult = OCRepPayloadGetPropInt(payload, NS_ATTRIBUTE_TYPE, (int64_t *) &type);\r
+    NS_LOG_V (DEBUG, "message sync type : %d", (int) type);\r
+\r
+    if (!getResult && (type == NS_MESSAGE_READ || type == NS_MESSAGE_DELETED))\r
+    {\r
+        char * pId = NULL;\r
+        getResult = OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, &pId);\r
+        NS_LOG_V (INFO_PRIVATE, "provider id: %s", pId);\r
+\r
+        if (getResult && strcmp(pId, NSGetProviderInfo()->providerId) == 0)\r
+        {\r
+            NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));\r
+            syncInfo->state = (type == NS_MESSAGE_READ) ? NS_SYNC_READ : NS_SYNC_DELETED;\r
+            OICStrcpy(syncInfo->providerId, NS_UUID_STRING_SIZE, pId);\r
+            NSOICFree(pId);\r
+            NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ, (void*) syncInfo);\r
+        }\r
+    }\r
+\r
+    return OC_STACK_KEEP_TRANSACTION;\r
+}\r
+\r
+OCStackApplicationResult NSProviderGetMQResponseCB(void * ctx, OCDoHandle handle,\r
+        OCClientResponse * clientResponse)\r
+{\r
+    NS_LOG(DEBUG, "NSProviderGetMQResponseCB - IN");\r
+\r
+    (void) handle;\r
+\r
+    NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);\r
+    NS_VERIFY_STACK_SUCCESS(NSOCResultToSuccess(clientResponse->result), OC_STACK_KEEP_TRANSACTION);\r
+    NS_VERIFY_NOT_NULL(clientResponse->payload, OC_STACK_KEEP_TRANSACTION);\r
+\r
+    NS_LOG(DEBUG, "income get response of MQ broker");\r
+    NS_LOG_V(INFO_PRIVATE, "MQ GET response income : %s:%d",\r
+            clientResponse->devAddr.addr, clientResponse->devAddr.port);\r
+    NS_LOG_V(DEBUG, "MQ GET response result : %d",\r
+            clientResponse->result);\r
+    NS_LOG_V(DEBUG, "MQ GET response sequenceNum : %d",\r
+            clientResponse->sequenceNumber);\r
+    NS_LOG_V(DEBUG, "MQ GET response resource uri : %s",\r
+            clientResponse->resourceUri);\r
+    NS_LOG_V(DEBUG, "MQ GET response Transport Type : %d",\r
+                    clientResponse->devAddr.adapter);\r
+\r
+    char ** topicList = NULL;\r
+    size_t dimensions[MAX_REP_ARRAY_DEPTH] = {0};\r
+    OCRepPayloadGetStringArray((OCRepPayload *) clientResponse->payload,\r
+                               NS_ATTIRBUTE_MQ_TOPICLIST, & topicList, dimensions);\r
+\r
+    char * interestTopicName = (char *) ctx;\r
+\r
+    NS_LOG_V(DEBUG, "interestTopicName = %s", interestTopicName);\r
+    for (size_t i = 0; i < dimensions[0]; ++i)\r
+    {\r
+        NS_LOG_V(DEBUG, "found MQ topic : %s", topicList[i]);\r
+        if (!strcmp(topicList[i], interestTopicName))\r
+        {\r
+            NS_LOG(DEBUG, "subscribe to MQ notification");\r
+\r
+            OCCallbackData cbdata = { NULL, NULL, NULL };\r
+            cbdata.cb = NSProviderMQListener;\r
+            cbdata.context = NULL;\r
+            cbdata.cd = NULL;\r
+\r
+            OCStackResult ret = OCDoResource(NULL, OC_REST_OBSERVE, topicList[i],\r
+                    clientResponse->addr, NULL, CT_DEFAULT, OC_HIGH_QOS, &cbdata, NULL, 0);\r
+\r
+            if (!NSOCResultToSuccess(ret))\r
+            {\r
+                NS_LOG(DEBUG, "fail to subscribe to MQ notification");\r
+                continue;\r
+            }\r
+        }\r
+    }\r
+\r
+    NS_LOG(DEBUG, "NSProviderGetMQResponseCB - OUT");\r
+    return OC_STACK_KEEP_TRANSACTION;\r
+}\r
+\r
+OCStackApplicationResult NSProviderPublishMQResponseCB(void *ctx, OCDoHandle handle,\r
+        OCClientResponse *clientResponse)\r
+{\r
+    (void) ctx;\r
+    (void) handle;\r
+    NS_LOG(DEBUG, "Publish Topic callback received");\r
+\r
+    OCStackApplicationResult res = OC_STACK_ERROR;\r
+\r
+    NS_LOG_V(DEBUG, "Publish Topic response received code: (%d)", clientResponse->result);\r
+\r
+    if (clientResponse->payload != NULL &&\r
+        clientResponse->payload->type == PAYLOAD_TYPE_REPRESENTATION)\r
+    {\r
+        NS_LOG(DEBUG, "PAYLOAD_TYPE_REPRESENTATION received");\r
+\r
+        OCRepPayloadValue *val = ((OCRepPayload *)clientResponse->payload)->values;\r
+        while (val)\r
+        {\r
+            if( val->type == OCREP_PROP_INT)\r
+            {\r
+                NS_LOG_V(DEBUG, "Key: %s, Value: %lld, int", val->name, val->i);\r
+            }\r
+            else if( val->type == OCREP_PROP_STRING)\r
+            {\r
+                NS_LOG_V(DEBUG, "Key: %s, Value: %s, string", val->name, val->str);\r
+            }\r
+            else\r
+            {\r
+                NS_LOG_V(DEBUG, "Un supported val Type.(0x%d)", val->type);\r
+            }\r
+\r
+            val = val->next;\r
+        }\r
+\r
+        res = OC_STACK_KEEP_TRANSACTION;\r
+    }\r
+\r
+    return res;\r
+}\r
+#endif\r
+\r
 void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected)\r
 {\r
     NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");\r
@@ -334,9 +491,9 @@ void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected
         // Start Presence\r
         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
 \r
-        if(info->adapter == CA_ADAPTER_TCP)\r
+        if (info->adapter == CA_ADAPTER_TCP)\r
         {\r
-            NS_LOG_V(DEBUG, "TCP Connected remote address: %s:%d", info->addr, info->port);\r
+            NS_LOG_V(INFO_PRIVATE, "TCP Connected remote address: %s:%d", info->addr, info->port);\r
         }\r
     }\r
     else\r
@@ -346,9 +503,9 @@ void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected
         // Set Connection State\r
         NSSetProviderConnectionState(DISCONNECTED);\r
 \r
-        if(info->adapter == CA_ADAPTER_TCP)\r
+        if (info->adapter == CA_ADAPTER_TCP)\r
         {\r
-            NS_LOG_V(DEBUG, "TCP Disconnected remote address: %s:%d", info->addr, info->port);\r
+            NS_LOG_V(INFO_PRIVATE, "TCP Disconnected remote address: %s:%d", info->addr, info->port);\r
         }\r
     }\r
 \r
@@ -398,14 +555,15 @@ bool NSProviderCompareSyncAttributes(const char * name)
 bool NSProviderIsSyncAttributes(OCRepPayload * payload)\r
 {\r
     NS_LOG(DEBUG, "get extra info");\r
-\r
     OCRepPayloadValue * curr = payload->values;\r
-    while(curr)\r
+\r
+    while (curr)\r
     {\r
         if (!NSProviderCompareSyncAttributes(curr->name))\r
         {\r
             return false;\r
         }\r
+\r
         curr = curr->next;\r
     }\r
 \r
@@ -437,12 +595,13 @@ bool NSProviderCompareSubTopicAttributes(const char * name)
 bool NSProviderIsTopicAttributes(OCRepPayload * payload)\r
 {\r
     NS_LOG(DEBUG, "get extra info");\r
-\r
     OCRepPayloadValue * curr = payload->values;\r
-    while(curr)\r
+\r
+    while (curr)\r
     {\r
         if (!NSProviderCompareTopicAttributes(curr->name))\r
         {\r
+            OCRepPayloadDestroy(payload);\r
             return false;\r
         }\r
 \r
@@ -456,6 +615,7 @@ bool NSProviderIsTopicAttributes(OCRepPayload * payload)
 \r
             if (!dimensionSize)\r
             {\r
+                OCRepPayloadDestroy(payload);\r
                 return false;\r
             }\r
 \r
@@ -465,15 +625,17 @@ bool NSProviderIsTopicAttributes(OCRepPayload * payload)
             for (int i = 0; i < (int) dimensionSize; i++)\r
             {\r
                 OCRepPayloadValue * subCurr = topicListPayload[i]->values;\r
-                while(subCurr)\r
+\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
+                            OCRepPayloadDestroy(topicListPayload[j]);\r
                         }\r
 \r
+                        NSOICFree(topicListPayload);\r
                         OCRepPayloadDestroy(payload);\r
                         return false;\r
                     }\r
@@ -481,6 +643,7 @@ bool NSProviderIsTopicAttributes(OCRepPayload * payload)
                 }\r
                 OCRepPayloadDestroy(topicListPayload[i]);\r
             }\r
+            NSOICFree(topicListPayload);\r
         }\r
         curr = curr->next;\r
     }\r