replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderMemoryCache.c
index fce3322..9e4dd69 100644 (file)
 #include "NSProviderMemoryCache.h"\r
 #include <string.h>\r
 \r
-NSCacheList * NSStorageCreate()\r
+#define NS_PROVIDER_DELETE_REGISTERED_TOPIC_DATA(it, topicData, newObj) \\r
+    { \\r
+        if (it) \\r
+        { \\r
+            NS_LOG(DEBUG, "already registered for topic name"); \\r
+            NSOICFree(topicData->topicName); \\r
+            NSOICFree(topicData); \\r
+            NSOICFree(newObj); \\r
+            pthread_mutex_unlock(&NSCacheMutex); \\r
+            return NS_FAIL; \\r
+        } \\r
+    }\r
+\r
+NSCacheList * NSProviderStorageCreate()\r
 {\r
     pthread_mutex_lock(&NSCacheMutex);\r
     NSCacheList * newList = (NSCacheList *) OICMalloc(sizeof(NSCacheList));\r
+\r
     if (!newList)\r
     {\r
         pthread_mutex_unlock(&NSCacheMutex);\r
@@ -39,7 +53,7 @@ NSCacheList * NSStorageCreate()
     return newList;\r
 }\r
 \r
-NSCacheElement * NSStorageRead(NSCacheList * list, const char * findId)\r
+NSCacheElement * NSProviderStorageRead(NSCacheList * list, const char * findId)\r
 {\r
     pthread_mutex_lock(&NSCacheMutex);\r
 \r
@@ -49,7 +63,7 @@ NSCacheElement * NSStorageRead(NSCacheList * list, const char * findId)
     NSCacheElement * next = NULL;\r
     NSCacheType type = list->cacheType;\r
 \r
-    NS_LOG_V(DEBUG, "Find ID - %s", findId);\r
+    NS_LOG_V(INFO_PRIVATE, "Find ID - %s", findId);\r
 \r
     while (iter)\r
     {\r
@@ -85,7 +99,7 @@ NSResult NSCacheUpdateSubScriptionState(NSCacheList * list, char * id, bool stat
         return NS_ERROR;\r
     }\r
 \r
-    NSCacheElement * it = NSStorageRead(list, id);\r
+    NSCacheElement * it = NSProviderStorageRead(list, id);\r
 \r
     if (it)\r
     {\r
@@ -94,7 +108,7 @@ NSResult NSCacheUpdateSubScriptionState(NSCacheList * list, char * id, bool stat
         {\r
             NS_LOG(DEBUG, "Update Data - IN");\r
 \r
-            NS_LOG_V(DEBUG, "currData_ID = %s", itData->id);\r
+            NS_LOG_V(INFO_PRIVATE, "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
@@ -120,7 +134,7 @@ NSResult NSCacheUpdateSubScriptionState(NSCacheList * list, char * id, bool stat
     return NS_ERROR;\r
 }\r
 \r
-NSResult NSStorageWrite(NSCacheList * list, NSCacheElement * newObj)\r
+NSResult NSProviderStorageWrite(NSCacheList * list, NSCacheElement * newObj)\r
 {\r
     pthread_mutex_lock(&NSCacheMutex);\r
 \r
@@ -140,7 +154,7 @@ NSResult NSStorageWrite(NSCacheList * list, NSCacheElement * newObj)
         NS_LOG(DEBUG, "Type is SUBSCRIBER");\r
 \r
         NSCacheSubData * subData = (NSCacheSubData *) newObj->data;\r
-        NSCacheElement * it = NSStorageRead(list, subData->id);\r
+        NSCacheElement * it = NSProviderStorageRead(list, subData->id);\r
 \r
         if (it)\r
         {\r
@@ -150,14 +164,14 @@ NSResult NSStorageWrite(NSCacheList * list, NSCacheElement * newObj)
             {\r
                 NS_LOG(DEBUG, "Update Data - IN");\r
 \r
-                NS_LOG_V(DEBUG, "currData_ID = %s", itData->id);\r
+                NS_LOG_V(INFO_PRIVATE, "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, "subData_ID = %s", subData->id);\r
+                NS_LOG_V(INFO_PRIVATE, "subData_ID = %s", subData->id);\r
                 NS_LOG_V(DEBUG, "subData_MsgObID = %d", subData->messageObId);\r
                 NS_LOG_V(DEBUG, "subData_SyncObID = %d", subData->syncObId);\r
                 NS_LOG_V(DEBUG, "subData_Cloud_MsgObID = %d", subData->remote_messageObId);\r
@@ -186,58 +200,42 @@ NSResult NSStorageWrite(NSCacheList * list, NSCacheElement * newObj)
                 }\r
 \r
                 NS_LOG(DEBUG, "Update Data - OUT");\r
-\r
+                NSOICFree(subData);\r
+                NSOICFree(newObj);\r
                 pthread_mutex_unlock(&NSCacheMutex);\r
                 return NS_OK;\r
             }\r
         }\r
 \r
     }\r
-    else if(type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
+    else if (type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
     {\r
         NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
 \r
         NSCacheTopicData * topicData = (NSCacheTopicData *) newObj->data;\r
-        NSCacheElement * it = NSStorageRead(list, topicData->topicName);\r
+        NSCacheElement * it = NSProviderStorageRead(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
+        NS_PROVIDER_DELETE_REGISTERED_TOPIC_DATA(it, topicData, newObj);\r
     }\r
-    else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)\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
+        NSCacheElement * it = NSProviderStorageRead(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
+        NS_PROVIDER_DELETE_REGISTERED_TOPIC_DATA(it, topicData, newObj);\r
     }\r
-\r
-    else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\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
+        NSCacheElement * it = NSProviderStorageRead(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
+        NS_PROVIDER_DELETE_REGISTERED_TOPIC_DATA(it, topicData, newObj);\r
     }\r
 \r
-\r
     if (list->head == NULL)\r
     {\r
         NS_LOG(DEBUG, "list->head is NULL, Insert First Data");\r
@@ -252,7 +250,7 @@ NSResult NSStorageWrite(NSCacheList * list, NSCacheElement * newObj)
     return NS_OK;\r
 }\r
 \r
-NSResult NSStorageDestroy(NSCacheList * list)\r
+NSResult NSProviderStorageDestroy(NSCacheList * list)\r
 {\r
     NSCacheElement * iter = list->head;\r
     NSCacheElement * next = NULL;\r
@@ -262,14 +260,25 @@ NSResult NSStorageDestroy(NSCacheList * list)
     {\r
         next = (NSCacheElement *) iter->next;\r
         NSProviderDeleteCacheData(type, iter->data);\r
-        OICFree(iter);\r
+        NSOICFree(iter);\r
         iter = next;\r
     }\r
 \r
-    OICFree(list);\r
+    NSOICFree(list);\r
     return NS_OK;\r
 }\r
 \r
+bool NSIsSameObId(NSCacheSubData * data, OCObservationId id)\r
+{\r
+    if (id == data->messageObId || id == data->syncObId || id == data->remote_messageObId ||\r
+                id == data->remote_syncObId)\r
+    {\r
+        return true;\r
+    }\r
+\r
+    return false;\r
+}\r
+\r
 bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id)\r
 {\r
     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - IN");\r
@@ -279,13 +288,13 @@ bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id
         return false;\r
     }\r
 \r
-    NS_LOG_V(DEBUG, "Data(compData) = [%s]", id);\r
+    NS_LOG_V(INFO_PRIVATE, "Data(compData) = [%s]", id);\r
 \r
     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
     {\r
         NSCacheSubData * subData = (NSCacheSubData *) data;\r
 \r
-        NS_LOG_V(DEBUG, "Data(subData) = [%s]", subData->id);\r
+        NS_LOG_V(INFO_PRIVATE, "Data(subData) = [%s]", subData->id);\r
 \r
         if (strcmp(subData->id, id) == 0)\r
         {\r
@@ -296,6 +305,23 @@ 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_SUBSCRIBER_OBSERVE_ID)\r
+    {\r
+        NSCacheSubData * subData = (NSCacheSubData *) data;\r
+\r
+        NS_LOG_V(INFO_PRIVATE, "Data(subData) = [%s]", subData->id);\r
+\r
+        OCObservationId currID = *id;\r
+\r
+        if (NSIsSameObId(subData, currID))\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
     else if (type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
     {\r
         NSCacheTopicData * topicData = (NSCacheTopicData *) data;\r
@@ -330,7 +356,7 @@ bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id
     {\r
         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
 \r
-        NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->id);\r
+        NS_LOG_V(INFO_PRIVATE, "Data(topicData) = [%s]", topicData->id);\r
 \r
         if (strcmp(topicData->id, id) == 0)\r
         {\r
@@ -349,119 +375,54 @@ bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id
 \r
 NSResult NSProviderDeleteCacheData(NSCacheType type, void * data)\r
 {\r
-    if (data == NULL)\r
+    if (!data)\r
     {\r
-        return NS_OK;\r
+        return NS_ERROR;\r
     }\r
 \r
-    if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
+    if (type == NS_PROVIDER_CACHE_SUBSCRIBER || type == NS_PROVIDER_CACHE_SUBSCRIBER_OBSERVE_ID)\r
     {\r
         NSCacheSubData * subData = (NSCacheSubData *) data;\r
 \r
         (subData->id)[0] = '\0';\r
-        OICFree(subData);\r
-\r
+        NSOICFree(subData);\r
         return NS_OK;\r
     }\r
-    else if(type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
+    else if (type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
     {\r
-        NSCacheTopicData * data = (NSCacheTopicData *) data;\r
-        OICFree(data->topicName);\r
+\r
+        NSCacheTopicData * topicData = (NSCacheTopicData *) data;\r
+        NS_LOG_V(DEBUG, "topicData->topicName = %s, topicData->state = %d", topicData->topicName,\r
+                (int)topicData->state);\r
+\r
+        NSOICFree(topicData->topicName);\r
+        NSOICFree(topicData);\r
     }\r
-    else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME ||\r
+    else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME ||\r
             type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
     {\r
-        NSCacheTopicSubData * data = (NSCacheTopicSubData *) data;\r
-        OICFree(data->topicName);\r
+        NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
+        NSOICFree(topicData->topicName);\r
+        NSOICFree(topicData);\r
     }\r
 \r
     return NS_OK;\r
 }\r
 \r
-bool NSIsSameObId(NSCacheSubData * data, OCObservationId id)\r
-{\r
-    if (id == data->messageObId || id == data->syncObId || id == data->remote_messageObId ||\r
-                id == data->remote_syncObId)\r
-    {\r
-        return true;\r
-    }\r
-\r
-    return false;\r
-}\r
-\r
-NSResult NSProviderDeleteSubDataFromObId(NSCacheList * list, OCObservationId id)\r
+NSResult NSProviderStorageDelete(NSCacheList * list, const char * delId)\r
 {\r
-    if(!list || !list->head)\r
-    {\r
-        NS_LOG(INFO, "list is NULL");\r
-        return NS_FAIL;\r
-    }\r
-\r
     pthread_mutex_lock(&NSCacheMutex);\r
     NSCacheElement * prev = list->head;\r
     NSCacheElement * del = list->head;\r
 \r
     NSCacheType type = list->cacheType;\r
 \r
-    bool isDelete = true;\r
-\r
-    while(isDelete)\r
+    if (!del)\r
     {\r
-        NSCacheSubData * curr = (NSCacheSubData *)del->data;\r
-\r
-        isDelete = false;\r
-\r
-        if (NSIsSameObId(curr, id))\r
-        {\r
-            if (del == list->head) // first object\r
-            {\r
-                if (del == list->tail) // first object (one object)\r
-                {\r
-                    list->tail = del->next;\r
-                }\r
-\r
-                list->head = del->next;\r
-\r
-                NSProviderDeleteCacheData(type, del->data);\r
-                OICFree(del);\r
-                isDelete = true;\r
-            }\r
-        }\r
-        else\r
-        {\r
-            del = del->next;\r
-            while (del)\r
-            {\r
-                if (NSIsSameObId(curr, id))\r
-                {\r
-                    if (del == list->tail) // delete object same to last object\r
-                    {\r
-                        list->tail = prev;\r
-                    }\r
-\r
-                    prev->next = del->next;\r
-                    NSProviderDeleteCacheData(type, del->data);\r
-                    OICFree(del);\r
-                    isDelete = true;\r
-                    break;\r
-                }\r
-\r
-                prev = del;\r
-                del = del->next;\r
-            }\r
-        }\r
+        NS_LOG(DEBUG, "list head is NULL");\r
+        pthread_mutex_unlock(&NSCacheMutex);\r
+        return NS_FAIL;\r
     }\r
-    pthread_mutex_unlock(&NSCacheMutex);\r
-    return NS_OK;\r
-}\r
-\r
-NSResult NSStorageDelete(NSCacheList * list, const char * delId)\r
-{\r
-    pthread_mutex_lock(&NSCacheMutex);\r
-    NSCacheElement * prev = list->head;\r
-    NSCacheElement * del = list->head;\r
-\r
-    NSCacheType type = list->cacheType;\r
 \r
     if (NSProviderCompareIdCacheData(type, del->data, delId))\r
     {\r
@@ -473,15 +434,15 @@ NSResult NSStorageDelete(NSCacheList * list, const char * delId)
             }\r
 \r
             list->head = del->next;\r
-\r
             NSProviderDeleteCacheData(type, del->data);\r
-            OICFree(del);\r
+            NSOICFree(del);\r
             pthread_mutex_unlock(&NSCacheMutex);\r
             return NS_OK;\r
         }\r
     }\r
 \r
     del = del->next;\r
+\r
     while (del)\r
     {\r
         if (NSProviderCompareIdCacheData(type, del->data, delId))\r
@@ -493,7 +454,7 @@ NSResult NSStorageDelete(NSCacheList * list, const char * delId)
 \r
             prev->next = del->next;\r
             NSProviderDeleteCacheData(type, del->data);\r
-            OICFree(del);\r
+            NSOICFree(del);\r
             pthread_mutex_unlock(&NSCacheMutex);\r
             return NS_OK;\r
         }\r
@@ -501,37 +462,44 @@ NSResult NSStorageDelete(NSCacheList * list, const char * delId)
         prev = del;\r
         del = del->next;\r
     }\r
+\r
     pthread_mutex_unlock(&NSCacheMutex);\r
     return NS_FAIL;\r
 }\r
 \r
-NSTopics * NSProviderGetTopicsCacheData(NSCacheList * regTopicList)\r
+NSTopicLL * 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
+    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
+    NSTopicLL * iterTopic = NULL;\r
+    NSTopicLL * newTopic = NULL;\r
+    NSTopicLL * topics = NULL;\r
 \r
     while (iter)\r
     {\r
         NSCacheTopicData * curr = (NSCacheTopicData *) iter->data;\r
+        newTopic = (NSTopicLL *) OICMalloc(sizeof(NSTopicLL));\r
+\r
+        if (!newTopic)\r
+        {\r
+            pthread_mutex_unlock(&NSCacheMutex);\r
+            return NULL;\r
+        }\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
+        if (!topics)\r
         {\r
             iterTopic = topics = newTopic;\r
         }\r
@@ -550,14 +518,15 @@ NSTopics * NSProviderGetTopicsCacheData(NSCacheList * regTopicList)
     return topics;\r
 }\r
 \r
-NSTopics * NSProviderGetConsumerTopicsCacheData(NSCacheList * conTopicList, char *consumerId)\r
+NSTopicLL * NSProviderGetConsumerTopicsCacheData(NSCacheList * regTopicList,\r
+        NSCacheList * conTopicList, const char * consumerId)\r
 {\r
-    NS_LOG(DEBUG, "NSProviderGetConsumerTopics - IN");\r
+    NS_LOG(DEBUG, "NSProviderGetConsumerTopicsCacheData - IN");\r
 \r
     pthread_mutex_lock(&NSCacheMutex);\r
-    NSTopics * topics = NSProviderGetTopics();\r
+    NSTopicLL * topics = NSProviderGetTopicsCacheData(regTopicList);\r
 \r
-    if(!topics)\r
+    if (!topics)\r
     {\r
         pthread_mutex_unlock(&NSCacheMutex);\r
         return NULL;\r
@@ -566,21 +535,24 @@ NSTopics * NSProviderGetConsumerTopicsCacheData(NSCacheList * conTopicList, char
     NSCacheElement * iter = conTopicList->head;\r
     conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
 \r
-    while(iter)\r
+    while (iter)\r
     {\r
-        NSCacheElement * curr = NSStorageRead(iter, consumerId);\r
+        NSCacheTopicSubData * curr = (NSCacheTopicSubData *)iter->data;\r
 \r
-        if(!curr)\r
+        if (curr && strcmp(curr->id, consumerId) == 0)\r
         {\r
-            NSTopics * topicIter = topics;\r
-            while(!topicIter)\r
+            NS_LOG_V(INFO_PRIVATE, "curr->id = %s", curr->id);\r
+            NS_LOG_V(DEBUG, "curr->topicName = %s", curr->topicName);\r
+            NSTopicLL * topicIter = topics;\r
+\r
+            while (topicIter)\r
             {\r
-                NSCacheTopicSubData * topicSubData = (NSCacheTopicSubData *) curr->data;\r
-                if(strcmp(topicIter->topicName, topicSubData->topicName) == 0)\r
+                if (strcmp(topicIter->topicName, curr->topicName) == 0)\r
                 {\r
                     topicIter->state = NS_TOPIC_SUBSCRIBED;\r
                     break;\r
                 }\r
+\r
                 topicIter = topicIter->next;\r
             }\r
         }\r
@@ -595,22 +567,110 @@ NSTopics * NSProviderGetConsumerTopicsCacheData(NSCacheList * conTopicList, char
     return topics;\r
 }\r
 \r
-size_t NSProviderGetListSize(NSCacheElement * firstElement)\r
+bool NSProviderIsTopicSubScribed(NSCacheElement * conTopicList, char * cId, char * topicName)\r
 {\r
-    if(!firstElement)\r
+    pthread_mutex_lock(&NSCacheMutex);\r
+\r
+    if (!conTopicList || !cId || !topicName)\r
     {\r
-        return 0;\r
+        pthread_mutex_unlock(&NSCacheMutex);\r
+        return false;\r
     }\r
 \r
-    int cnt = 0;\r
-\r
-    NSCacheElement * iter = firstElement;\r
+    NSCacheElement * iter = conTopicList;\r
 \r
-    while(iter)\r
+    while (iter)\r
     {\r
-        cnt++;\r
+        NSCacheTopicSubData * curr = (NSCacheTopicSubData *) iter->data;\r
+\r
+        if ( (strcmp(curr->id, cId) == 0) && (strcmp(curr->topicName, topicName) == 0) )\r
+        {\r
+            pthread_mutex_unlock(&NSCacheMutex);\r
+            return true;\r
+        }\r
+\r
         iter = iter->next;\r
     }\r
 \r
-    return cnt;\r
+    pthread_mutex_unlock(&NSCacheMutex);\r
+    return false;\r
+}\r
+\r
+NSResult NSProviderDeleteConsumerTopic(NSCacheList * conTopicList,\r
+        NSCacheTopicSubData * topicSubData)\r
+{\r
+    pthread_mutex_lock(&NSCacheMutex);\r
+\r
+    char * cId = topicSubData->id;\r
+    char * topicName = topicSubData->topicName;\r
+\r
+    if (!conTopicList || !cId || !topicName)\r
+    {\r
+        pthread_mutex_unlock(&NSCacheMutex);\r
+        return NS_ERROR;\r
+    }\r
+\r
+    NSCacheElement * prev = conTopicList->head;\r
+    NSCacheElement * del = conTopicList->head;\r
+\r
+    NSCacheType type = conTopicList->cacheType;\r
+\r
+    if (!del)\r
+    {\r
+        NS_LOG(DEBUG, "list head is NULL");\r
+        pthread_mutex_unlock(&NSCacheMutex);\r
+        return NS_FAIL;\r
+    }\r
+\r
+    NSCacheTopicSubData * curr = (NSCacheTopicSubData *) del->data;\r
+    NS_LOG_V(INFO_PRIVATE, "compareid = %s", cId);\r
+    NS_LOG_V(DEBUG, "comparetopicName = %s", topicName);\r
+    NS_LOG_V(INFO_PRIVATE, "curr->id = %s", curr->id);\r
+    NS_LOG_V(DEBUG, "curr->topicName = %s", curr->topicName);\r
+\r
+    if ( (strncmp(curr->id, cId, NS_UUID_STRING_SIZE) == 0) &&\r
+            (strcmp(curr->topicName, topicName) == 0) )\r
+    {\r
+        if (del == conTopicList->head) // first object\r
+        {\r
+            if (del == conTopicList->tail) // first object (one object)\r
+            {\r
+                conTopicList->tail = del->next;\r
+            }\r
+\r
+            conTopicList->head = del->next;\r
+            NSProviderDeleteCacheData(type, del->data);\r
+            NSOICFree(del);\r
+            pthread_mutex_unlock(&NSCacheMutex);\r
+            return NS_OK;\r
+        }\r
+    }\r
+\r
+    curr = NULL;\r
+    del = del->next;\r
+\r
+    while (del)\r
+    {\r
+        curr = (NSCacheTopicSubData *) del->data;\r
+        if ( (strncmp(curr->id, cId, NS_UUID_STRING_SIZE) == 0) &&\r
+                (strcmp(curr->topicName, topicName) == 0) )\r
+        {\r
+            if (del == conTopicList->tail) // delete object same to last object\r
+            {\r
+                conTopicList->tail = prev;\r
+            }\r
+\r
+            prev->next = del->next;\r
+            NSProviderDeleteCacheData(type, del->data);\r
+            NSOICFree(del);\r
+            pthread_mutex_unlock(&NSCacheMutex);\r
+            return NS_OK;\r
+        }\r
+\r
+        prev = del;\r
+        del = del->next;\r
+    }\r
+\r
+    pthread_mutex_unlock(&NSCacheMutex);\r
+    return NS_FAIL;\r
 }\r