Add logic for Topic Scenario.
authorjaesick.shin <jaesick.shin@samsung.com>
Fri, 12 Aug 2016 08:27:33 +0000 (17:27 +0900)
committerMadan Lanka <lanka.madan@samsung.com>
Fri, 12 Aug 2016 12:21:16 +0000 (12:21 +0000)
1. If the user cancels the selection,
delete cache about topic.

2. If the user the selection,
add cache about topic.

3.
add logic for NSProviderGetConsumerTopics function.

4.
Move related topic function to memoryCache.
Add NSProviderGetTopicsCacheData, NSProviderGetConsumerTopicsCacheData
function in NSProviderMemoryCache.
because of, this function logic is access cache.

5.
bug fixes about mutex unlock and Add null check.
bug fixes about mutext unlock(initMutex) in NSProviderInterface.c.
Addt null check in Function.

6.
Bug fixes for wrong data type.
TASK_SUBSCRIBE_TOPIC case in NSTopicSchedule,
Use the Wrong second parameter of NSStorageWrite.
re modify second parameter and remove not required freelogic.

Change-Id: I24458847640b8c47e22fd47c7162a01c5dcff412
Signed-off-by: jaesick.shin <jaesick.shin@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/10339
Reviewed-by: Chihyun Cho <ch79.cho@samsung.com>
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Madan Lanka <lanka.madan@samsung.com>
service/notification/src/common/NSConstants.h
service/notification/src/provider/NSProviderInterface.c
service/notification/src/provider/NSProviderMemoryCache.c
service/notification/src/provider/NSProviderMemoryCache.h
service/notification/src/provider/NSProviderTopic.c

index 9347250..9da9c20 100644 (file)
@@ -259,8 +259,9 @@ typedef enum eCacheType
 {
     NS_PROVIDER_CACHE_SUBSCRIBER = 1000,
     NS_PROVIDER_CACHE_MESSAGE = 1001,
-    NS_PROVIDER_CACHE_CONSUMER_TOPIC = 1002,
-    NS_PROVIDER_CACHE_REGISTER_TOPIC = 1003,
+    NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME = 1002,
+    NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID = 1003,
+    NS_PROVIDER_CACHE_REGISTER_TOPIC = 1004,
 
     NS_CONSUMER_CACHE_PROVIDER = 2000,
     NS_CONSUMER_CACHE_MESSAGE = 2001,
index 4f09c91..fe47040 100644 (file)
@@ -245,12 +245,17 @@ NSTopics * NSProviderGetConsumerTopics(char *consumerId)
     NS_LOG(DEBUG, "NSProviderGetConsumerTopics - IN");\r
     pthread_mutex_lock(&nsInitMutex);\r
 \r
-    //TODO implement get subscribed topics for consumer\r
+    if(!consumerId)\r
+    {\r
+        NS_LOG(DEBUG, "consumer id should be set");\r
+        pthread_mutex_unlock(&nsInitMutex);\r
+        return NS_FAIL;\r
+    }\r
 \r
-    pthread_mutex_unlock(&nsInitMutex);\r
-    NS_LOG(DEBUG, "NSProviderGetConsumerTopics - OUT");\r
+    NSTopics * topics = NSProviderGetConsumerTopicsCacheData(consumerTopicList, consumerId);\r
 \r
-    return NULL;\r
+    pthread_mutex_unlock(&nsInitMutex);\r
+    return topics;\r
 }\r
 \r
 NSTopics * NSProviderGetTopics()\r
@@ -258,12 +263,12 @@ NSTopics * NSProviderGetTopics()
     NS_LOG(DEBUG, "NSProviderGetTopics - IN");\r
     pthread_mutex_lock(&nsInitMutex);\r
 \r
-    //TODO implement get registered topics for consumer\r
+    NSTopics * topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
 \r
     pthread_mutex_unlock(&nsInitMutex);\r
     NS_LOG(DEBUG, "NSProviderGetTopics - OUT");\r
 \r
-    return NULL;\r
+    return topics;\r
 }\r
 \r
 NSResult NSProviderAddTopic(char *topicName)\r
@@ -271,6 +276,13 @@ NSResult NSProviderAddTopic(char *topicName)
     NS_LOG(DEBUG, "NSProviderAddTopics - IN");\r
     pthread_mutex_lock(&nsInitMutex);\r
 \r
