Merge remote-tracking branch 'origin/master' into notification-service
[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 \r
197     if (list->head == NULL)\r
198     {\r
199         NS_LOG(DEBUG, "list->head is NULL, Insert First Data");\r
200         list->head = list->tail = newObj;\r
201         pthread_mutex_unlock(&NSCacheMutex);\r
202         return NS_OK;\r
203     }\r
204 \r
205     list->tail = list->tail->next = newObj;\r
206     NS_LOG(DEBUG, "list->head is not NULL");\r
207     pthread_mutex_unlock(&NSCacheMutex);\r
208     return NS_OK;\r
209 }\r
210 \r
211 NSResult NSStorageDestroy(NSCacheList * list)\r
212 {\r
213     NSCacheElement * iter = list->head;\r
214     NSCacheElement * next = NULL;\r
215 \r
216     NSCacheType type = list->cacheType;\r
217 \r
218     while (iter)\r
219     {\r
220         next = (NSCacheElement *) iter->next;\r
221 \r
222         NSProviderDeleteCacheData(type, iter->data);\r
223         OICFree(iter);\r
224 \r
225         iter = next;\r
226     }\r
227 \r
228     OICFree(list);\r
229 \r
230     return NS_OK;\r
231 }\r
232 \r
233 bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id)\r
234 {\r
235     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - IN");\r
236 \r
237     if (data == NULL)\r
238     {\r
239         return false;\r
240     }\r
241 \r
242     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
243     {\r
244         NSCacheSubData * subData = (NSCacheSubData *) data;\r
245 \r
246         NS_LOG_V(DEBUG, "Data(subData) = [%s]", subData->id);\r
247         NS_LOG_V(DEBUG, "Data(compData) = [%s]", id);\r
248 \r
249         if (strcmp(subData->id, id) == 0)\r
250         {\r
251             NS_LOG(DEBUG, "SubData is Same");\r
252             return true;\r
253         }\r
254 \r
255         NS_LOG(DEBUG, "Message Data is Not Same");\r
256         return false;\r
257 \r
258     }\r
259 \r
260     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - OUT");\r
261 \r
262     return false;\r
263 }\r
264 \r
265 NSResult NSProviderDeleteCacheData(NSCacheType type, void * data)\r
266 {\r
267     if (data == NULL)\r
268     {\r
269         return NS_OK;\r
270     }\r
271 \r
272     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
273     {\r
274         NSCacheSubData * subData = (NSCacheSubData *) data;\r
275 \r
276         (subData->id)[0] = '\0';\r
277         OICFree(subData);\r
278 \r
279         return NS_OK;\r
280     }\r
281 \r
282     return NS_OK;\r
283 }\r
284 \r
285 bool NSIsSameObId(NSCacheSubData * data, OCObservationId id)\r
286 {\r
287     if (id == data->messageObId || id == data->syncObId || id == data->remote_messageObId ||\r
288                 id == data->remote_syncObId)\r
289     {\r
290         return true;\r
291     }\r
292 \r
293     return false;\r
294 }\r
295 \r
296 NSResult NSProviderDeleteSubDataFromObId(NSCacheList * list, OCObservationId id)\r
297 {\r
298     if(!list || !list->head)\r
299     {\r
300         NS_LOG(INFO, "list is NULL");\r
301         return NS_FAIL;\r
302     }\r
303 \r
304     pthread_mutex_lock(&NSCacheMutex);\r
305     NSCacheElement * prev = list->head;\r
306     NSCacheElement * del = list->head;\r
307 \r
308     NSCacheType type = list->cacheType;\r
309 \r
310     bool isDelete = true;\r
311 \r
312     while(isDelete)\r
313     {\r
314         NSCacheSubData * curr = (NSCacheSubData *)del->data;\r
315 \r
316         isDelete = false;\r
317 \r
318         if (NSIsSameObId(curr, id))\r
319         {\r
320             if (del == list->head) // first object\r
321             {\r
322                 if (del == list->tail) // first object (one object)\r
323                 {\r
324                     list->tail = del->next;\r
325                 }\r
326 \r
327                 list->head = del->next;\r
328 \r
329                 NSProviderDeleteCacheData(type, del->data);\r
330                 OICFree(del);\r
331                 isDelete = true;\r
332             }\r
333         }\r
334         else\r
335         {\r
336             del = del->next;\r
337             while (del)\r
338             {\r
339                 if (NSIsSameObId(curr, id))\r
340                 {\r
341                     if (del == list->tail) // delete object same to last object\r
342                     {\r
343                         list->tail = prev;\r
344                     }\r
345 \r
346                     prev->next = del->next;\r
347                     NSProviderDeleteCacheData(type, del->data);\r
348                     OICFree(del);\r
349                     isDelete = true;\r
350                     break;\r
351                 }\r
352 \r
353                 prev = del;\r
354                 del = del->next;\r
355             }\r
356         }\r
357     }\r
358     pthread_mutex_unlock(&NSCacheMutex);\r
359     return NS_OK;\r
360 }\r