Hold GetTopics API return until related code finishes in the other thread
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderTopic.c
index b17bbfe..f7d9940 100644 (file)
@@ -19,6 +19,9 @@
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
 \r
 #include "NSProviderTopic.h"\r
+#include "oic_string.h"\r
+#include "oic_malloc.h"\r
+#include <pthread.h>\r
 \r
 NSResult NSSendTopicUpdation();\r
 \r
@@ -35,12 +38,32 @@ NSResult NSInitTopicList()
     return NS_OK;\r
 }\r
 \r
+size_t NSProviderGetTopicListSize(NSTopicLL * firstElement)\r
+{\r
+    if(!firstElement)\r
+    {\r
+        return 0;\r
+    }\r
+\r
+    int cnt = 0;\r
+\r
+    NSTopicLL * iter = firstElement;\r
+\r
+    while(iter)\r
+    {\r
+        cnt++;\r
+        iter = iter->next;\r
+    }\r
+\r
+    return cnt;\r
+}\r
+\r
 NSResult NSAddTopics(const char * topicName)\r
 {\r
     NS_LOG(DEBUG, "NSWriteTopicsToStorage()");\r
 \r
     NSCacheTopicData * data = (NSCacheTopicData *)OICMalloc(sizeof(NSCacheTopicData));\r
-    data->topicName = topicName;\r
+    data->topicName = (char *)topicName;\r
     data->state = NS_TOPIC_UNSUBSCRIBED;\r
 \r
     NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
@@ -111,13 +134,12 @@ NSResult NSSendTopicUpdation()
                 obArray[obCount++] = subData->messageObId;\r
             }\r
 \r
-#ifdef WITH_CLOUD\r
+#if(defined WITH_CLOUD && defined RD_CLIENT)\r
             if(subData->remote_messageObId != 0)\r
             {\r
                 obArray[obCount++] = subData->remote_messageObId;\r
             }\r
 #endif\r
-\r
         }\r
         it = it->next;\r
     }\r
@@ -196,19 +218,20 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest)
 \r
     char * id = NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_CONSUMER_ID);\r
     NSTopicLL * topics = NULL;\r
-    NSCacheElement * currList = NULL;\r
 \r
     if(!id)\r
     {\r
         NS_LOG(DEBUG, "Send registered topic list");\r
         topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
-        currList = registeredTopicList->head;\r
     }\r
     else\r
     {\r
         NS_LOG(DEBUG, "Send subscribed topic list to consumer");\r
-        topics = NSProviderGetConsumerTopicsCacheData(consumerTopicList, id);\r
-        currList = consumerTopicList->head;\r
+        topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList, consumerTopicList, id);\r
+        if(!topics)\r
+        {\r
+            topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
+        }\r
     }\r
 \r
     // make response for the Get Request\r
@@ -225,36 +248,56 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest)
         return NS_ERROR;\r
     }\r
 \r
-    // set topics to the array of resource property\r
-\r
-    NSCacheElement * iter = currList;\r
-    size_t dimensionSize = (size_t)NSProviderGetListSize(iter);\r
-\r
-    if(!dimensionSize)\r
+    OCRepPayloadSetUri(payload, NS_COLLECTION_TOPIC_URI);\r
+    if(id)\r
     {\r
-        return NS_ERROR;\r
+        OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id);\r
     }\r
+    OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID,\r
+        NSGetProviderInfo()->providerId);\r
 \r
-    OCRepPayload** payloadTopicArray = (OCRepPayload **) OICMalloc(\r
-            sizeof(OCRepPayload *) * dimensionSize);\r
-\r
-    size_t dimensions[3] = {dimensionSize, 0, 0};\r
-    for (int i = 0; i < (int)dimensionSize; i++)\r
+    if(topics)\r
     {\r
-        NSTopicLL * topic = (NSTopicLL *) iter->data;\r
+        NS_LOG(DEBUG, "topicList is NULL");\r
+        size_t dimensionSize = (size_t)NSProviderGetTopicListSize(topics);\r
 \r
-        payloadTopicArray[i] = OCRepPayloadCreate();\r
-        OCRepPayloadSetPropString(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_NAME, topic->topicName);\r
-        OCRepPayloadSetPropInt(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_SELECTION,\r
-                (int)topic->state);\r
+        NS_LOG_V(DEBUG, "dimensionSize = %d", (int)dimensionSize);\r
 \r
-        iter = iter->next;\r
+        if(!dimensionSize)\r
+        {\r
+            return NS_ERROR;\r
+        }\r
+\r
+        OCRepPayload** payloadTopicArray = (OCRepPayload **) OICMalloc(\r
+                sizeof(OCRepPayload *) * dimensionSize);\r
+\r
+        size_t dimensions[3] = {dimensionSize, 0, 0};\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
+\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
+        size_t dimensions[3] = {0, 0, 0};\r
 \r
-    OCRepPayloadSetUri(payload, NS_COLLECTION_TOPIC_URI);\r
-    OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id);\r
-    OCRepPayloadSetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
-            (const OCRepPayload**)(payloadTopicArray), dimensions);\r
+        OCRepPayloadSetPropObjectArrayAsOwner(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
+                (OCRepPayload **) NULL, dimensions);\r
+    }\r
 \r
     response.requestHandle = entityHandlerRequest->requestHandle;\r
     response.resourceHandle = entityHandlerRequest->resource;\r
