Merge notification service from master branch
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderMemoryCache.c
1 //******************************************************************\r
2 //\r
3 // Copyright 2016 Samsung Electronics All Rights Reserved.\r
4 //\r
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
6 //\r
7 // Licensed under the Apache License, Version 2.0 (the "License");\r
8 // you may not use this file except in compliance with the License.\r
9 // You may obtain a copy of the License at\r
10 //\r
11 //      http://www.apache.org/licenses/LICENSE-2.0\r
12 //\r
13 // Unless required by applicable law or agreed to in writing, software\r
14 // distributed under the License is distributed on an "AS IS" BASIS,\r
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16 // See the License for the specific language governing permissions and\r
17 // limitations under the License.\r
18 //\r
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
20 \r
21 #include "NSProviderMemoryCache.h"\r
22 #include <string.h>\r
23 \r
24 NSCacheList * NSProviderStorageCreate()\r
25 {\r
26     pthread_mutex_lock(&NSCacheMutex);\r
27     NSCacheList * newList = (NSCacheList *) OICMalloc(sizeof(NSCacheList));\r
28     if (!newList)\r
29     {\r
30         pthread_mutex_unlock(&NSCacheMutex);\r
31         return NULL;\r
32     }\r
33 \r
34     newList->head = newList->tail = NULL;\r
35 \r
36     pthread_mutex_unlock(&NSCacheMutex);\r
37     NS_LOG(DEBUG, "NSCacheCreate");\r
38 \r
39     return newList;\r
40 }\r
41 \r
42 NSCacheElement * NSProviderStorageRead(NSCacheList * list, const char * findId)\r
43 {\r
44     pthread_mutex_lock(&NSCacheMutex);\r
45 \r
46     NS_LOG(DEBUG, "NSCacheRead - IN");\r
47 \r
48     NSCacheElement * iter = list->head;\r
49     NSCacheElement * next = NULL;\r
50     NSCacheType type = list->cacheType;\r
51 \r
52     NS_LOG_V(DEBUG, "Find ID - %s", findId);\r
53 \r
54     while (iter)\r
55     {\r
56         next = iter->next;\r
57 \r
58         if (NSProviderCompareIdCacheData(type, iter->data, findId))\r
59         {\r
60             NS_LOG(DEBUG, "Found in Cache");\r
61             pthread_mutex_unlock(&NSCacheMutex);\r
62             return iter;\r
63         }\r
64 \r
65         iter = next;\r
66     }\r
67 \r
68     NS_LOG(DEBUG, "Not found in Cache");\r
69     NS_LOG(DEBUG, "NSCacheRead - OUT");\r
70     pthread_mutex_unlock(&NSCacheMutex);\r
71 \r
72     return NULL;\r
73 }\r
74 \r
75 NSResult NSCacheUpdateSubScriptionState(NSCacheList * list, char * id, bool state)\r
76 {\r
77     pthread_mutex_lock(&NSCacheMutex);\r
78 \r
79     NS_LOG(DEBUG, "NSCacheUpdateSubScriptionState - IN");\r
80 \r
81     if (id == NULL)\r
82     {\r
83         NS_LOG(DEBUG, "id is NULL");\r
84         pthread_mutex_unlock(&NSCacheMutex);\r
85         return NS_ERROR;\r
86     }\r
87 \r
88     NSCacheElement * it = NSProviderStorageRead(list, id);\r
89 \r
90     if (it)\r
91     {\r
92         NSCacheSubData * itData = (NSCacheSubData *) it->data;\r
93         if (strcmp(itData->id, id) == 0)\r
94         {\r
95             NS_LOG(DEBUG, "Update Data - IN");\r
96 \r
97             NS_LOG_V(DEBUG, "currData_ID = %s", itData->id);\r
98             NS_LOG_V(DEBUG, "currData_MsgObID = %d", itData->messageObId);\r
99             NS_LOG_V(DEBUG, "currData_SyncObID = %d", itData->syncObId);\r
100             NS_LOG_V(DEBUG, "currData_Cloud_MsgObID = %d", itData->remote_messageObId);\r
101             NS_LOG_V(DEBUG, "currData_Cloud_SyncObID = %d", itData->remote_syncObId);\r
102             NS_LOG_V(DEBUG, "currData_IsWhite = %d", itData->isWhite);\r
103 \r
104             NS_LOG_V(DEBUG, "update state = %d", state);\r
105 \r
106             itData->isWhite = state;\r
107 \r
108             NS_LOG(DEBUG, "Update Data - OUT");\r
109             pthread_mutex_unlock(&NSCacheMutex);\r
110             return NS_OK;\r
111         }\r
112     }\r
113     else\r
114     {\r
115         NS_LOG(DEBUG, "Not Found Data");\r
116     }\r
117 \r
118     NS_LOG(DEBUG, "NSCacheUpdateSubScriptionState - OUT");\r
119     pthread_mutex_unlock(&NSCacheMutex);\r
120     return NS_ERROR;\r
121 }\r
122 \r
123 NSResult NSProviderStorageWrite(NSCacheList * list, NSCacheElement * newObj)\r
124 {\r
125     pthread_mutex_lock(&NSCacheMutex);\r
126 \r
127     NSCacheType type = list->cacheType;\r
128 \r
129     NS_LOG(DEBUG, "NSCacheWrite - IN");\r
130 \r
131     if (newObj == NULL)\r
132     {\r
133         NS_LOG(DEBUG, "newObj is NULL - IN");\r
134         pthread_mutex_unlock(&NSCacheMutex);\r
135         return NS_ERROR;\r
136     }\r
137 \r
138     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
139     {\r
140         NS_LOG(DEBUG, "Type is SUBSCRIBER");\r
141 \r
142         NSCacheSubData * subData = (NSCacheSubData *) newObj->data;\r
143         NSCacheElement * it = NSProviderStorageRead(list, subData->id);\r
144 \r
145         if (it)\r
146         {\r
147             NSCacheSubData * itData = (NSCacheSubData *) it->data;\r
148 \r
149             if (strcmp(itData->id, subData->id) == 0)\r
150             {\r
151                 NS_LOG(DEBUG, "Update Data - IN");\r
152 \r
153                 NS_LOG_V(DEBUG, "currData_ID = %s", itData->id);\r
154                 NS_LOG_V(DEBUG, "currData_MsgObID = %d", itData->messageObId);\r
155                 NS_LOG_V(DEBUG, "currData_SyncObID = %d", itData->syncObId);\r
156                 NS_LOG_V(DEBUG, "currData_Cloud_MsgObID = %d", itData->remote_messageObId);\r
157                 NS_LOG_V(DEBUG, "currData_Cloud_SyncObID = %d", itData->remote_syncObId);\r
158                 NS_LOG_V(DEBUG, "currData_IsWhite = %d", itData->isWhite);\r
159 \r
160                 NS_LOG_V(DEBUG, "subData_ID = %s", subData->id);\r
161                 NS_LOG_V(DEBUG, "subData_MsgObID = %d", subData->messageObId);\r
162                 NS_LOG_V(DEBUG, "subData_SyncObID = %d", subData->syncObId);\r
163                 NS_LOG_V(DEBUG, "subData_Cloud_MsgObID = %d", subData->remote_messageObId);\r
164                 NS_LOG_V(DEBUG, "subData_Cloud_SyncObID = %d", subData->remote_syncObId);\r
165                 NS_LOG_V(DEBUG, "subData_IsWhite = %d", subData->isWhite);\r
166 \r
167                 if (subData->messageObId != 0)\r
168                 {\r
169                     itData->messageObId = subData->messageObId;\r
170                 }\r
171 \r
172                 if (subData->syncObId != 0)\r
173                 {\r
174                     itData->syncObId = subData->syncObId;\r
175                 }\r
176 \r
177                 if (subData->remote_messageObId != 0)\r
178                 {\r
179                     itData->remote_messageObId = subData->remote_messageObId;\r
180                 }\r
181 \r
182                 if (subData->remote_syncObId != 0)\r
183                 {\r
184                     itData->remote_syncObId = subData->remote_syncObId;\r
185                     NS_LOG_V(DEBUG, "sync id cached: %d", itData->remote_syncObId);\r
186                 }\r
187 \r
188                 NS_LOG(DEBUG, "Update Data - OUT");\r
189 \r
190                 pthread_mutex_unlock(&NSCacheMutex);\r
191                 return NS_OK;\r
192             }\r
193         }\r
194 \r
195     }\r
196     else if(type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
197     {\r
198         NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
199 \r
200         NSCacheTopicData * topicData = (NSCacheTopicData *) newObj->data;\r
201         NSCacheElement * it = NSProviderStorageRead(list, topicData->topicName);\r
202 \r
203         if (it)\r
204         {\r
205             NS_LOG(DEBUG, "already registered for topic name");\r
206             OICFree(topicData->topicName);\r
207             OICFree(topicData);\r
208             pthread_mutex_unlock(&NSCacheMutex);\r
209             return NS_FAIL;\r
210         }\r
211     }\r
212     else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)\r
213     {\r
214         NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
215 \r
216         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) newObj->data;\r
217         NSCacheElement * it = NSProviderStorageRead(list, topicData->topicName);\r
218 \r
219         if (it)\r
220         {\r
221             NS_LOG(DEBUG, "already registered for topic name");\r
222             OICFree(topicData->topicName);\r
223             OICFree(topicData);\r
224             pthread_mutex_unlock(&NSCacheMutex);\r
225             return NS_FAIL;\r
226         }\r
227     }\r
228     else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
229     {\r
230         NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
231 \r
232         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) newObj->data;\r
233         NSCacheElement * it = NSProviderStorageRead(list, topicData->id);\r
234 \r
235         if (it)\r
236         {\r
237             NS_LOG(DEBUG, "already registered for topic name");\r
238             OICFree(topicData->topicName);\r
239             OICFree(topicData);\r
240             pthread_mutex_unlock(&NSCacheMutex);\r
241             return NS_FAIL;\r
242         }\r
243     }\r
244 \r
245     if (list->head == NULL)\r
246     {\r
247         NS_LOG(DEBUG, "list->head is NULL, Insert First Data");\r
248         list->head = list->tail = newObj;\r
249         pthread_mutex_unlock(&NSCacheMutex);\r
250         return NS_OK;\r
251     }\r
252 \r
253     list->tail = list->tail->next = newObj;\r
254     NS_LOG(DEBUG, "list->head is not NULL");\r
255     pthread_mutex_unlock(&NSCacheMutex);\r
256     return NS_OK;\r
257 }\r
258 \r
259 NSResult NSProviderStorageDestroy(NSCacheList * list)\r
260 {\r
261     NSCacheElement * iter = list->head;\r
262     NSCacheElement * next = NULL;\r
263     NSCacheType type = list->cacheType;\r
264 \r
265     while (iter)\r
266     {\r
267         next = (NSCacheElement *) iter->next;\r
268         NSProviderDeleteCacheData(type, iter->data);\r
269         OICFree(iter);\r
270         iter = next;\r
271     }\r
272 \r
273     OICFree(list);\r
274     return NS_OK;\r
275 }\r
276 \r
277 \r
278 bool NSIsSameObId(NSCacheSubData * data, OCObservationId id)\r
279 {\r
280     if (id == data->messageObId || id == data->syncObId || id == data->remote_messageObId ||\r
281                 id == data->remote_syncObId)\r
282     {\r
283         return true;\r
284     }\r
285 \r
286     return false;\r
287 }\r
288 \r
289 bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id)\r
290 {\r
291     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - IN");\r
292 \r
293     if (data == NULL)\r
294     {\r
295         return false;\r
296     }\r
297 \r
298     NS_LOG_V(DEBUG, "Data(compData) = [%s]", id);\r
299 \r
300     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
301     {\r
302         NSCacheSubData * subData = (NSCacheSubData *) data;\r
303 \r
304         NS_LOG_V(DEBUG, "Data(subData) = [%s]", subData->id);\r
305 \r
306         if (strcmp(subData->id, id) == 0)\r
307         {\r
308             NS_LOG(DEBUG, "SubData is Same");\r
309             return true;\r
310         }\r
311 \r
312         NS_LOG(DEBUG, "Message Data is Not Same");\r
313         return false;\r
314     }\r
315     else if (type == NS_PROVIDER_CACHE_SUBSCRIBER_OBSERVE_ID)\r
316     {\r
317         NSCacheSubData * subData = (NSCacheSubData *) data;\r
318 \r
319         NS_LOG_V(DEBUG, "Data(subData) = [%s]", subData->id);\r
320 \r
321         OCObservationId currID = *id;\r
322 \r
323         if (NSIsSameObId(subData, currID))\r
324         {\r
325             NS_LOG(DEBUG, "SubData is Same");\r
326             return true;\r
327         }\r
328 \r
329         NS_LOG(DEBUG, "Message Data is Not Same");\r
330         return false;\r
331     }\r
332     else if (type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
333     {\r
334         NSCacheTopicData * topicData = (NSCacheTopicData *) data;\r
335 \r
336         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->topicName);\r
337 \r
338         if (strcmp(topicData->topicName, id) == 0)\r
339         {\r
340             NS_LOG(DEBUG, "SubData is Same");\r
341             return true;\r
342         }\r
343 \r
344         NS_LOG(DEBUG, "Message Data is Not Same");\r
345         return false;\r
346     }\r
347     else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)\r
348     {\r
349         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
350 \r
351         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->topicName);\r
352 \r
353         if (strcmp(topicData->topicName, id) == 0)\r
354         {\r
355             NS_LOG(DEBUG, "SubData is Same");\r
356             return true;\r
357         }\r
358 \r
359         NS_LOG(DEBUG, "Message Data is Not Same");\r
360         return false;\r
361     }\r
362     else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
363     {\r
364         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
365 \r
366         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->id);\r
367 \r
368         if (strcmp(topicData->id, id) == 0)\r
369         {\r
370             NS_LOG(DEBUG, "SubData is Same");\r
371             return true;\r
372         }\r
373 \r
374         NS_LOG(DEBUG, "Message Data is Not Same");\r
375         return false;\r
376     }\r
377 \r
378 \r
379     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - OUT");\r
380     return false;\r
381 }\r
382 \r
383 NSResult NSProviderDeleteCacheData(NSCacheType type, void * data)\r
384 {\r
385     if (!data)\r
386     {\r
387         return NS_ERROR;\r
388     }\r
389 \r
390     if (type == NS_PROVIDER_CACHE_SUBSCRIBER || type == NS_PROVIDER_CACHE_SUBSCRIBER_OBSERVE_ID)\r
391     {\r
392         NSCacheSubData * subData = (NSCacheSubData *) data;\r
393 \r
394         (subData->id)[0] = '\0';\r
395         OICFree(subData);\r
396         return NS_OK;\r
397     }\r
398     else if(type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
399     {\r
400 \r
401         NSCacheTopicData * topicData = (NSCacheTopicData *) data;\r
402         NS_LOG_V(DEBUG, "topicData->topicName = %s, topicData->state = %d", topicData->topicName,\r
403                 (int)topicData->state);\r
404 \r
405         OICFree(topicData->topicName);\r
406     }\r
407     else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME ||\r
408             type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
409     {\r
410         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
411         OICFree(topicData->topicName);\r
412     }\r
413 \r
414     return NS_OK;\r
415 }\r
416 \r
417 NSResult NSProviderStorageDelete(NSCacheList * list, const char * delId)\r
418 {\r
419     pthread_mutex_lock(&NSCacheMutex);\r
420     NSCacheElement * prev = list->head;\r
421     NSCacheElement * del = list->head;\r
422 \r
423     NSCacheType type = list->cacheType;\r
424 \r
425     if(!del)\r
426     {\r
427         NS_LOG(DEBUG, "list head is NULL");\r
428         pthread_mutex_unlock(&NSCacheMutex);\r
429         return NS_FAIL;\r
430     }\r
431 \r
432     if (NSProviderCompareIdCacheData(type, del->data, delId))\r
433     {\r
434         if (del == list->head) // first object\r
435         {\r
436             if (del == list->tail) // first object (one object)\r
437             {\r
438                 list->tail = del->next;\r
439             }\r
440 \r
441             list->head = del->next;\r
442             NSProviderDeleteCacheData(type, del->data);\r
443             OICFree(del);\r
444             pthread_mutex_unlock(&NSCacheMutex);\r
445             return NS_OK;\r
446         }\r
447     }\r
448 \r
449     del = del->next;\r
450     while (del)\r
451     {\r
452         if (NSProviderCompareIdCacheData(type, del->data, delId))\r
453         {\r
454             if (del == list->tail) // delete object same to last object\r
455             {\r
456                 list->tail = prev;\r
457             }\r
458 \r
459             prev->next = del->next;\r
460             NSProviderDeleteCacheData(type, del->data);\r
461             OICFree(del);\r
462             pthread_mutex_unlock(&NSCacheMutex);\r
463             return NS_OK;\r
464         }\r
465 \r
466         prev = del;\r
467         del = del->next;\r
468     }\r
469     pthread_mutex_unlock(&NSCacheMutex);\r
470     return NS_FAIL;\r
471 }\r
472 \r
473 NSTopicLL * NSProviderGetTopicsCacheData(NSCacheList * regTopicList)\r
474 {\r
475     NS_LOG(DEBUG, "NSProviderGetTopicsCache - IN");\r
476     pthread_mutex_lock(&NSCacheMutex);\r
477 \r
478     NSCacheElement * iter = regTopicList->head;\r
479 \r
480     if(!iter)\r
481     {\r
482         pthread_mutex_unlock(&NSCacheMutex);\r
483         return NULL;\r
484     }\r
485 \r
486     NSTopicLL * iterTopic = NULL;\r
487     NSTopicLL * newTopic = NULL;\r
488     NSTopicLL * topics = NULL;\r
489 \r
490     while (iter)\r
491     {\r
492         NSCacheTopicData * curr = (NSCacheTopicData *) iter->data;\r
493         newTopic = (NSTopicLL *) OICMalloc(sizeof(NSTopicLL));\r
494         if(!newTopic)\r
495         {\r
496             pthread_mutex_unlock(&NSCacheMutex);\r
497             return NULL;\r
498         }\r
499 \r
500         newTopic->state = curr->state;\r
501         newTopic->next = NULL;\r
502         newTopic->topicName = OICStrdup(curr->topicName);\r
503 \r
504         if(!topics)\r
505         {\r
506             iterTopic = topics = newTopic;\r
507         }\r
508         else\r
509         {\r
510             iterTopic->next = newTopic;\r
511             iterTopic = newTopic;\r
512         }\r
513 \r
514         iter = iter->next;\r
515     }\r
516 \r
517     pthread_mutex_unlock(&NSCacheMutex);\r
518     NS_LOG(DEBUG, "NSProviderGetTopicsCache - OUT");\r
519 \r
520     return topics;\r
521 }\r
522 \r
523 NSTopicLL * NSProviderGetConsumerTopicsCacheData(NSCacheList * regTopicList,\r
524         NSCacheList * conTopicList, const char * consumerId)\r
525 {\r
526     NS_LOG(DEBUG, "NSProviderGetConsumerTopicsCacheData - IN");\r
527 \r
528     pthread_mutex_lock(&NSCacheMutex);\r
529     NSTopicLL * topics = NSProviderGetTopicsCacheData(regTopicList);\r
530 \r
531     if(!topics)\r
532     {\r
533         pthread_mutex_unlock(&NSCacheMutex);\r
534         return NULL;\r
535     }\r
536 \r
537     NSCacheElement * iter = conTopicList->head;\r
538     conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
539 \r
540     while(iter)\r
541     {\r
542         NSCacheTopicSubData * curr = (NSCacheTopicSubData *)iter->data;\r
543 \r
544         if(curr && strcmp(curr->id, consumerId) == 0)\r
545         {\r
546             NS_LOG_V(DEBUG, "curr->id = %s", curr->id);\r
547             NS_LOG_V(DEBUG, "curr->topicName = %s", curr->topicName);\r
548 \r
549             NSTopicLL * topicIter = topics;\r
550             while(topicIter)\r
551             {\r
552                 if(strcmp(topicIter->topicName, curr->topicName) == 0)\r
553                 {\r
554                     topicIter->state = NS_TOPIC_SUBSCRIBED;\r
555                     break;\r
556                 }\r
557                 topicIter = topicIter->next;\r
558             }\r
559         }\r
560 \r
561         iter = iter->next;\r
562     }\r
563 \r
564     conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
565     pthread_mutex_unlock(&NSCacheMutex);\r
566     NS_LOG(DEBUG, "NSProviderGetConsumerTopics - OUT");\r
567 \r
568     return topics;\r
569 }\r
570 \r
571 bool NSProviderIsTopicSubScribed(NSCacheElement * conTopicList, char * cId, char * topicName)\r
572 {\r
573     pthread_mutex_lock(&NSCacheMutex);\r
574 \r
575     if(!conTopicList || !cId || !topicName)\r
576     {\r
577         pthread_mutex_unlock(&NSCacheMutex);\r
578         return false;\r
579     }\r
580 \r
581     NSCacheElement * iter = conTopicList;\r
582     while(iter)\r
583     {\r
584         NSCacheTopicSubData * curr = (NSCacheTopicSubData *) iter->data;\r
585 \r
586         if( (strcmp(curr->id, cId) == 0) && (strcmp(curr->topicName, topicName) == 0) )\r
587         {\r
588             pthread_mutex_unlock(&NSCacheMutex);\r
589             return true;\r
590         }\r
591         iter = iter->next;\r
592     }\r
593 \r
594     pthread_mutex_unlock(&NSCacheMutex);\r
595     return false;\r
596 }\r
597 \r
598 NSResult NSProviderDeleteConsumerTopic(NSCacheList * conTopicList,\r
599         NSCacheTopicSubData * topicSubData)\r
600 {\r
601     pthread_mutex_lock(&NSCacheMutex);\r
602 \r
603     char * cId = topicSubData->id;\r
604     char * topicName = topicSubData->topicName;\r
605 \r
606     if(!conTopicList || !cId || !topicName)\r
607     {\r
608         pthread_mutex_unlock(&NSCacheMutex);\r
609         return NS_ERROR;\r
610     }\r
611 \r
612     NSCacheElement * prev = conTopicList->head;\r
613     NSCacheElement * del = conTopicList->head;\r
614 \r
615     NSCacheType type = conTopicList->cacheType;\r
616 \r
617     if(!del)\r
618     {\r
619         NS_LOG(DEBUG, "list head is NULL");\r
620         pthread_mutex_unlock(&NSCacheMutex);\r
621         return NS_FAIL;\r
622     }\r
623 \r
624     NSCacheTopicSubData * curr = (NSCacheTopicSubData *) del->data;\r
625     NS_LOG_V(DEBUG, "compareid = %s", cId);\r
626     NS_LOG_V(DEBUG, "comparetopicName = %s", topicName);\r
627     NS_LOG_V(DEBUG, "curr->id = %s", curr->id);\r
628     NS_LOG_V(DEBUG, "curr->topicName = %s", curr->topicName);\r
629 \r
630     if( (strncmp(curr->id, cId, NS_UUID_STRING_SIZE) == 0) &&\r
631             (strcmp(curr->topicName, topicName) == 0) )\r
632     {\r
633         if (del == conTopicList->head) // first object\r
634         {\r
635             if (del == conTopicList->tail) // first object (one object)\r
636             {\r
637                 conTopicList->tail = del->next;\r
638             }\r
639 \r
640             conTopicList->head = del->next;\r
641             NSProviderDeleteCacheData(type, del->data);\r
642             OICFree(del);\r
643             pthread_mutex_unlock(&NSCacheMutex);\r
644             return NS_OK;\r
645         }\r
646     }\r
647 \r
648     curr = NULL;\r
649     del = del->next;\r
650     while (del)\r
651     {\r
652         curr = (NSCacheTopicSubData *) del->data;\r
653         if( (strncmp(curr->id, cId, NS_UUID_STRING_SIZE) == 0) &&\r
654                 (strcmp(curr->topicName, topicName) == 0) )\r
655         {\r
656             if (del == conTopicList->tail) // delete object same to last object\r
657             {\r
658                 conTopicList->tail = prev;\r
659             }\r
660 \r
661             prev->next = del->next;\r
662             NSProviderDeleteCacheData(type, del->data);\r
663             OICFree(del);\r
664             pthread_mutex_unlock(&NSCacheMutex);\r
665             return NS_OK;\r
666         }\r
667 \r
668         prev = del;\r
669         del = del->next;\r
670     }\r
671     pthread_mutex_unlock(&NSCacheMutex);\r
672     return NS_FAIL;\r
673 }\r