+    if(!topicName)\r
+    {\r
+        pthread_mutex_unlock(&nsInitMutex);\r
+        NS_LOG(DEBUG, "topic Name should be set");\r
+        return NS_FAIL;\r
+    }\r
+\r
     NSPushQueue(TOPIC_SCHEDULER, TASK_ADD_TOPIC, OICStrdup(topicName));\r
 \r
     pthread_mutex_unlock(&nsInitMutex);\r
@@ -283,6 +295,13 @@ NSResult NSProviderDeleteTopic(char *topicName)
     NS_LOG(DEBUG, "NSProviderDeleteTopics - IN");\r
     pthread_mutex_lock(&nsInitMutex);\r
 \r
+    if(!topicName)\r
+    {\r
+        pthread_mutex_unlock(&nsInitMutex);\r
+        NS_LOG(DEBUG, "topic Name should be set");\r
+        return NS_FAIL;\r
+    }\r
+\r
     NSPushQueue(TOPIC_SCHEDULER, TASK_DELETE_TOPIC, topicName);\r
 \r
     pthread_mutex_unlock(&nsInitMutex);\r
@@ -295,14 +314,20 @@ NSResult NSProviderSelectTopic(char *consumerId, char *topicName)
     NS_LOG(DEBUG, "NSProviderSelectTopics - IN");\r
     pthread_mutex_lock(&nsInitMutex);\r
 \r
-    if(!consumerId)\r
+    if(!consumerId || !topicName)\r
     {\r
+        pthread_mutex_unlock(&nsInitMutex);\r
         NS_LOG(DEBUG, "consumer id should be set for topic subscription");\r
         return NS_FAIL;\r
     }\r
 \r
-    //TODO: add consumerId to task struct\r
-    NSPushQueue(TOPIC_SCHEDULER, TASK_SUBSCRIBE_TOPIC, topicName);\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
+    NSPushQueue(TOPIC_SCHEDULER, TASK_SUBSCRIBE_TOPIC, (void *)topicSubData);\r
 \r
     pthread_mutex_unlock(&nsInitMutex);\r
     NS_LOG(DEBUG, "NSProviderSelectTopics - OUT");\r
@@ -314,13 +339,13 @@ NSResult NSProviderUnselectTopic(char *consumerId, char *topicName)
     NS_LOG(DEBUG, "NSProviderUnselectTopics - IN");\r
     pthread_mutex_lock(&nsInitMutex);\r
 \r
-    if(!consumerId)\r
+    if(!consumerId || !topicName)\r
     {\r
         NS_LOG(DEBUG, "consumer id should be set for topic subscription");\r
+        pthread_mutex_unlock(&nsInitMutex);\r
         return NS_FAIL;\r
     }\r
-    \r
-    //TODO: add consumerId to task struct\r
+\r
     NSPushQueue(TOPIC_SCHEDULER, TASK_UNSUBSCRIBE_TOPIC, topicName);\r
 \r
     pthread_mutex_unlock(&nsInitMutex);\r
index 1325b6e..8e4b4d9 100644 (file)
@@ -120,54 +120,6 @@ NSResult NSCacheUpdateSubScriptionState(NSCacheList * list, char * id, bool stat
     return NS_ERROR;\r
 }\r
 \r
-NSResult NSCacheUpdateSubScriptionState(NSCacheList * list, char * id, bool state)\r
-{\r
-    pthread_mutex_lock(&NSCacheMutex);\r
-\r
-    NS_LOG(DEBUG, "NSCacheUpdateSubScriptionState - IN");\r
-\r
-    if (id == NULL)\r
-    {\r
-        NS_LOG(DEBUG, "id is NULL");\r
-        pthread_mutex_unlock(&NSCacheMutex);\r
-        return NS_ERROR;\r
-    }\r
-\r
-    NSCacheElement * it = NSStorageRead(list, id);\r
-\r
-    if (it)\r
-    {\r
-        NSCacheSubData * itData = (NSCacheSubData *) it->data;\r
-        if (strcmp(itData->id, id) == 0)\r
-        {\r
-            NS_LOG(DEBUG, "Update Data - IN");\r
-\r
-            NS_LOG_V(DEBUG, "currData_ID = %s", itData->id);\r
-            NS_LOG_V(DEBUG, "currData_MsgObID = %d", itData->messageObId);\r
-            NS_LOG_V(DEBUG, "currData_SyncObID = %d", itData->syncObId);\r
-            NS_LOG_V(DEBUG, "currData_Cloud_MsgObID = %d", itData->remote_messageObId);\r
-            NS_LOG_V(DEBUG, "currData_Cloud_SyncObID = %d", itData->remote_syncObId);\r
-            NS_LOG_V(DEBUG, "currData_IsWhite = %d", itData->isWhite);\r
-\r
-            NS_LOG_V(DEBUG, "update state = %d", state);\r
-\r
-            itData->isWhite = state;\r
-\r
-            NS_LOG(DEBUG, "Update Data - OUT");\r
-            pthread_mutex_unlock(&NSCacheMutex);\r
-            return NS_OK;\r
-        }\r
-    }\r
-    else\r
-    {\r
-        NS_LOG(DEBUG, "Not Found Data");\r
-    }\r
-\r
-    NS_LOG(DEBUG, "NSCacheUpdateSubScriptionState - OUT");\r
-    pthread_mutex_unlock(&NSCacheMutex);\r
-    return NS_ERROR;\r
-}\r
-\r
 NSResult NSStorageWrite(NSCacheList * list, NSCacheElement * newObj)\r
 {\r
     pthread_mutex_lock(&NSCacheMutex);\r
@@ -255,6 +207,36 @@ NSResult NSStorageWrite(NSCacheList * list, NSCacheElement * newObj)
             return NS_FAIL;\r
         }\r
     }\r
