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