Hold GetTopics API return until related code finishes in the other thread
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderTopic.c
index 112c2ef..f7d9940 100644 (file)
@@ -21,6 +21,7 @@
 #include "NSProviderTopic.h"\r
 #include "oic_string.h"\r
 #include "oic_malloc.h"\r
 #include "NSProviderTopic.h"\r
 #include "oic_string.h"\r
 #include "oic_malloc.h"\r
+#include <pthread.h>\r
 \r
 NSResult NSSendTopicUpdation();\r
 \r
 \r
 NSResult NSSendTopicUpdation();\r
 \r
@@ -233,12 +234,6 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest)
         }\r
     }\r
 \r
         }\r
     }\r
 \r
-    if(!topics)\r
-    {\r
-        NS_LOG(DEBUG, "topicList is NULL");\r
-        return NS_ERROR;\r
-    }\r
-\r
     // make response for the Get Request\r
     OCEntityHandlerResponse response;\r
     response.numSendVendorSpecificHeaderOptions = 0;\r
     // make response for the Get Request\r
     OCEntityHandlerResponse response;\r
     response.numSendVendorSpecificHeaderOptions = 0;\r
@@ -253,40 +248,56 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest)
         return NS_ERROR;\r
     }\r
 \r
         return NS_ERROR;\r
     }\r
 \r
-    size_t dimensionSize = (size_t)NSProviderGetTopicListSize(topics);\r
-\r
-    NS_LOG_V(DEBUG, "dimensionSize = %d", dimensionSize);\r
-\r
-    if(!dimensionSize)\r
+    OCRepPayloadSetUri(payload, NS_COLLECTION_TOPIC_URI);\r
+    if(id)\r
     {\r
     {\r
-        return NS_ERROR;\r
+        OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id);\r
     }\r
     }\r
+    OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID,\r
+        NSGetProviderInfo()->providerId);\r
 \r
 \r
-    OCRepPayload** payloadTopicArray = (OCRepPayload **) OICMalloc(\r
-            sizeof(OCRepPayload *) * dimensionSize);\r
+    if(topics)\r
+    {\r
+        NS_LOG(DEBUG, "topicList is NULL");\r
+        size_t dimensionSize = (size_t)NSProviderGetTopicListSize(topics);\r
 \r
 \r
-    size_t dimensions[3] = {dimensionSize, 0, 0};\r
+        NS_LOG_V(DEBUG, "dimensionSize = %d", (int)dimensionSize);\r
 \r
 \r
-    for (int i = 0; i < (int)dimensionSize; i++)\r
-    {\r
-        NS_LOG_V(DEBUG, "topicName = %s", topics->topicName);\r
-        NS_LOG_V(DEBUG, "topicState = %d",(int) topics->state);\r
+        if(!dimensionSize)\r
+        {\r
+            return NS_ERROR;\r
+        }\r
 \r
 \r
-        payloadTopicArray[i] = OCRepPayloadCreate();\r
-        OCRepPayloadSetPropString(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_NAME, topics->topicName);\r
-        OCRepPayloadSetPropInt(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_SELECTION,\r
-                (int)topics->state);\r
+        OCRepPayload** payloadTopicArray = (OCRepPayload **) OICMalloc(\r
+                sizeof(OCRepPayload *) * dimensionSize);\r
 \r
 \r
-        topics = topics->next;\r
-    }\r
+        size_t dimensions[3] = {dimensionSize, 0, 0};\r
 \r
 \r
-    OCRepPayloadSetUri(payload, NS_COLLECTION_TOPIC_URI);\r
-    if(id)\r
+        for (int i = 0; i < (int)dimensionSize; i++)\r
+        {\r
+            NS_LOG_V(DEBUG, "topicName = %s", topics->topicName);\r
+            NS_LOG_V(DEBUG, "topicState = %d",(int) topics->state);\r
+\r
+            payloadTopicArray[i] = OCRepPayloadCreate();\r
+            OCRepPayloadSetPropString(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_NAME,\r
+                    topics->topicName);\r
+            OCRepPayloadSetPropInt(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_SELECTION,\r
+                    (int)topics->state);\r
+\r
+            topics = topics->next;\r
+        }\r
+\r
+\r
+        OCRepPayloadSetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
+                (const OCRepPayload**)(payloadTopicArray), dimensions);\r
+    }\r
+    else\r
     {\r
     {\r
-        OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id);\r
+        size_t dimensions[3] = {0, 0, 0};\r
+\r
+        OCRepPayloadSetPropObjectArrayAsOwner(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
+                (OCRepPayload **) NULL, dimensions);\r
     }\r
     }\r
-    OCRepPayloadSetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
-            (const OCRepPayload**)(payloadTopicArray), dimensions);\r
 \r
     response.requestHandle = entityHandlerRequest->requestHandle;\r
     response.resourceHandle = entityHandlerRequest->resource;\r
 \r
     response.requestHandle = entityHandlerRequest->requestHandle;\r
     response.resourceHandle = entityHandlerRequest->resource;\r
@@ -416,6 +427,25 @@ void * NSTopicSchedule(void * ptr)
                     NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) node->taskData);\r
                 }\r
                     break;\r
                     NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) node->taskData);\r
                 }\r
                     break;\r
+                case TASK_GET_TOPICS:\r
+                {\r
+                    NS_LOG(DEBUG, "TASK_GET_TOPICS : ");\r
+                    NSTopicSynchronization * topicData = (NSTopicSynchronization *) node->taskData;\r
+                    NSTopicLL * topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
+                    topicData->topics = topics;\r
+                    pthread_cond_signal(&topicData->condition);\r
+                }\r
+                    break;\r
+                case TAST_GET_CONSUMER_TOPICS:\r
+                {\r
+                    NS_LOG(DEBUG, "TASK_GET_CONSUMER_TOPICS : ");\r
+                    NSTopicSynchronization * topicData = (NSTopicSynchronization *) node->taskData;\r
+                    NSTopicLL * topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList,\r
+                                consumerTopicList, topicData->consumerId);\r
+                    topicData->topics = topics;\r
+                    pthread_cond_signal(&topicData->condition);\r
+                }\r
+                    break;\r
                 default:\r
                     break;\r
             }\r
                 default:\r
                     break;\r
             }\r