Add postConsumerTopics Function and modify sendTopicList.
authorjaesick.shin <jaesick.shin@samsung.com>
Tue, 16 Aug 2016 04:13:34 +0000 (13:13 +0900)
committerUze Choi <uzchoi@samsung.com>
Wed, 17 Aug 2016 09:35:48 +0000 (09:35 +0000)
this patch included,
1. Add postConsumerTopics, postConsumerTopics function is called when received OC_REST_POST.
2. Modify sendTopicList Logic.

second patch included,
modify invalid type for topic state.

third patch included,
modify invalid type for NSProviderGetListSize arg.

fourth patch included,
modify invalid type for cacheElement iterator.

Change-Id: Ief1ca496972e90819f04afc50c3849a83bb051e9
Signed-off-by: jaesick.shin <jaesick.shin@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/10479
Reviewed-by: Uze Choi <uzchoi@samsung.com>
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
service/notification/src/common/NSConstants.h
service/notification/src/provider/NSProviderListener.c
service/notification/src/provider/NSProviderMemoryCache.c
service/notification/src/provider/NSProviderMemoryCache.h
service/notification/src/provider/NSProviderTopic.c

index 9da9c202bf61e242dd913f983ca271ad8370f11e..8372d4568e3c8510f8c5a86ebb4bce90d2b18d2a 100644 (file)
@@ -244,7 +244,8 @@ typedef enum eTaskType
     TASK_ADD_TOPIC = 11001,
     TASK_DELETE_TOPIC = 11002,
     TASK_SUBSCRIBE_TOPIC = 11003,
-    TASK_UNSUBSCRIBE_TOPIC = 11004
+    TASK_UNSUBSCRIBE_TOPIC = 11004,
+    TASK_POST_TOPIC = 11005
 
 } NSTaskType;
 
index ccc76b4bafedd301fb26a6ab53dfd94e61f69641..c295645f6cb51fd8701ae97ea0b5260a62593f06 100644 (file)
@@ -208,7 +208,7 @@ OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag,
 \r
             // Send topic notice message(id = TOPIC) to the consumer \r
             // which requests to post.\r
-            NSPushQueue(TOPIC_SCHEDULER, TASK_SUBSCRIBE_TOPIC,\r
+            NSPushQueue(TOPIC_SCHEDULER, TASK_POST_TOPIC,\r
                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
 \r
             ehResult = OC_EH_OK;\r
index e8583d921ea17b4535bcad3c415fb4abfdd89629..fce3322d5b950d141fb6cf964409a0e3fd56cc1f 100644 (file)
@@ -594,3 +594,23 @@ NSTopics * NSProviderGetConsumerTopicsCacheData(NSCacheList * conTopicList, char
 \r
     return topics;\r
 }\r
+\r
+size_t NSProviderGetListSize(NSCacheElement * firstElement)\r
+{\r
+    if(!firstElement)\r
+    {\r
+        return 0;\r
+    }\r
+\r
+    int cnt = 0;\r
+\r
+    NSCacheElement * iter = firstElement;\r
+\r
+    while(iter)\r
+    {\r
+        cnt++;\r
+        iter = iter->next;\r
+    }\r
+\r
+    return cnt;\r
+}\r
index a7cd8c56e532d88b2365fffb89dafe0fb205502a..f305160964b4fc5fc4b2f18d63d75ee2459210e2 100644 (file)
@@ -46,6 +46,8 @@ NSTopics * NSProviderGetTopicsCacheData(NSCacheList * regTopicList);
 \r
 NSTopics * NSProviderGetConsumerTopicsCacheData(NSCacheList * conTopicList, char *consumerId);\r
 \r
+size_t NSProviderGetListSize(NSCacheElement * firstElement);\r
+\r
 pthread_mutex_t NSCacheMutex;\r
 pthread_mutexattr_t NSCacheMutexAttr;\r
 \r
index 7f822a87bc7c6a6224b573879ee6ca705ccd0eeb..dc25a0a3db3f03a6ae56a2660c86e2897764e37b 100644 (file)
@@ -225,17 +225,20 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest)
     NS_LOG(DEBUG, "NSSendTopicList - IN");\r
 \r
     char * id = NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_CONSUMER_ID);\r
+    NSTopics * 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
@@ -253,27 +256,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
-    OCRepPayloadSetPropString(payloadTopic2, NS_ATTRIBUTE_TOPIC_NAME, "test topic name2");\r
-    OCRepPayloadSetPropBool(payloadTopic2, NS_ATTRIBUTE_TOPIC_SELECTION, false);\r
+    OCRepPayload** payloadTopicArray = (OCRepPayload **) OICMalloc(\r
+            sizeof(OCRepPayload *) * dimensionSize);\r
 \r
-    payloadTopicArray[dimensions++] = payloadTopic1;\r
-    payloadTopicArray[dimensions++] = payloadTopic2;\r
-    // end of set topics\r
+    size_t dimensions[3] = {dimensionSize, 0, 0};\r
+    for (int i = 0; i < (int)dimensionSize; i++)\r
+    {\r
+        NSTopics * topic = (NSTopics *) iter->data;\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
+\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
@@ -281,7 +292,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
@@ -300,6 +310,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, consumerId, NS_UUID_STRING_SIZE);\r
+            topicSubData->topicName = OICStrdup(topicName);\r
+\r
+            NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
+            newObj->data = 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
@@ -348,6 +407,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