Add logic for checking the null
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderTopic.c
index f30df90..e398e65 100644 (file)
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
 \r
 #include "NSProviderTopic.h"\r
+#include "oic_string.h"\r
+#include "oic_malloc.h"\r
+#include <pthread.h>\r
 \r
-static bool isTopicList = false;\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
+    consumerTopicList = NSProviderStorageCreate();\r
+    NS_VERIFY_NOT_NULL(consumerTopicList, NS_FAIL);\r
+    consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
 \r
-    consumerTopicList = NSStorageCreate();\r
-    consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC;\r
-\r
-    registeredTopicList = NSStorageCreate();\r
+    registeredTopicList = NSProviderStorageCreate();\r
+    NS_VERIFY_NOT_NULL(registeredTopicList, NS_FAIL);\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
+size_t NSProviderGetTopicListSize(NSTopicLL * firstElement)\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
+    if (!firstElement)\r
     {\r
-        NS_LOG_V(DEBUG, "Subscribed topic list for consumerId(%s)", consumerId);\r
-        //TODO: get subscribed topic list for consumer\r
+        return 0;\r
     }\r
 \r
-    NS_LOG(DEBUG, "NSGetTopics() NS_OK");\r
-    return topicList;\r
-}\r
+    int cnt = 0;\r
 \r
-//TODO: update parameter\r
-NSResult NSStoreTopics(char *consumerId, NSTopics** topics)\r
-{\r
-    NS_LOG(DEBUG, "NSWriteTopicsToStorage()");\r
+    NSTopicLL * iter = firstElement;\r
 \r
-    if(!consumerId)\r
-    {\r
-        NS_LOG(DEBUG, "Store registered topic list");\r
-        //TODO: store registered topic list\r
-    }\r
-    else // topic selection for consumer\r
+    while (iter)\r
     {\r
-        NS_LOG(DEBUG, "Store subscribed topic list");\r
-        //TODO: store subscribed topic list for consumer\r
-\r
-        //TODO: modiy caching logic\r
-        NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
-        NSCacheTopicData * topicData = (NSCacheTopicData *) OICMalloc(sizeof(NSCacheTopicData));\r
-\r
-        OICStrcpy(topicData->consumerId, UUID_STRING_SIZE, consumerId);\r
-        NS_LOG_V(DEBUG, "consumer id: %s", topicData->consumerId);\r
-\r
-        // TODO: print topic list\r
-        topicData->topics = topics;\r
-        NS_LOG(DEBUG, "print topic list");\r
-\r
-        element->data = (void*) topicData;\r
-        element->next = NULL;\r
-\r
-        if(NSStorageWrite(consumerTopicList, element) != NS_OK)\r
-        {\r
-            NS_LOG(DEBUG, "fail to write cache");\r
-        }\r
+        cnt++;\r
+        iter = iter->next;\r
     }\r
 \r
-    NS_LOG(DEBUG, "NSWriteTopicsToStorage() NS_OK");\r
-    return NS_OK;\r
+    return cnt;\r
 }\r
 \r
-NSResult NSRegisterTopicList(NSTopicList *topicList)\r
+NSResult NSRegisterTopic(const char * topicName)\r
 {\r
-    NS_LOG(DEBUG, "NSRegisterTopicList()");\r
+    NS_LOG(DEBUG, "NSWriteTopicsToStorage()");\r
+\r
+    NSCacheTopicData * data = (NSCacheTopicData *) OICMalloc(sizeof(NSCacheTopicData));\r
+    NS_VERIFY_NOT_NULL(data, NS_FAIL);\r
+    data->topicName = (char *) topicName;\r
+    data->state = NS_TOPIC_UNSUBSCRIBED;\r
 \r
-    if(!topicList)\r
+    NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
+    if (!element)\r
     {\r
-        NS_LOG(ERROR, "no topics");\r
-        return NS_ERROR;\r
+        OICFree(data->topicName);\r
+        OICFree(data);\r
+        return NS_FAIL;\r
     }\r
+    element->data = (void *) data;\r
+    element->next = NULL;\r
 \r
-    OCResourceHandle rHandle = NULL;\r
-    if(NSPutTopicResource(topicList, &rHandle) != NS_OK)\r
+    if(NSProviderStorageWrite(registeredTopicList, element) != NS_OK)\r
     {\r
-        NS_LOG(ERROR, "Fail to put topic resource");\r
-        return NS_ERROR;\r
+        NS_LOG(DEBUG, "fail to write cache");\r
+        return NS_FAIL;\r
     }\r
+    NSSendTopicUpdation();\r
 \r
-    NSStoreTopics(NULL, topicList->head);\r
-\r
-    NS_LOG(DEBUG, "NSRegisterTopicList() NS_OK");\r
+    NS_LOG(DEBUG, "NSWriteTopicsToStorage() NS_OK");\r
     return NS_OK;\r
 }\r
 \r
