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 9da9c20..8372d45 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 ccc76b4..c295645 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 e8583d9..fce3322 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 a7cd8c5..f305160 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 7f822a8..dc25a0a 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