Fixed bug for duplicated request to subscribe and invalid storage logic.
[platform/upstream/iotivity.git] / service / notification / src / consumer / NSConsumerInternalTaskController.c
1 //******************************************************************
2 //
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 #include "NSConstants.h"
22 #include "NSConsumerCommon.h"
23 #include "NSConsumerInternalTaskController.h"
24 #include "NSStructs.h"
25
26 #include "oic_malloc.h"
27 #include "oic_string.h"
28
29 NSCacheList ** NSGetMessageCacheList()
30 {
31     static NSCacheList * messageCache = NULL;
32     return & messageCache;
33 }
34
35 void NSSetMessageCacheList(NSCacheList * cache)
36 {
37     *(NSGetMessageCacheList()) = cache;
38 }
39
40 NSCacheList ** NSGetProviderCacheList()
41 {
42     static NSCacheList * providerCache = NULL;
43     return & providerCache;
44 }
45
46 void NSSetProviderCacheList(NSCacheList * cache)
47 {
48     *(NSGetProviderCacheList()) = cache;
49 }
50
51 void NSDestroyMessageCacheList()
52 {
53     NSCacheList * cache = *(NSGetMessageCacheList());
54     if (cache)
55     {
56         NSStorageDestroy(cache);
57     }
58
59     NSSetMessageCacheList(NULL);
60 }
61
62 void NSDestroyProviderCacheList()
63 {
64     NSCacheList * cache = *(NSGetProviderCacheList());
65     if (cache)
66     {
67         NSStorageDestroy(cache);
68     }
69
70     NSSetProviderCacheList(NULL);
71 }
72
73 NSMessage_consumer * NSMessageCacheFind(const char * messageId)
74 {
75     NS_VERIFY_NOT_NULL(messageId, NULL);
76
77     NSCacheList * MessageCache = *(NSGetMessageCacheList());
78     if (!MessageCache)
79     {
80         NS_LOG(DEBUG, "Message Cache Init");
81         MessageCache = NSStorageCreate();
82         NS_VERIFY_NOT_NULL(MessageCache, NULL);
83
84         MessageCache->cacheType = NS_CONSUMER_CACHE_MESSAGE;
85         NSSetMessageCacheList(MessageCache);
86     }
87
88     NSCacheElement * cacheElement = NSStorageRead(MessageCache, messageId);
89     NS_VERIFY_NOT_NULL(cacheElement, NULL);
90
91     return NSCopyMessage((NSMessage_consumer *) cacheElement->data);
92 }
93
94 NSProvider_internal * NSProviderCacheFind(const char * providerId)
95 {
96     NS_VERIFY_NOT_NULL(providerId, NULL);
97
98     NSCacheList * ProviderCache = *(NSGetProviderCacheList());
99     if (!ProviderCache)
100     {
101         NS_LOG(DEBUG, "Provider Cache Init");
102         ProviderCache = NSStorageCreate();
103         NS_VERIFY_NOT_NULL(ProviderCache, NULL);
104
105         ProviderCache->cacheType = NS_CONSUMER_CACHE_PROVIDER;
106         NSSetProviderCacheList(ProviderCache);
107     }
108
109     NSCacheElement * cacheElement = NSStorageRead(ProviderCache, providerId);
110     NS_VERIFY_NOT_NULL(cacheElement, NULL);
111
112     return NSCopyProvider((NSProvider_internal *) cacheElement->data);
113 }
114
115
116 NSResult NSMessageCacheUpdate(NSMessage_consumer * msg, NSSyncType type)
117 {
118     NSCacheList * MessageCache = *(NSGetMessageCacheList());
119     if (!MessageCache)
120     {
121         NS_LOG(DEBUG, "Message Cache Init");
122         MessageCache = NSStorageCreate();
123         NS_VERIFY_NOT_NULL(MessageCache, NS_ERROR);
124
125         MessageCache->cacheType = NS_CONSUMER_CACHE_MESSAGE;
126         NSSetMessageCacheList(MessageCache);
127     }
128
129     NS_VERIFY_NOT_NULL(msg, NS_ERROR);
130
131     msg->type = type;
132
133     NSCacheElement * obj = (NSCacheElement *)OICMalloc(sizeof(NSCacheElement));
134     NS_VERIFY_NOT_NULL(obj, NS_ERROR);
135
136     obj->data = (NSCacheData *) msg;
137     obj->next = NULL;
138
139     NS_LOG(DEBUG, "try to write to storage");
140     NSResult ret = NSStorageWrite(MessageCache, obj);
141     NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(ret == NS_OK ? (void *) 1 : NULL,
142             NS_ERROR, NSOICFree(obj));
143
144     return NS_OK;
145 }
146
147 NSResult NSProviderCacheUpdate(NSProvider_internal * provider)
148 {
149     NSCacheList * ProviderCache = *(NSGetProviderCacheList());
150     if (!ProviderCache)
151     {
152         NS_LOG(DEBUG, "Provider Cache Init");
153         ProviderCache = NSStorageCreate();
154         NS_VERIFY_NOT_NULL(ProviderCache, NS_ERROR);
155
156         ProviderCache->cacheType = NS_CONSUMER_CACHE_PROVIDER;
157         NSSetProviderCacheList(ProviderCache);
158     }
159
160     NS_VERIFY_NOT_NULL(provider, NS_ERROR);
161
162     NSCacheElement * obj = (NSCacheElement *)OICMalloc(sizeof(NSCacheElement));
163     NS_VERIFY_NOT_NULL(obj, NS_ERROR);
164
165     obj->data = (NSCacheData *) provider;
166     obj->next = NULL;
167
168     NS_LOG(DEBUG, "try to write to storage");
169     NSResult ret = NSStorageWrite(ProviderCache, obj);
170     NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(ret == NS_OK ? (void *) 1 : NULL,
171             NS_ERROR, NSOICFree(obj));
172
173     return NS_OK;
174 }
175
176 void NSConsumerHandleProviderDiscovered(NSProvider_internal * provider)
177 {
178     NS_VERIFY_NOT_NULL_V(provider);
179
180     bool isAdded = true;
181     bool isSubscribing = false;
182     NSProvider_internal * providerCacheData = NSProviderCacheFind(provider->providerId);
183
184     if (providerCacheData == NULL)
185     {
186         isAdded = false;
187     }
188     else
189     {
190         providerCacheData->accessPolicy = provider->accessPolicy;
191         NSProviderConnectionInfo * infos = providerCacheData->connection;
192         OCTransportAdapter newAdapter = provider->connection->addr->adapter;
193         while (infos)
194         {
195             isSubscribing |= infos->isSubscribing;
196             if (infos->addr->adapter == newAdapter && infos->isSubscribing == true)
197             {
198                 NS_LOG_V(DEBUG, "This provider already discovered : %s:%d",
199                          infos->addr->addr, infos->addr->port);
200                 NS_LOG_V(DEBUG, "Subscription : %d", infos->isSubscribing);
201                 return;
202             }
203             infos = infos->next;
204         }
205     }
206
207     NSResult ret = NSProviderCacheUpdate(provider);
208     NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *) 1 : NULL);
209
210     if (isAdded == false)
211     {
212         NS_LOG(DEBUG, "New provider is discovered");
213     }
214     else
215     {
216         provider = providerCacheData;
217         NS_LOG(DEBUG, "provider's connection is updated.");
218     }
219
220     if (provider->accessPolicy == NS_ACCESS_DENY && isSubscribing == false)
221     {
222         NS_LOG(DEBUG, "accepter is NS_ACCEPTER_CONSUMER, Callback to user");
223         NSDiscoveredProvider((NSProvider *) provider);
224     }
225     else
226     {
227         NS_LOG(DEBUG, "accepter is NS_ACCEPTER_PROVIDER, request subscribe");
228         NSProvider_internal * subProvider = NSCopyProvider(provider);
229         NSTask * task = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE, (void *) subProvider);
230         NS_VERIFY_NOT_NULL_V(task);
231
232         NSConsumerPushEvent(task);
233     }
234
235     NSRemoveProvider(providerCacheData);
236 }
237
238 void NSConsumerHandleProviderDeleted(NSProvider_internal * provider)
239 {
240     // TODO delete provider infomation on storage list.
241     (void) provider;
242 }
243
244 void NSConsumerHandleRecvSubscriptionConfirmed(NSMessage_consumer * msg)
245 {
246     NS_VERIFY_NOT_NULL_V(msg);
247
248     NS_LOG_V(DEBUG, "confirmed by : %s", msg->providerId);
249     NSProvider_internal * provider = NSProviderCacheFind(msg->providerId);
250     NS_VERIFY_NOT_NULL_V(provider);
251
252     if (provider->connection->next == NULL)
253     {
254         NSSubscriptionAccepted((NSProvider *) provider);
255     }
256 }
257
258 void NSConsumerHandleRecvMessage(NSMessage_consumer * msg)
259 {
260     NS_VERIFY_NOT_NULL_V(msg);
261
262     NSResult ret = NSMessageCacheUpdate(msg, NS_SYNC_UNREAD);
263     NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *) 1 : NULL);
264
265     NSMessagePost((NSMessage *) msg);
266 }
267
268 void NSConsumerHandleRecvSyncInfo(NSSyncInfo * sync)
269 {
270     NS_VERIFY_NOT_NULL_V(sync);
271
272     char msgId[NS_DEVICE_ID_LENGTH] = { 0, };
273     snprintf(msgId, NS_DEVICE_ID_LENGTH, "%lld", sync->messageId);
274
275     NSMessage_consumer * msg = NSMessageCacheFind(msgId);
276     NS_VERIFY_NOT_NULL_V(msg);
277
278     NSResult ret = NSMessageCacheUpdate(msg, sync->state);
279     NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *) 1 : NULL);
280     NSRemoveMessage(msg);
281
282     NSNotificationSync(sync);
283 }
284
285 void NSConsumerHandleMakeSyncInfo(NSSyncInfo * sync)
286 {
287     NS_VERIFY_NOT_NULL_V(sync);
288
289     NSProvider_internal * provider = NSProviderCacheFind(sync->providerId);
290     NS_VERIFY_NOT_NULL_V (provider);
291
292     NSProviderConnectionInfo * connections = NSCopyProviderConnections(provider->connection);
293     NS_VERIFY_NOT_NULL_V (connections);
294
295     NSSyncInfo_internal * syncInfo = (NSSyncInfo_internal *)OICMalloc(sizeof(NSSyncInfo_internal));
296     NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(syncInfo, NSRemoveConnections(connections));
297
298     OICStrcpy(syncInfo->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, sync->providerId);
299     syncInfo->messageId = sync->messageId;
300     syncInfo->state = sync->state;
301     syncInfo->connection = connections;
302
303     NSTask * syncTask = NSMakeTask(TASK_SEND_SYNCINFO, (void *) syncInfo);
304     NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(syncTask, NSOICFree(syncInfo));
305
306     NSConsumerPushEvent(syncTask);
307 }
308
309 void NSConsumerInternalTaskProcessing(NSTask * task)
310 {
311     NS_VERIFY_NOT_NULL_V(task);
312
313     NS_LOG_V(DEBUG, "Receive Event : %d", (int)task->taskType);
314     switch (task->taskType)
315     {
316         case TASK_CONSUMER_RECV_SUBSCRIBE_CONFIRMED:
317         {
318             NS_LOG(DEBUG, "Receive Subscribe confirm from provider.");
319             NSConsumerHandleRecvSubscriptionConfirmed((NSMessage_consumer *)task->taskData);
320             NSRemoveMessage((NSMessage_consumer *)task->taskData);
321             break;
322         }
323         case TASK_CONSUMER_RECV_MESSAGE:
324         {
325             NS_LOG(DEBUG, "Receive New Notification");
326             NSConsumerHandleRecvMessage((NSMessage_consumer *)task->taskData);
327             NSRemoveMessage((NSMessage_consumer *)task->taskData);
328             break;
329         }
330         case TASK_CONSUMER_PROVIDER_DISCOVERED:
331         {
332             NS_LOG(DEBUG, "Receive New Provider is discovered.");
333             NSConsumerHandleProviderDiscovered((NSProvider_internal *)task->taskData);
334             NSRemoveProvider((NSProvider_internal *)task->taskData);
335             break;
336         }
337         case TASK_RECV_SYNCINFO:
338         {
339             NS_LOG(DEBUG, "Receive SyncInfo.");
340             NSConsumerHandleRecvSyncInfo((NSSyncInfo *)task->taskData);
341             NSOICFree(task->taskData);
342             break;
343         }
344         case TASK_MAKE_SYNCINFO:
345         {
346             NS_LOG(DEBUG, "Make SyncInfo, get Provider's Addr");
347             NSConsumerHandleMakeSyncInfo((NSSyncInfo *)task->taskData);
348             NSOICFree(task->taskData);
349             break;
350         }
351         case TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL:
352         {
353             NSConsumerHandleProviderDeleted((NSProvider_internal *)task->taskData);
354             NSRemoveProvider((NSProvider_internal *)task->taskData);
355             break;
356         }
357         default :
358         {
359             NS_LOG(ERROR, "Unknown TASK Type");
360             return ;
361         }
362     }
363     NSOICFree(task);
364 }