-NSResult NSSubscribeTopicList(char *consumerId, NSTopicList *topicList)\r
+NSResult NSUnregisterTopic(const char * topicName)\r
 {\r
-    NS_LOG(DEBUG, "NSSubscribeTopicList()");\r
+    NS_LOG(DEBUG, "NSDeleteTopics()");\r
+    NSResult result = NS_OK;\r
 \r
-    if(!topicList)\r
+    if (!topicName)\r
     {\r
-        NS_LOG(ERROR, "no topics");\r
+        NS_LOG(ERROR, "topicName is NULL");\r
         return NS_ERROR;\r
     }\r
 \r
-    if(!consumerId)\r
+    result = NSProviderStorageDelete(registeredTopicList, topicName);\r
+    while (NSProviderStorageDelete(consumerTopicList, topicName) != NS_FAIL)\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
+    if (result == NS_OK)\r
     {\r
-        NS_LOG(ERROR, "Fail to put topic resource");\r
-        return NS_ERROR;\r
+        NSSendTopicUpdation();\r
     }\r
 \r
-    NSStoreTopics(consumerId, topicList->head);\r
-\r
-    NS_LOG(DEBUG, "NSSubscribeTopicList() NS_OK");\r
-    return NS_OK;\r
+    return result;\r
 }\r
 \r
 NSResult NSSendTopicUpdation()\r
@@ -179,7 +138,8 @@ NSResult NSSendTopicUpdation()
     OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, NS_TOPIC);\r
     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
 \r
-    OCObservationId obArray[255] = { 0, };\r
+    OCObservationId obArray[255] =\r
+    { 0, };\r
     int obCount = 0;\r
 \r
     NSCacheElement * it = consumerSubList->head;\r
@@ -190,30 +150,28 @@ NSResult NSSendTopicUpdation()
 \r
         if (subData->isWhite)\r
         {\r
-            if(subData->messageObId != 0)\r
+            if (subData->messageObId != 0)\r
             {\r
                 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
 \r
-    if(!obCount)\r
+    if (!obCount)\r
     {\r
         NS_LOG(ERROR, "observer count is zero");\r
         return NS_ERROR;\r
     }\r
 \r
-    if (OCNotifyListOfObservers(rHandle, obArray, obCount, payload, OC_HIGH_QOS)\r
-            != OC_STACK_OK)\r
+    if (OCNotifyListOfObservers(rHandle, obArray, obCount, payload, OC_HIGH_QOS) != OC_STACK_OK)\r
     {\r
         NS_LOG(ERROR, "fail to send topic updation");\r
         OCRepPayloadDestroy(payload);\r
@@ -249,9 +207,9 @@ NSResult NSSendTopicUpdationToConsumer(char *consumerId)
     OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, NS_TOPIC);\r
     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
 \r
-    NSCacheElement * element = NSStorageRead(consumerSubList, consumerId);\r
+    NSCacheElement * element = NSProviderStorageRead(consumerSubList, consumerId);\r
 \r
-    if(element == NULL)\r
+    if (element == NULL)\r
     {\r
         NS_LOG(ERROR, "element is NULL");\r
         return NS_ERROR;\r
@@ -259,13 +217,12 @@ NSResult NSSendTopicUpdationToConsumer(char *consumerId)
 \r
     NSCacheSubData * subData = (NSCacheSubData*) element->data;\r
 \r
-    if (OCNotifyListOfObservers(rHandle, (OCObservationId*)&subData->messageObId, 1, payload, OC_HIGH_QOS)\r
-            != OC_STACK_OK)\r
+    if (OCNotifyListOfObservers(rHandle, (OCObservationId*) &subData->messageObId, 1, payload,\r
+            OC_HIGH_QOS) != OC_STACK_OK)\r
     {\r
         NS_LOG(ERROR, "fail to send topic updation");\r
         OCRepPayloadDestroy(payload);\r
         return NS_ERROR;\r
-\r
     }\r
 \r
     OCRepPayloadDestroy(payload);\r
@@ -279,17 +236,21 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest)
     NS_LOG(DEBUG, "NSSendTopicList - IN");\r
 \r
     char * id = NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_CONSUMER_ID);\r
-    if(!id)\r
+    NSTopicLL * topics = 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
     }\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(registeredTopicList, consumerTopicList, id);\r
