Merge branch 'cloud-interface'
[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 bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id)\r
272 {\r
273     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - IN");\r
274 \r
275     if (data == NULL)\r
276     {\r
277         return false;\r
278     }\r
279 \r
280     NS_LOG_V(DEBUG, "Data(compData) = [%s]", id);\r
281 \r
282     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
283     {\r
284         NSCacheSubData * subData = (NSCacheSubData *) data;\r
285 \r
286         NS_LOG_V(DEBUG, "Data(subData) = [%s]", subData->id);\r
287 \r
288         if (strcmp(subData->id, id) == 0)\r
289         {\r
290             NS_LOG(DEBUG, "SubData is Same");\r
291             return true;\r
292         }\r
293 \r
294         NS_LOG(DEBUG, "Message Data is Not Same");\r
295         return false;\r
296     }\r
297     else if (type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
298     {\r
299         NSCacheTopicData * topicData = (NSCacheTopicData *) data;\r
300 \r
301         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->topicName);\r
302 \r
303         if (strcmp(topicData->topicName, id) == 0)\r
304         {\r
305             NS_LOG(DEBUG, "SubData is Same");\r
306             return true;\r
307         }\r
308 \r
309         NS_LOG(DEBUG, "Message Data is Not Same");\r
310         return false;\r
311     }\r
312     else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)\r
313     {\r
314         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
315 \r
316         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->topicName);\r
317 \r
318         if (strcmp(topicData->topicName, id) == 0)\r
319         {\r
320             NS_LOG(DEBUG, "SubData is Same");\r
321             return true;\r
322         }\r
323 \r
324         NS_LOG(DEBUG, "Message Data is Not Same");\r
325         return false;\r
326     }\r
327     else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
328     {\r
329         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
330 \r
331         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->id);\r
332 \r
333         if (strcmp(topicData->id, id) == 0)\r
334         {\r
335             NS_LOG(DEBUG, "SubData is Same");\r
336             return true;\r
337         }\r
338 \r
339         NS_LOG(DEBUG, "Message Data is Not Same");\r
340         return false;\r
341     }\r
342 \r
343 \r
344     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - OUT");\r
345     return false;\r
346 }\r
347 \r
348 NSResult NSProviderDeleteCacheData(NSCacheType type, void * data)\r
349 {\r
350     if (!data)\r
351     {\r
352         return NS_ERROR;\r
353     }\r
354 \r
355     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
356     {\r
357         NSCacheSubData * subData = (NSCacheSubData *) data;\r
358 \r
359         (subData->id)[0] = '\0';\r
360         OICFree(subData);\r
361         return NS_OK;\r
362     }\r
363     else if(type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
364     {\r
365 \r
366         NSCacheTopicData * topicData = (NSCacheTopicData *) data;\r
367         NS_LOG_V(DEBUG, "topicData->topicName = %s, topicData->state = %d", topicData->topicName,\r
368                 (int)topicData->state);\r
369 \r
370         OICFree(topicData->topicName);\r
371     }\r
372     else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME ||\r
373             type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
374     {\r
375         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
376         OICFree(topicData->topicName);\r
377     }\r
378 \r
379     return NS_OK;\r
380 }\r
381 \r
382 bool NSIsSameObId(NSCacheSubData * data, OCObservationId id)\r
383 {\r
384     if (id == data->messageObId || id == data->syncObId || id == data->remote_messageObId ||\r
385                 id == data->remote_syncObId)\r
386     {\r
387         return true;\r
388     }\r
389 \r
390     return false;\r
391 }\r
392 \r
393 NSResult NSProviderDeleteSubDataFromObId(NSCacheList * list, OCObservationId id)\r
394 {\r
395     if(!list || !list->head)\r
396     {\r
397         NS_LOG(INFO, "list is NULL");\r
398         return NS_FAIL;\r
399     }\r
400 \r
401     pthread_mutex_lock(&NSCacheMutex);\r
402     NSCacheElement * prev = list->head;\r
403     NSCacheElement * del = list->head;\r
404 \r
405     NSCacheType type = list->cacheType;\r
406 \r
407     bool isDelete = true;\r
408 \r
409     while(isDelete)\r
410     {\r
411         NSCacheSubData * curr = (NSCacheSubData *)del->data;\r
412 \r
413         isDelete = false;\r
414 \r
415         if (NSIsSameObId(curr, id))\r
416         {\r
417             if (del == list->head) // first object\r
418             {\r
419                 if (del == list->tail) // first object (one object)\r
420                 {\r
421                     list->tail = del->next;\r
422                 }\r
423 \r
424                 list->head = del->next;\r
425 \r
426                 NSProviderDeleteCacheData(type, del->data);\r
427                 OICFree(del);\r
428                 isDelete = true;\r
429             }\r
430         }\r
431         else\r
432         {\r
433             del = del->next;\r
434             while (del)\r
435             {\r
436                 if (NSIsSameObId(curr, id))\r
437                 {\r
438                     if (del == list->tail) // delete object same to last object\r
439                     {\r
440                         list->tail = prev;\r
441                     }\r
442 \r
443                     prev->next = del->next;\r
444                     NSProviderDeleteCacheData(type, del->data);\r
445                     OICFree(del);\r
446                     isDelete = true;\r
447                     break;\r
448                 }\r
449 \r
450                 prev = del;\r
451                 del = del->next;\r
452             }\r
453         }\r
454     }\r
455     pthread_mutex_unlock(&NSCacheMutex);\r
456     return NS_OK;\r
457 }\r
458 \r
459 NSResult NSStorageDelete(NSCacheList * list, const char * delId)\r
460 {\r
461     pthread_mutex_lock(&NSCacheMutex);\r
462     NSCacheElement * prev = list->head;\r
463     NSCacheElement * del = list->head;\r
464 \r
465     NSCacheType type = list->cacheType;\r
466 \r
467     if(!del)\r
468     {\r
469         NS_LOG(DEBUG, "list head is NULL");\r
470         return NS_FAIL;\r
471     }\r
472 \r
473     if (NSProviderCompareIdCacheData(type, del->data, delId))\r
474     {\r
475         if (del == list->head) // first object\r
476         {\r
477             if (del == list->tail) // first object (one object)\r
478             {\r
479                 list->tail = del->next;\r
480             }\r
481 \r
482             list->head = del->next;\r
483             NSProviderDeleteCacheData(type, del->data);\r
484             OICFree(del);\r
485             pthread_mutex_unlock(&NSCacheMutex);\r
486             return NS_OK;\r
487         }\r
488     }\r
489 \r
490     del = del->next;\r
491     while (del)\r
492     {\r
493         if (NSProviderCompareIdCacheData(type, del->data, delId))\r
494         {\r
495             if (del == list->tail) // delete object same to last object\r
496             {\r
497                 list->tail = prev;\r
498             }\r
499 \r
500             prev->next = del->next;\r
501             NSProviderDeleteCacheData(type, del->data);\r
502             OICFree(del);\r
503             pthread_mutex_unlock(&NSCacheMutex);\r
504             return NS_OK;\r
505         }\r
506 \r
507         prev = del;\r
508         del = del->next;\r
509     }\r
510     pthread_mutex_unlock(&NSCacheMutex);\r
511     return NS_FAIL;\r
512 }\r
513 \r
514 NSTopicLL * NSProviderGetTopicsCacheData(NSCacheList * regTopicList)\r
515 {\r
516     NS_LOG(DEBUG, "NSProviderGetTopicsCache - IN");\r
517     pthread_mutex_lock(&NSCacheMutex);\r
518 \r
519     NSCacheElement * iter = regTopicList->head;\r
520 \r
521     if(!iter)\r
522     {\r
523         pthread_mutex_unlock(&NSCacheMutex);\r
524         return NULL;\r
525     }\r
526 \r
527     NSTopicLL * iterTopic = NULL;\r
528     NSTopicLL * newTopic = NULL;\r
529     NSTopicLL * topics = NULL;\r
530 \r
531     while (iter)\r
532     {\r
533         NSCacheTopicData * curr = (NSCacheTopicData *) iter->data;\r
534 \r
535         newTopic = (NSTopicLL *) OICMalloc(sizeof(NSTopicLL));\r
536         newTopic->state = curr->state;\r
537         newTopic->next = NULL;\r
538         newTopic->topicName = OICStrdup(curr->topicName);\r
539 \r
540         if(!topics)\r
541         {\r
542             iterTopic = topics = newTopic;\r
543         }\r
544         else\r
545         {\r
546             iterTopic->next = newTopic;\r
547             iterTopic = newTopic;\r
548         }\r
549 \r
550         iter = iter->next;\r
551     }\r
552 \r
553     pthread_mutex_unlock(&NSCacheMutex);\r
554     NS_LOG(DEBUG, "NSProviderGetTopicsCache - OUT");\r
555 \r
556     return topics;\r
557 }\r
558 \r
559 NSTopicLL * NSProviderGetConsumerTopicsCacheData(NSCacheList * regTopicList,\r
560         NSCacheList * conTopicList, char *consumerId)\r
561 {\r
562     NS_LOG(DEBUG, "NSProviderGetConsumerTopicsCacheData - IN");\r
563 \r
564     pthread_mutex_lock(&NSCacheMutex);\r
565     NSTopicLL * topics = NSProviderGetTopicsCacheData(regTopicList);\r
566 \r
567     if(!topics)\r
568     {\r
569         pthread_mutex_unlock(&NSCacheMutex);\r
570         return NULL;\r
571     }\r
572 \r
573     NSCacheElement * iter = conTopicList->head;\r
574     conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
575 \r
576     while(iter)\r
577     {\r
578         NSCacheTopicSubData * curr = (NSCacheTopicSubData *)iter->data;\r
579 \r
580         NS_LOG_V(DEBUG, "curr->id = %s", curr->id);\r
581         NS_LOG_V(DEBUG, "curr->topicName = %s", curr->topicName);\r
582 \r
583         if(curr && strcmp(curr->id, consumerId) == 0)\r
584         {\r
585             NSTopicLL * topicIter = topics;\r
586             while(topicIter)\r
587             {\r
588                 if(strcmp(topicIter->topicName, curr->topicName) == 0)\r
589                 {\r
590                     topicIter->state = NS_TOPIC_SUBSCRIBED;\r
591                     break;\r
592                 }\r
593                 topicIter = topicIter->next;\r
594             }\r
595         }\r
596 \r
597         iter = iter->next;\r
598     }\r
599 \r
600     conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
601     pthread_mutex_unlock(&NSCacheMutex);\r
602     NS_LOG(DEBUG, "NSProviderGetConsumerTopics - OUT");\r
603 \r
604     return topics;\r
605 }\r
606 \r
607 size_t NSProviderGetListSize(NSCacheElement * firstElement)\r
608 {\r
609     pthread_mutex_lock(&NSCacheMutex);\r
610     if(!firstElement)\r
611     {\r
612         pthread_mutex_unlock(&NSCacheMutex);\r
613         return 0;\r
614     }\r
615 \r
616     int cnt = 0;\r
617 \r
618     NSCacheElement * iter = firstElement;\r
619 \r
620     while(iter)\r
621     {\r
622         cnt++;\r
623         iter = iter->next;\r
624     }\r
625 \r
626     pthread_mutex_unlock(&NSCacheMutex);\r
627     return cnt;\r
628 }\r
629 \r
630 bool NSProviderIsTopicSubScribed(NSCacheElement * conTopicList, char * cId, char * topicName)\r
631 {\r
632     pthread_mutex_lock(&NSCacheMutex);\r
633 \r
634     if(!conTopicList || !cId || !topicName)\r
635     {\r
636         pthread_mutex_unlock(&NSCacheMutex);\r
637         return false;\r
638     }\r
639 \r
640     NSCacheElement * iter = conTopicList;\r
641     while(iter)\r
642     {\r
643         NSCacheTopicSubData * curr = (NSCacheTopicSubData *) iter->data;\r
644 \r
645         if( (strcmp(curr->id, cId) == 0) && (strcmp(curr->topicName, topicName) == 0) )\r
646         {\r
647             pthread_mutex_unlock(&NSCacheMutex);\r
648             return true;\r
649         }\r
650         iter = iter->next;\r
651     }\r
652 \r
653     pthread_mutex_unlock(&NSCacheMutex);\r
654     return false;\r
655 }\r
656 \r
657 NSResult NSProviderDeleteConsumerTopic(NSCacheList * conTopicList,\r
658         NSCacheTopicSubData * topicSubData)\r
659 {\r
660     pthread_mutex_lock(&NSCacheMutex);\r
661 \r
662     char * cId = topicSubData->id;\r
663     char * topicName = topicSubData->topicName;\r
664 \r
665     if(!conTopicList || !cId || !topicName)\r
666     {\r
667         return NS_ERROR;\r
668         pthread_mutex_unlock(&NSCacheMutex);\r
669     }\r
670 \r
671     NSCacheElement * prev = conTopicList->head;\r
672     NSCacheElement * del = conTopicList->head;\r
673 \r
674     NSCacheType type = conTopicList->cacheType;\r
675 \r
676     if(!del)\r
677     {\r
678         NS_LOG(DEBUG, "list head is NULL");\r
679         return NS_FAIL;\r
680     }\r
681 \r
682     NSCacheTopicSubData * curr = (NSCacheTopicSubData *) del->data;\r
683     NS_LOG_V(DEBUG, "compareid = %s", cId);\r
684     NS_LOG_V(DEBUG, "comparetopicName = %s", topicName);\r
685     NS_LOG_V(DEBUG, "curr->id = %s", curr->id);\r
686     NS_LOG_V(DEBUG, "curr->topicName = %s", curr->topicName);\r
687 \r
688     if( (strncmp(curr->id, cId, NS_UUID_STRING_SIZE) == 0) && (strcmp(curr->topicName, topicName) == 0) )\r
689     {\r
690         if (del == conTopicList->head) // first object\r
691         {\r
692             if (del == conTopicList->tail) // first object (one object)\r
693             {\r
694                 conTopicList->tail = del->next;\r
695             }\r
696 \r
697             conTopicList->head = del->next;\r
698             NSProviderDeleteCacheData(type, del->data);\r
699             OICFree(del);\r
700             pthread_mutex_unlock(&NSCacheMutex);\r
701             return NS_OK;\r
702         }\r
703     }\r
704 \r
705     curr = NULL;\r
706     del = del->next;\r
707     while (del)\r
708     {\r
709         curr = (NSCacheTopicSubData *) del->data;\r
710         if( (strncmp(curr->id, cId, NS_UUID_STRING_SIZE) == 0) && (strcmp(curr->topicName, topicName) == 0) )\r
711         {\r
712             if (del == conTopicList->tail) // delete object same to last object\r
713             {\r
714                 conTopicList->tail = prev;\r
715             }\r
716 \r
717             prev->next = del->next;\r
718             NSProviderDeleteCacheData(type, del->data);\r
719             OICFree(del);\r
720             pthread_mutex_unlock(&NSCacheMutex);\r
721             return NS_OK;\r
722         }\r
723 \r
724         prev = del;\r
725         del = del->next;\r
726     }\r
727     pthread_mutex_unlock(&NSCacheMutex);\r
728     return NS_FAIL;\r
729 }\r