+    else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)\r
+    {\r
+        NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
+\r
+        NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) newObj->data;\r
+        NSCacheElement * it = NSStorageRead(list, topicData->topicName);\r
+\r
+        if (it)\r
+        {\r
+            NS_LOG(DEBUG, "already registered for topic name");\r
+            pthread_mutex_unlock(&NSCacheMutex);\r
+            return NS_FAIL;\r
+        }\r
+    }\r
+\r
+    else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
+    {\r
+        NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
+\r
+        NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) newObj->data;\r
+        NSCacheElement * it = NSStorageRead(list, topicData->id);\r
+\r
+        if (it)\r
+        {\r
+            NS_LOG(DEBUG, "already registered for topic name");\r
+            pthread_mutex_unlock(&NSCacheMutex);\r
+            return NS_FAIL;\r
+        }\r
+    }\r
+\r
 \r
     if (list->head == NULL)\r
     {\r
@@ -333,7 +315,7 @@ bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id
         NS_LOG(DEBUG, "Message Data is Not Same");\r
         return false;\r
     }\r
-    else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC)\r
+    else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)\r
     {\r
         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
 \r
@@ -348,6 +330,22 @@ bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id
         NS_LOG(DEBUG, "Message Data is Not Same");\r
         return false;\r
     }\r
+    else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
+    {\r
+        NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
+\r
+        NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->id);\r
+\r
+        if (strcmp(topicData->id, id) == 0)\r
+        {\r
+            NS_LOG(DEBUG, "SubData is Same");\r
+            return true;\r
+        }\r
+\r
+        NS_LOG(DEBUG, "Message Data is Not Same");\r
+        return false;\r
+    }\r
+\r
 \r
     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - OUT");\r
     return false;\r
@@ -374,7 +372,7 @@ NSResult NSProviderDeleteCacheData(NSCacheType type, void * data)
         NSCacheTopicData * data = (NSCacheTopicData *) data;\r
         OICFree(data->topicName);\r
     }\r
-    else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC)\r
+    else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME || NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
     {\r
         NSCacheTopicSubData * data = (NSCacheTopicSubData *) data;\r
         OICFree(data->topicName);\r
@@ -509,3 +507,93 @@ NSResult NSStorageDelete(NSCacheList * list, const char * delId)
     pthread_mutex_unlock(&NSCacheMutex);\r
     return NS_FAIL;\r
 }\r