+        if (!topics)\r
+        {\r
+            topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
+        }\r
     }\r
 \r
     // make response for the Get Request\r
@@ -306,28 +267,68 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest)
         return NS_ERROR;\r
     }\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
+    OCRepPayloadSetUri(payload, NS_COLLECTION_TOPIC_URI);\r
+    if (id)\r
+    {\r
+        OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id);\r
+    }\r
+    OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
+\r
+    if (topics)\r
+    {\r
+        NS_LOG(DEBUG, "topicList is NULL");\r
+        size_t dimensionSize = (size_t) NSProviderGetTopicListSize(topics);\r
+\r
+        NS_LOG_V(DEBUG, "dimensionSize = %d", (int)dimensionSize);\r
 \r
-    OCRepPayloadSetPropString(payloadTopic1, NS_ATTRIBUTE_TOPIC_NAME, "test topic name1");\r
-    OCRepPayloadSetPropBool(payloadTopic1, NS_ATTRIBUTE_TOPIC_SELECTION, true);\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
+        NS_VERIFY_NOT_NULL(payloadTopicArray, NS_ERROR);\r
 \r
-    payloadTopicArray[dimensions++] = payloadTopic1;\r
-    payloadTopicArray[dimensions++] = payloadTopic2;\r
-    // end of set topics\r
+        size_t dimensions[3] =\r
+        { dimensionSize, 0, 0 };\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
+        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
+            NS_VERIFY_NOT_NULL(payloadTopicArray[i], NS_ERROR);\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
+        OCRepPayloadSetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
+                (const OCRepPayload**) (payloadTopicArray), dimensions);\r
+    }\r
+    else\r
+    {\r
+        size_t dimensions[3] =\r
+        { 0, 0, 0 };\r
+\r
+        OCRepPayloadSetPropObjectArrayAsOwner(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
+                (OCRepPayload **) NULL, dimensions);\r
+    }\r
+\r
+    char * reqInterface =\r
+            NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE);\r
+\r
+    if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)\r
+    {\r
+        OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);\r
+        OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ);\r
+        OCResourcePayloadAddStringLL(&payload->types, NS_ROOT_TYPE);\r
+    }\r
 \r
     response.requestHandle = entityHandlerRequest->requestHandle;\r
     response.resourceHandle = entityHandlerRequest->resource;\r
@@ -335,23 +336,85 @@ 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
         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
+NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest)\r
 {\r
-    //TODO: implement function\r
-    return true;\r
+    NS_LOG(DEBUG, "NSPostConsumerTopics() - IN");\r
+\r
+    char * consumerId = NULL;\r
+    OCRepPayload * payload = (OCRepPayload *) 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_FAIL;\r
+    }\r
+\r
+    NS_LOG_V(DEBUG, "TOPIC consumer ID = %s", consumerId);\r
+\r
+    consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
+
+    while (NSProviderStorageDelete(consumerTopicList, consumerId) != NS_FAIL)\r
+    {\r
+    }\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
+    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
+        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, (int)topicState);\r
+\r
+        if (NS_TOPIC_SUBSCRIBED == (NSTopicState) topicState)\r
+        {\r
+            NSCacheTopicSubData * topicSubData = (NSCacheTopicSubData *) OICMalloc(\r
+                    sizeof(NSCacheTopicSubData));\r
+            NS_VERIFY_NOT_NULL(topicSubData, NS_FAIL);\r
+\r
+            OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId);\r
+            topicSubData->topicName = topicName;\r
+\r
+            NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
+\r
+            if (!newObj)\r
+            {\r
+                OICFree(topicSubData->topicName);\r
+                OICFree(topicSubData);\r
+                OICFree(consumerId);\r
+                return NS_FAIL;\r
+            }\r
+\r
+            newObj->data = (NSCacheData *) topicSubData;\r
+            newObj->next = NULL;\r
+\r
+            NSProviderStorageWrite(consumerTopicList, newObj);
+        }\r
+    }\r
+    NSSendTopicUpdationToConsumer(consumerId);\r
+    OICFree(consumerId);\r
+    NS_LOG(DEBUG, "NSPostConsumerTopics() - OUT");\r
+    return NS_OK;\r
 }\r
 \r
 void * NSTopicSchedule(void * ptr)\r
