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