+\r
+NSTopics * NSProviderGetTopicsCacheData(NSCacheList * regTopicList)\r
+{\r
+    NS_LOG(DEBUG, "NSProviderGetTopicsCache - IN");\r
+    pthread_mutex_lock(&NSCacheMutex);\r
+\r
+    NSCacheElement * iter = regTopicList->head;\r
+\r
+    if(!iter)\r
+    {\r
+        pthread_mutex_unlock(&NSCacheMutex);\r
+        return NULL;\r
+    }\r
+\r
+    NSTopics * iterTopic = NULL;\r
+    NSTopics * newTopic = NULL;\r
+    NSTopics * topics = NULL;\r
+\r
+    while (iter)\r
+    {\r
+        NSCacheTopicData * curr = (NSCacheTopicData *) iter->data;\r
+\r
+        newTopic = (NSTopics *) OICMalloc(sizeof(NSTopics));\r
+        newTopic->state = curr->state;\r
+        newTopic->next = NULL;\r
+        newTopic->topicName = OICStrdup(curr->topicName);\r
+\r
+        if(!topics)\r
+        {\r
+            iterTopic = topics = newTopic;\r
+        }\r
+        else\r
+        {\r
+            iterTopic->next = newTopic;\r
+            iterTopic = newTopic;\r
+        }\r
+\r
+        iter = iter->next;\r
+    }\r
+\r
+    pthread_mutex_unlock(&NSCacheMutex);\r
+    NS_LOG(DEBUG, "NSProviderGetTopicsCache - OUT");\r
+\r
+    return topics;\r
+}\r
+\r
+NSTopics * NSProviderGetConsumerTopicsCacheData(NSCacheList * conTopicList, char *consumerId)\r
+{\r
+    NS_LOG(DEBUG, "NSProviderGetConsumerTopics - IN");\r
+\r
+    pthread_mutex_lock(&NSCacheMutex);\r
+    NSTopics * topics = NSProviderGetTopics();\r
+\r
+    if(!topics)\r
+    {\r
+        pthread_mutex_unlock(&NSCacheMutex);\r
+        return NULL;\r
+    }\r
+\r
+    NSCacheElement * iter = conTopicList->head;\r
+    conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
+\r
+    while(iter)\r
+    {\r
+        NSCacheElement * curr = NSStorageRead(iter, consumerId);\r
+\r
+        if(!curr)\r
+        {\r
+            NSTopics * topicIter = topics;\r
+            while(!topicIter)\r
+            {\r
+                NSCacheTopicSubData * topicSubData = (NSCacheTopicSubData *) curr->data;\r
+                if(strcmp(topicIter->topicName, topicSubData->topicName) == 0)\r
+                {\r
+                    topicIter->state = NS_TOPIC_SUBSCRIBED;\r
+                    break;\r
+                }\r
+                topicIter = topicIter->next;\r
+            }\r
+        }\r
+\r
+        iter = iter->next;\r
+    }\r
+\r
+    conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
+    pthread_mutex_unlock(&NSCacheMutex);\r
+    NS_LOG(DEBUG, "NSProviderGetConsumerTopics - OUT");\r
+\r
+    return topics;\r
+}\r
index cc02053..a7cd8c5 100644 (file)
@@ -42,6 +42,10 @@ NSResult NSCacheUpdateSubScriptionState(NSCacheList *, char *, bool);
 \r
 NSResult NSProviderDeleteSubDataFromObId(NSCacheList * list, OCObservationId id);\r
 \r
+NSTopics * NSProviderGetTopicsCacheData(NSCacheList * regTopicList);\r
+\r
+NSTopics * NSProviderGetConsumerTopicsCacheData(NSCacheList * conTopicList, char *consumerId);\r
+\r
 pthread_mutex_t NSCacheMutex;\r
 pthread_mutexattr_t NSCacheMutexAttr;\r
 \r
index 8eed595..93577d8 100644 (file)
@@ -22,6 +22,7 @@
 \r
 static bool isTopicList = false;\r
 \r
+NSResult NSStoreTopics(const char * topicName);\r
 NSResult NSSendTopicUpdation();\r
 \r
 NSResult NSInitTopicList()\r
@@ -35,7 +36,7 @@ NSResult NSInitTopicList()
     }\r
 \r
     consumerTopicList = NSStorageCreate();\r
-    consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC;\r
+    consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
 \r
     registeredTopicList = NSStorageCreate();\r
     registeredTopicList->cacheType = NS_PROVIDER_CACHE_REGISTER_TOPIC;\r
@@ -357,15 +358,17 @@ void * NSTopicSchedule(void * ptr)
                     NSSendTopicList((OCEntityHandlerRequest*) node->taskData);\r
                     break;\r
                 case TASK_SUBSCRIBE_TOPIC:\r
-                    //TODO: modify subscription with single topic\r
                     NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPIC : ");\r
-                    NSTopicList * topicList = (NSTopicList *) node->taskData;\r
-                    NSSubscribeTopicList(topicList->consumerId, topicList);\r
-                    NSSendTopicUpdationToConsumer(topicList->consumerId);\r
-                    // TODO : free NSTopic\r
+                    NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
+                    newObj->data = node->taskData;\r
+                    newObj->next = NULL;\r
+                    NSStorageWrite(consumerTopicList, newObj);\r
                     break;\r
                 case TASK_UNSUBSCRIBE_TOPIC:\r
-                    // TODO: implement\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
                     break;\r
                 case TASK_ADD_TOPIC:\r
                 {\r