@@ -376,28 +439,90 @@ 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
-                    //TODO: modify subscription with single topic\r
+                {\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
+                    if (newObj)\r
+                    {\r
+                        newObj->data = node->taskData;\r
+                        newObj->next = NULL;\r
+                        if (NSProviderStorageWrite(consumerTopicList, newObj) == NS_OK)\r
+                        {\r
+                            NSCacheTopicSubData * topicSubData =\r
+                                    (NSCacheTopicSubData *) node->taskData;\r
+                            NSSendTopicUpdationToConsumer(topicSubData->id);\r
+                        }\r
+                    }
+                }\r
                     break;\r
                 case TASK_UNSUBSCRIBE_TOPIC:\r
-                    // TODO: implement\r
+                {\r
+                    NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPIC : ");\r
+                    NSCacheTopicSubData * topicSubData = (NSCacheTopicSubData *) node->taskData;\r
+                    if (NSProviderDeleteConsumerTopic(consumerTopicList,\r
+                            (NSCacheTopicSubData *) node->taskData) == NS_OK)\r
+                    {\r
+                        NSSendTopicUpdationToConsumer(topicSubData->id);\r
+                    }\r
+                    OICFree(topicSubData->topicName);\r
+                    OICFree(topicSubData);\r
+                }\r
                     break;\r
-                case TASK_ADD_TOPIC:\r
-                    // TODO: modify to add single topic\r
+                case TASK_REGISTER_TOPIC:\r
+                {\r
                     NS_LOG(DEBUG, "CASE TASK_ADD_TOPIC : ");\r
-                    NSTopicList * registeredTopicList = (NSTopicList *) node->taskData;\r
-                    NSRegisterTopicList(registeredTopicList);\r
-                    NSSendTopicUpdation();\r
-                    // TODO : free NSTopic\r
+                    NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
+\r
+                    pthread_mutex_lock(topicSyncResult->mutex);\r
+                    topicSyncResult->result = NSRegisterTopic(\r
+                            (const char *) topicSyncResult->topicName);\r
+                    pthread_cond_signal(topicSyncResult->condition);\r
+                    pthread_mutex_unlock(topicSyncResult->mutex);\r
+                }\r
+                    break;\r
+                case TASK_UNREGISTER_TOPIC:\r
+                {\r
+                    NS_LOG(DEBUG, "CASE_TASK_DELETE_TOPIC : ");\r
+                    NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
+                    pthread_mutex_lock(topicSyncResult->mutex);\r
+                    topicSyncResult->result = NSUnregisterTopic(\r
+                            (const char *) topicSyncResult->topicName);\r
+                    pthread_cond_signal(topicSyncResult->condition);\r
+                    pthread_mutex_unlock(topicSyncResult->mutex);\r
+                }\r
+                    break;\r
+                case TASK_POST_TOPIC:\r
+                {\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
+                    NSTopicSync * topicSync = (NSTopicSync *) node->taskData;\r
+                    pthread_mutex_lock(topicSync->mutex);\r
+                    NSTopicLL * topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
+                    topicSync->topics = topics;\r
+                    pthread_cond_signal(topicSync->condition);\r
+                    pthread_mutex_unlock(topicSync->mutex);\r
+                }\r
                     break;\r
-                case TASK_DELETE_TOPIC:\r
-                    // TODO: implement \r
+                case TAST_GET_CONSUMER_TOPICS:\r
+                {\r
+                    NS_LOG(DEBUG, "TASK_GET_CONSUMER_TOPICS : ");\r
+                    NSTopicSync * topicSync = (NSTopicSync *) node->taskData;\r
+                    pthread_mutex_lock(topicSync->mutex);\r
+                    NSTopicLL * topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList,\r
+                            consumerTopicList, topicSync->consumerId);\r
+                    topicSync->topics = topics;\r
+                    pthread_cond_signal(topicSync->condition);\r
+                    pthread_mutex_unlock(topicSync->mutex);\r
+                }\r
                     break;\r
                 default:\r
                     break;\r