@@ -268,23 +311,17 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest)
         return NS_ERROR;\r
     }\r
     OCRepPayloadDestroy(payload);\r
-    NSFreeOCEntityHandlerRequest(entityHandlerRequest);\r
 \r
     NS_LOG(DEBUG, "NSSendTopicList - OUT");\r
     return NS_OK;\r
 }\r
 \r
-bool NSIsTopicSubscribed(char * consumerId, char * topic)\r
-{\r
-    return NSProviderIsTopicSubScribed(consumerTopicList->head, consumerId, topic);\r
-}\r
-\r
 NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest)\r
 {\r
     NS_LOG(DEBUG, "NSPostConsumerTopics() - IN");\r
 \r
     char * consumerId = NULL;\r
-    OCRepPayload * payload = entityHandlerRequest->payload;\r
+    OCRepPayload * payload = (OCRepPayload *) entityHandlerRequest->payload;\r
     OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, &consumerId);\r
 \r
     if(!consumerId)\r
@@ -293,6 +330,12 @@ NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest)
         return NS_ERROR;\r
     }\r
 \r
+    NS_LOG_V(DEBUG, "TOPIC consumer ID = %s", consumerId);\r
+\r
+    consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
+    while(NSStorageDelete(consumerTopicList, consumerId) != NS_FAIL);\r
+    consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
+\r
     OCRepPayload ** topicListPayload = NULL;\r
     OCRepPayloadValue * payloadValue = NULL;\r
     payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);\r
@@ -303,16 +346,16 @@ NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest)
     for(int i = 0; i <(int)dimensionSize; i++)\r
     {\r
         char * topicName = NULL;\r
-        int topicState = 0;\r
+        int64_t topicState = 0;\r
 \r
         OCRepPayloadGetPropString(topicListPayload[i], NS_ATTRIBUTE_TOPIC_NAME, &topicName);\r
         OCRepPayloadGetPropInt(topicListPayload[i], NS_ATTRIBUTE_TOPIC_SELECTION, &topicState);\r
-        NS_LOG_V(DEBUG, "Topic Name(state):  %s(%d)", topicName, topicState);\r
+        NS_LOG_V(DEBUG, "Topic Name(state):  %s(%d)", topicName, (int)topicState);\r
 \r
         if(NS_TOPIC_SUBSCRIBED == (NSTopicState)topicState)\r
         {\r
-            NSCacheTopicSubData * topicSubData =\r
-            (NSCacheTopicSubData *) OICMalloc(sizeof(NSCacheTopicSubData));\r
+            NSCacheTopicSubData * topicSubData = (NSCacheTopicSubData *)\r
+                    OICMalloc(sizeof(NSCacheTopicSubData));\r
 \r
             OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId);\r
             topicSubData->topicName = OICStrdup(topicName);\r
@@ -350,6 +393,7 @@ void * NSTopicSchedule(void * ptr)
                 case TASK_SEND_TOPICS:\r
                     NS_LOG(DEBUG, "CASE TASK_SEND_TOPICS : ");\r
                     NSSendTopicList((OCEntityHandlerRequest*) node->taskData);\r
+                    NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) node->taskData);\r
                     break;\r
                 case TASK_SUBSCRIBE_TOPIC:\r
                     NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPIC : ");\r
@@ -359,10 +403,10 @@ void * NSTopicSchedule(void * ptr)
                     NSStorageWrite(consumerTopicList, newObj);\r
                     break;\r
                 case TASK_UNSUBSCRIBE_TOPIC:\r
-                    consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
-                    NSStorageDelete(consumerTopicList, (const char *) node->taskData);\r
-                    consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
-                    OICFree((char *)node->taskData);\r
+                    NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPIC : ");\r
+                    NSProviderDeleteConsumerTopic(consumerTopicList,\r
+                            (NSCacheTopicSubData *) node->taskData);\r
+                    NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPIC AFter: ");\r
                     break;\r
                 case TASK_ADD_TOPIC:\r
                 {\r
@@ -380,6 +424,26 @@ void * NSTopicSchedule(void * ptr)
                 {\r
                     NS_LOG(DEBUG, "TASK_POST_TOPIC : ");\r
                     NSPostConsumerTopics((OCEntityHandlerRequest*) node->taskData);\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