Merge "Merge remote-tracking branch 'origin/master' into notification-service" into...
[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 * NSStorageCreate()\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 * NSStorageRead(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 = NSStorageRead(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 NSStorageWrite(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 = NSStorageRead(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 = NSStorageRead(list, topicData->topicName);\r
202 \r
203         if (it)\r
204         {\r
205             NS_LOG(DEBUG, "already registered for topic name");\r
206             pthread_mutex_unlock(&NSCacheMutex);\r
207             return NS_FAIL;\r
208         }\r
209     }\r
210     else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)\r
211     {\r
212         NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
213 \r
214         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) newObj->data;\r
215         NSCacheElement * it = NSStorageRead(list, topicData->topicName);\r
216 \r
217         if (it)\r
218         {\r
219             NS_LOG(DEBUG, "already registered for topic name");\r
220             pthread_mutex_unlock(&NSCacheMutex);\r
221             return NS_FAIL;\r
222         }\r
223     }\r
224     else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
225     {\r
226         NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
227 \r
228         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) newObj->data;\r
229         NSCacheElement * it = NSStorageRead(list, topicData->id);\r
230 \r
231         if (it)\r
232         {\r
233             NS_LOG(DEBUG, "already registered for topic name");\r
234             pthread_mutex_unlock(&NSCacheMutex);\r
235             return NS_FAIL;\r
236         }\r
237     }\r
238 \r
239     if (list->head == NULL)\r
240     {\r
241         NS_LOG(DEBUG, "list->head is NULL, Insert First Data");\r
242         list->head = list->tail = newObj;\r
243         pthread_mutex_unlock(&NSCacheMutex);\r
244         return NS_OK;\r
245     }\r
246 \r
247     list->tail = list->tail->next = newObj;\r
248     NS_LOG(DEBUG, "list->head is not NULL");\r
249     pthread_mutex_unlock(&NSCacheMutex);\r
250     return NS_OK;\r
251 }\r
252 \r
253 NSResult NSStorageDestroy(NSCacheList * list)\r
254 {\r
255     NSCacheElement * iter = list->head;\r
256     NSCacheElement * next = NULL;\r
257     NSCacheType type = list->cacheType;\r
258 \r
259     while (iter)\r
260     {\r
261         next = (NSCacheElement *) iter->next;\r
262         NSProviderDeleteCacheData(type, iter->data);\r
263         OICFree(iter);\r
264         iter = next;\r
265     }\r
266 \r
267     OICFree(list);\r
268     return NS_OK;\r
269 }\r
270 \r
271 \r
272 bool NSIsSameObId(NSCacheSubData * data, OCObservationId id)\r
273 {\r
274     if (id == data->messageObId || id == data->syncObId || id == data->remote_messageObId ||\r
275                 id == data->remote_syncObId)\r
276     {\r
277         return true;\r
278     }\r
279 \r
280     return false;\r
281 }\r
282 \r
283 bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id)\r
284 {\r
285     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - IN");\r
286 \r
287     if (data == NULL)\r
288     {\r
289         return false;\r
290     }\r
291 \r
292     NS_LOG_V(DEBUG, "Data(compData) = [%s]", id);\r
293 \r
294     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
295     {\r
296         NSCacheSubData * subData = (NSCacheSubData *) data;\r
297 \r
298         NS_LOG_V(DEBUG, "Data(subData) = [%s]", subData->id);\r
299 \r
300         if (strcmp(subData->id, id) == 0)\r
301         {\r
302             NS_LOG(DEBUG, "SubData is Same");\r
303             return true;\r
304         }\r
305 \r
306         NS_LOG(DEBUG, "Message Data is Not Same");\r
307         return false;\r
308     }\r
309     else if (type == NS_PROVIDER_CACHE_SUBSCRIBER_OBSERVE_ID)\r
310     {\r
311         NSCacheSubData * subData = (NSCacheSubData *) data;\r
312 \r
313         NS_LOG_V(DEBUG, "Data(subData) = [%s]", subData->id);\r
314 \r
315         OCObservationId currID = *id;\r
316 \r
317         if (NSIsSameObId(subData, currID))\r
318         {\r
319             NS_LOG(DEBUG, "SubData is Same");\r
320             return true;\r
321         }\r
322 \r
323         NS_LOG(DEBUG, "Message Data is Not Same");\r
324         return false;\r
325     }\r
326     else if (type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
327     {\r
328         NSCacheTopicData * topicData = (NSCacheTopicData *) data;\r
329 \r
330         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->topicName);\r
331 \r
332         if (strcmp(topicData->topicName, id) == 0)\r
333         {\r
334             NS_LOG(DEBUG, "SubData is Same");\r
335             return true;\r
336         }\r
337 \r
338         NS_LOG(DEBUG, "Message Data is Not Same");\r
339         return false;\r
340     }\r
341     else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)\r
342     {\r
343         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
344 \r
345         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->topicName);\r
346 \r
347         if (strcmp(topicData->topicName, id) == 0)\r
348         {\r
349             NS_LOG(DEBUG, "SubData is Same");\r
350             return true;\r
351         }\r
352 \r
353         NS_LOG(DEBUG, "Message Data is Not Same");\r
354         return false;\r
355     }\r
356     else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
357     {\r
358         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
359 \r
360         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->id);\r
361 \r
362         if (strcmp(topicData->id, id) == 0)\r
363         {\r
364             NS_LOG(DEBUG, "SubData is Same");\r
365             return true;\r
366         }\r
367 \r
368         NS_LOG(DEBUG, "Message Data is Not Same");\r
369         return false;\r
370     }\r
371 \r
372 \r
373     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - OUT");\r
374     return false;\r
375 }\r
376 \r
377 NSResult NSProviderDeleteCacheData(NSCacheType type, void * data)\r
378 {\r
379     if (!data)\r
380     {\r
381         return NS_ERROR;\r
382     }\r
383 \r
384     if (type == NS_PROVIDER_CACHE_SUBSCRIBER || type == NS_PROVIDER_CACHE_SUBSCRIBER_OBSERVE_ID)\r
385     {\r
386         NSCacheSubData * subData = (NSCacheSubData *) data;\r
387 \r
388         (subData->id)[0] = '\0';\r
389         OICFree(subData);\r
390         return NS_OK;\r
391     }\r
392     else if(type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
393     {\r
394 \r
395         NSCacheTopicData * topicData = (NSCacheTopicData *) data;\r
396         NS_LOG_V(DEBUG, "topicData->topicName = %s, topicData->state = %d", topicData->topicName,\r
397                 (int)topicData->state);\r
398 \r
399         OICFree(topicData->topicName);\r
400     }\r
401     else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME ||\r
402             type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
403     {\r
404         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
405         OICFree(topicData->topicName);\r
406     }\r
407 \r
408     return NS_OK;\r
409 }\r
410 \r
411 NSResult NSStorageDelete(NSCacheList * list, const char * delId)\r
412 {\r
413     pthread_mutex_lock(&NSCacheMutex);\r
414     NSCacheElement * prev = list->head;\r
415     NSCacheElement * del = list->head;\r
416 \r
417     NSCacheType type = list->cacheType;\r
418 \r
419     if(!del)\r
420     {\r
421         NS_LOG(DEBUG, "list head is NULL");\r
422         return NS_FAIL;\r
423     }\r
424 \r
425     if (NSProviderCompareIdCacheData(type, del->data, delId))\r
426     {\r
427         if (del == list->head) // first object\r
428         {\r
429             if (del == list->tail) // first object (one object)\r
430             {\r
431                 list->tail = del->next;\r
432             }\r
433 \r
434             list->head = del->next;\r
435             NSProviderDeleteCacheData(type, del->data);\r
436             OICFree(del);\r
437             pthread_mutex_unlock(&NSCacheMutex);\r
438             return NS_OK;\r
439         }\r
440     }\r
441 \r
442     del = del->next;\r
443     while (del)\r
444     {\r
445         if (NSProviderCompareIdCacheData(type, del->data, delId))\r
446         {\r
447             if (del == list->tail) // delete object same to last object\r
448             {\r
449                 list->tail = prev;\r
450             }\r
451 \r
452             prev->next = del->next;\r
453             NSProviderDeleteCacheData(type, del->data);\r
454             OICFree(del);\r
455             pthread_mutex_unlock(&NSCacheMutex);\r
456             return NS_OK;\r
457         }\r
458 \r
459         prev = del;\r
460         del = del->next;\r
461     }\r
462     pthread_mutex_unlock(&NSCacheMutex);\r
463     return NS_FAIL;\r
464 }\r
465 \r
466 NSTopicLL * NSProviderGetTopicsCacheData(NSCacheList * regTopicList)\r
467 {\r
468     NS_LOG(DEBUG, "NSProviderGetTopicsCache - IN");\r
469     pthread_mutex_lock(&NSCacheMutex);\r
470 \r
471     NSCacheElement * iter = regTopicList->head;\r
472 \r
473     if(!iter)\r
474     {\r
475         pthread_mutex_unlock(&NSCacheMutex);\r
476         return NULL;\r
477     }\r
478 \r
479     NSTopicLL * iterTopic = NULL;\r
480     NSTopicLL * newTopic = NULL;\r
481     NSTopicLL * topics = NULL;\r
482 \r
483     while (iter)\r
484     {\r
485         NSCacheTopicData * curr = (NSCacheTopicData *) iter->data;\r
486 \r
487         newTopic = (NSTopicLL *) OICMalloc(sizeof(NSTopicLL));\r
488         newTopic->state = curr->state;\r
489         newTopic->next = NULL;\r
490         newTopic->topicName = OICStrdup(curr->topicName);\r
491 \r
492         if(!topics)\r
493         {\r
494             iterTopic = topics = newTopic;\r
495         }\r
496         else\r
497         {\r
498             iterTopic->next = newTopic;\r
499             iterTopic = newTopic;\r
500         }\r
501 \r
502         iter = iter->next;\r
503     }\r
504 \r
505     pthread_mutex_unlock(&NSCacheMutex);\r
506     NS_LOG(DEBUG, "NSProviderGetTopicsCache - OUT");\r
507 \r
508     return topics;\r
509 }\r
510 \r
511 NSTopicLL * NSProviderGetConsumerTopicsCacheData(NSCacheList * regTopicList,\r
512         NSCacheList * conTopicList, char *consumerId)\r
513 {\r
514     NS_LOG(DEBUG, "NSProviderGetConsumerTopicsCacheData - IN");\r
515 \r
516     pthread_mutex_lock(&NSCacheMutex);\r
517     NSTopicLL * topics = NSProviderGetTopicsCacheData(regTopicList);\r
518 \r
519     if(!topics)\r
520     {\r
521         pthread_mutex_unlock(&NSCacheMutex);\r
522         return NULL;\r
523     }\r
524 \r
525     NSCacheElement * iter = conTopicList->head;\r
526     conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
527 \r
528     while(iter)\r
529     {\r
530         NSCacheTopicSubData * curr = (NSCacheTopicSubData *)iter->data;\r
531 \r
532         NS_LOG_V(DEBUG, "curr->id = %s", curr->id);\r
533         NS_LOG_V(DEBUG, "curr->topicName = %s", curr->topicName);\r
534 \r
535         if(curr && strcmp(curr->id, consumerId) == 0)\r
536         {\r
537             NSTopicLL * topicIter = topics;\r
538             while(topicIter)\r
539             {\r
540                 if(strcmp(topicIter->topicName, curr->topicName) == 0)\r
541                 {\r
542                     topicIter->state = NS_TOPIC_SUBSCRIBED;\r
543                     break;\r
544                 }\r
545                 topicIter = topicIter->next;\r
546             }\r
547         }\r
548 \r
549         iter = iter->next;\r
550     }\r
551 \r
552     conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
553     pthread_mutex_unlock(&NSCacheMutex);\r
554     NS_LOG(DEBUG, "NSProviderGetConsumerTopics - OUT");\r
555 \r
556     return topics;\r
557 }\r
558 \r
559 size_t NSProviderGetListSize(NSCacheElement * firstElement)\r
560 {\r
561     pthread_mutex_lock(&NSCacheMutex);\r
562     if(!firstElement)\r
563     {\r
564         pthread_mutex_unlock(&NSCacheMutex);\r
565         return 0;\r
566     }\r
567 \r
568     int cnt = 0;\r
569 \r
570     NSCacheElement * iter = firstElement;\r
571 \r
572     while(iter)\r
573     {\r
574         cnt++;\r
575         iter = iter->next;\r
576     }\r
577 \r
578     pthread_mutex_unlock(&NSCacheMutex);\r
579     return cnt;\r
580 }\r
581 \r
582 bool NSProviderIsTopicSubScribed(NSCacheElement * conTopicList, char * cId, char * topicName)\r
583 {\r
584     pthread_mutex_lock(&NSCacheMutex);\r
585 \r
586     if(!conTopicList || !cId || !topicName)\r
587     {\r
588         pthread_mutex_unlock(&NSCacheMutex);\r
589         return false;\r
590     }\r
591 \r
592     NSCacheElement * iter = conTopicList;\r
593     while(iter)\r
594     {\r
595         NSCacheTopicSubData * curr = (NSCacheTopicSubData *) iter->data;\r
596 \r
597         if( (strcmp(curr->id, cId) == 0) && (strcmp(curr->topicName, topicName) == 0) )\r
598         {\r
599             pthread_mutex_unlock(&NSCacheMutex);\r
600             return true;\r
601         }\r
602         iter = iter->next;\r
603     }\r
604 \r
605     pthread_mutex_unlock(&NSCacheMutex);\r
606     return false;\r
607 }\r
608 \r
609 NSResult NSProviderDeleteConsumerTopic(NSCacheList * conTopicList,\r
610         NSCacheTopicSubData * topicSubData)\r
611 {\r
612     pthread_mutex_lock(&NSCacheMutex);\r
613 \r
614     char * cId = topicSubData->id;\r
615     char * topicName = topicSubData->topicName;\r
616 \r
617     if(!conTopicList || !cId || !topicName)\r
618     {\r
619         return NS_ERROR;\r
620         pthread_mutex_unlock(&NSCacheMutex);\r
621     }\r
622 \r
623     NSCacheElement * prev = conTopicList->head;\r
624     NSCacheElement * del = conTopicList->head;\r
625 \r
626     NSCacheType type = conTopicList->cacheType;\r
627 \r
628     if(!del)\r
629     {\r
630         NS_LOG(DEBUG, "list head is NULL");\r
631         return NS_FAIL;\r
632     }\r
633 \r
634     NSCacheTopicSubData * curr = (NSCacheTopicSubData *) del->data;\r
635     NS_LOG_V(DEBUG, "compareid = %s", cId);\r
636     NS_LOG_V(DEBUG, "comparetopicName = %s", topicName);\r
637     NS_LOG_V(DEBUG, "curr->id = %s", curr->id);\r
638     NS_LOG_V(DEBUG, "curr->topicName = %s", curr->topicName);\r
639 \r
640     if( (strncmp(curr->id, cId, NS_UUID_STRING_SIZE) == 0) && (strcmp(curr->topicName, topicName) == 0) )\r
641     {\r
642         if (del == conTopicList->head) // first object\r
643         {\r
644             if (del == conTopicList->tail) // first object (one object)\r
645             {\r
646                 conTopicList->tail = del->next;\r
647             }\r
648 \r
649             conTopicList->head = del->next;\r
650             NSProviderDeleteCacheData(type, del->data);\r
651             OICFree(del);\r
652             pthread_mutex_unlock(&NSCacheMutex);\r
653             return NS_OK;\r
654         }\r
655     }\r
656 \r
657     curr = NULL;\r
658     del = del->next;\r
659     while (del)\r
660     {\r
661         curr = (NSCacheTopicSubData *) del->data;\r
662         if( (strncmp(curr->id, cId, NS_UUID_STRING_SIZE) == 0) && (strcmp(curr->topicName, topicName) == 0) )\r
663         {\r
664             if (del == conTopicList->tail) // delete object same to last object\r
665             {\r
666                 conTopicList->tail = prev;\r
667             }\r
668 \r
669             prev->next = del->next;\r
670             NSProviderDeleteCacheData(type, del->data);\r
671             OICFree(del);\r
672             pthread_mutex_unlock(&NSCacheMutex);\r
673             return NS_OK;\r
674         }\r
675 \r
676         prev = del;\r
677         del = del->next;\r
678     }\r
679     pthread_mutex_unlock(&NSCacheMutex);\r
680     return NS_FAIL;\r
681 }\r