NSTopics Sturct name change into NSTopicLL
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderTopic.c
index 93577d8..e54a97b 100644 (file)
 \r
 #include "NSProviderTopic.h"\r
 \r
-static bool isTopicList = false;\r
-\r
-NSResult NSStoreTopics(const char * topicName);\r
 NSResult NSSendTopicUpdation();\r
 \r
 NSResult NSInitTopicList()\r
 {\r
     NS_LOG(DEBUG, "NSInitTopicList - IN");\r
-\r
-    if(isTopicList)\r
-    {\r
-        NS_LOG(DEBUG, "topic list has already initiated");\r
-        return NS_FAIL;\r
-    }\r
-\r
     consumerTopicList = NSStorageCreate();\r
     consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
 \r
     registeredTopicList = NSStorageCreate();\r
     registeredTopicList->cacheType = NS_PROVIDER_CACHE_REGISTER_TOPIC;\r
 \r
-    isTopicList = true;\r
-\r
     NS_LOG(DEBUG, "NSInitTopicList - OUT");\r
     return NS_OK;\r
 }\r
 \r
-NSTopicList * NSGetTopics(char *consumerId)\r
-{\r
-    NS_LOG(DEBUG, "NSGetTopics()");\r
-\r
-    NSTopicList  * topicList;\r
-\r
-    if(consumerId == NULL)\r
-    {\r
-        NS_LOG(DEBUG, "All registered topic list");\r
-        //TODO: get registered topic list\r
-    }\r
-    else\r
-    {\r
-        NS_LOG_V(DEBUG, "Subscribed topic list for consumerId(%s)", consumerId);\r
-        //TODO: get subscribed topic list for consumer\r
-    }\r
-\r
-    NS_LOG(DEBUG, "NSGetTopics() NS_OK");\r
-    return topicList;\r
-}\r
-\r
 NSResult NSAddTopics(const char * topicName)\r
 {\r
     NS_LOG(DEBUG, "NSWriteTopicsToStorage()");\r
@@ -102,37 +69,6 @@ NSResult NSDeleteTopics(const char * topicName)
 \r
     NSStorageDelete(registeredTopicList, topicName);\r
     while(NSStorageDelete(consumerTopicList, topicName) != NS_FAIL);\r
-\r
-    return NS_OK;\r
-}\r
-\r
-NSResult NSSubscribeTopicList(char *consumerId, NSTopicList *topicList)\r
-{\r
-    NS_LOG(DEBUG, "NSSubscribeTopicList()");\r
-\r
-    if(!topicList)\r
-    {\r
-        NS_LOG(ERROR, "no topics");\r
-        return NS_ERROR;\r
-    }\r
-\r
-    if(!consumerId)\r
-    {\r
-        NS_LOG(ERROR, "invalid consumer id");\r
-        return NS_ERROR;\r
-    }\r
-\r
-    OCResourceHandle rHandle = NULL;\r
-    if(NSPutTopicResource(topicList, &rHandle) != NS_OK)\r
-    {\r
-        NS_LOG(ERROR, "Fail to put topic resource");\r
-        return NS_ERROR;\r
-    }\r
-\r
-    //TODO it will change logic.\r
-    //NSStoreTopics(consumerId, topicList->head);\r
-\r
-    NS_LOG(DEBUG, "NSSubscribeTopicList() NS_OK");\r
     return NS_OK;\r
 }\r
 \r
@@ -259,17 +195,20 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest)
     NS_LOG(DEBUG, "NSSendTopicList - IN");\r
 \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
-        //TODO: get registered topic list\r
-        // NSGetTopics(NULL);\r
+        topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
+        currList = registeredTopicList->head;\r
     }\r
     else\r
     {\r
         NS_LOG(DEBUG, "Send subscribed topic list to consumer");\r
-        //TODO: get subscribed topic list for consumer\r
-        // NSGetTopics(consumerid);\r
+        topics = NSProviderGetConsumerTopicsCacheData(consumerTopicList, id);\r
+        currList = consumerTopicList->head;\r
     }\r
 \r
     // make response for the Get Request\r
@@ -287,27 +226,35 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest)
     }\r
 \r
     // set topics to the array of resource property\r
-    const int TOPIC_MAX_SIZE = 100;\r
-    int dimensions = 0;\r
-    OCRepPayload* payloadTopicArray[TOPIC_MAX_SIZE];\r
-    //TODO: use while(NSTopicList)\r
-    OCRepPayload* payloadTopic1;\r
-    OCRepPayload* payloadTopic2;\r
 \r
-    OCRepPayloadSetPropString(payloadTopic1, NS_ATTRIBUTE_TOPIC_NAME, "test topic name1");\r
-    OCRepPayloadSetPropBool(payloadTopic1, NS_ATTRIBUTE_TOPIC_SELECTION, true);\r
+    NSCacheElement * iter = currList;\r
+    size_t dimensionSize = (size_t)NSProviderGetListSize(iter);\r
+\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
+    for (int i = 0; i < (int)dimensionSize; i++)\r
+    {\r
+        NSTopicLL * topic = (NSTopicLL *) iter->data;\r
 \r
-    OCRepPayloadSetPropString(payloadTopic2, NS_ATTRIBUTE_TOPIC_NAME, "test topic name2");\r
-    OCRepPayloadSetPropBool(payloadTopic2, NS_ATTRIBUTE_TOPIC_SELECTION, false);\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
 \r
-    payloadTopicArray[dimensions++] = payloadTopic1;\r
-    payloadTopicArray[dimensions++] = payloadTopic2;\r
-    // end of set topics\r
+        iter = iter->next;\r
+    }\r
 \r
     OCRepPayloadSetUri(payload, NS_COLLECTION_TOPIC_URI);\r
     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id);\r
-    // TODO: add PayLoadSet with topic list got above\r
-    OCRepPayloadSetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, (const OCRepPayload**)(payloadTopicArray), dimensions);\r
+    OCRepPayloadSetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
+            (const OCRepPayload**)(payloadTopicArray), dimensions);\r
 \r
     response.requestHandle = entityHandlerRequest->requestHandle;\r
     response.resourceHandle = entityHandlerRequest->resource;\r
@@ -315,7 +262,6 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest)
     response.ehResult = OC_EH_OK;\r
     response.payload = (OCPayload *) payload;\r
 \r
-    // Send Response\r
     if (OCDoResponse(&response) != OC_STACK_OK)\r
     {\r
         NS_LOG(ERROR, "Fail to response topic list");\r
@@ -334,6 +280,55 @@ bool NSIsTopicSubscribed(char * consumerId, char * topic)
     return true;\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
+    OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, &consumerId);\r
+\r
+    if(!consumerId)\r
+    {\r
+        NS_LOG(DEBUG, "Invalid consumer ID");\r
+        return NS_ERROR;\r
+    }\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
+    OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, & topicListPayload, dimensions);\r
+\r
+    for(int i = 0; i <(int)dimensionSize; i++)\r
+    {\r
+        char * topicName = NULL;\r
+        int 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
+\r
+        if(NS_TOPIC_SUBSCRIBED == (NSTopicState)topicState)\r
+        {\r
+            NSCacheTopicSubData * topicSubData =\r
+            (NSCacheTopicSubData *) OICMalloc(sizeof(NSCacheTopicSubData));\r
+\r
+            OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId);\r
+            topicSubData->topicName = OICStrdup(topicName);\r
+\r
+            NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
+            newObj->data = (NSCacheData *) topicSubData;\r
+            newObj->next = NULL;\r
+            NSStorageWrite(consumerTopicList, newObj);\r
+        }\r
+    }\r
+\r
+    NS_LOG(DEBUG, "NSPostConsumerTopics() - OUT");\r
+    return NS_OK;\r
+}\r
+\r
 void * NSTopicSchedule(void * ptr)\r
 {\r
     if (ptr == NULL)\r
@@ -382,6 +377,12 @@ void * NSTopicSchedule(void * ptr)
                     NSDeleteTopics((const char *) node->taskData);\r
                 }\r
                     break;\r
+                case TASK_POST_TOPIC:\r
+                {\r
+                    NS_LOG(DEBUG, "TASK_POST_TOPIC : ");\r
+                    NSPostConsumerTopics((OCEntityHandlerRequest*) node->taskData);\r
+                }\r
+                    break;\r
                 default:\r
                     break;\r
             }\r