1 //******************************************************************
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
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
11 // http://www.apache.org/licenses/LICENSE-2.0
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.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 #include "NSConstants.h"
22 #include "NSConsumerCommon.h"
23 #include "NSConsumerInternalTaskController.h"
24 #include "NSStructs.h"
26 #include "oic_malloc.h"
27 #include "oic_string.h"
29 NSCacheList ** NSGetMessageCacheList()
31 static NSCacheList * messageCache = NULL;
32 return & messageCache;
35 void NSSetMessageCacheList(NSCacheList * cache)
37 *(NSGetMessageCacheList()) = cache;
40 NSCacheList ** NSGetProviderCacheList()
42 static NSCacheList * providerCache = NULL;
43 return & providerCache;
46 void NSSetProviderCacheList(NSCacheList * cache)
48 *(NSGetProviderCacheList()) = cache;
51 void NSDestroyMessageCacheList()
53 NSCacheList * cache = *(NSGetMessageCacheList());
56 NSStorageDestroy(cache);
59 NSSetMessageCacheList(NULL);
62 void NSDestroyProviderCacheList()
64 NSCacheList * cache = *(NSGetProviderCacheList());
67 NSStorageDestroy(cache);
70 NSSetProviderCacheList(NULL);
73 NSMessage * NSMessageCacheFind(const char * messageId)
75 NS_VERIFY_NOT_NULL(messageId, NULL);
77 NSCacheList * MessageCache = *(NSGetMessageCacheList());
80 NS_LOG(DEBUG, "Message Cache Init");
81 MessageCache = NSStorageCreate();
82 NS_VERIFY_NOT_NULL(MessageCache, NULL);
84 MessageCache->cacheType = NS_CONSUMER_CACHE_MESSAGE;
85 NSSetMessageCacheList(MessageCache);
88 NSCacheElement * cacheElement = NSStorageRead(MessageCache, messageId);
89 NS_VERIFY_NOT_NULL(cacheElement, NULL);
91 return NSCopyMessage(((NSStoreMessage *) cacheElement->data)->msg);
94 NSProvider_internal * NSProviderCacheFind(const char * providerId)
96 NS_VERIFY_NOT_NULL(providerId, NULL);
98 NSCacheList * ProviderCache = *(NSGetProviderCacheList());
101 NS_LOG(DEBUG, "Provider Cache Init");
102 ProviderCache = NSStorageCreate();
103 NS_VERIFY_NOT_NULL(ProviderCache, NULL);
105 ProviderCache->cacheType = NS_CONSUMER_CACHE_PROVIDER;
106 NSSetProviderCacheList(ProviderCache);
109 NSCacheElement * cacheElement = NSStorageRead(ProviderCache, providerId);
110 NS_VERIFY_NOT_NULL(cacheElement, NULL);
112 return NSCopyProvider_internal((NSProvider_internal *) cacheElement->data);
115 NSProvider_internal * NSFindProviderFromAddr(OCDevAddr * addr)
117 NS_VERIFY_NOT_NULL(addr, NULL);
119 NSCacheList * ProviderCache = *(NSGetProviderCacheList());
122 NS_LOG(DEBUG, "Provider Cache does not intialized.");
126 NSCacheElement * cacheElement =
127 NSGetProviderFromAddr(ProviderCache, addr->addr, addr->port);
129 NS_VERIFY_NOT_NULL(cacheElement, NULL);
131 return NSCopyProvider_internal((NSProvider_internal *) cacheElement->data);
134 void NSRemoveCacheElementMessage(NSCacheElement * obj)
136 NSRemoveMessage(((NSStoreMessage *)obj->data)->msg);
137 NSOICFree(obj->data);
141 NSResult NSMessageCacheUpdate(NSMessage * msg, NSSyncType type)
143 NS_VERIFY_NOT_NULL(msg, NS_ERROR);
145 NSCacheList * MessageCache = *(NSGetMessageCacheList());
148 NS_LOG(DEBUG, "Message Cache Init");
149 MessageCache = NSStorageCreate();
150 NS_VERIFY_NOT_NULL(MessageCache, NS_ERROR);
152 MessageCache->cacheType = NS_CONSUMER_CACHE_MESSAGE;
153 NSSetMessageCacheList(MessageCache);
156 NSStoreMessage * sMsg = (NSStoreMessage *)OICMalloc(sizeof(NSStoreMessage));
157 NS_VERIFY_NOT_NULL(sMsg, NS_ERROR);
159 NSCacheElement * obj = (NSCacheElement *)OICMalloc(sizeof(NSCacheElement));
160 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(obj, NS_ERROR, NSOICFree(sMsg));
163 sMsg->msg = NSCopyMessage(msg);
165 obj->data = (NSCacheData *) sMsg;
168 NS_LOG(DEBUG, "try to write to storage");
169 NSResult ret = NSStorageWrite(MessageCache, obj);
170 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(ret == NS_OK ? (void *) 1 : NULL,
171 NS_ERROR, NSRemoveCacheElementMessage(obj));
173 NSRemoveCacheElementMessage(obj);
175 NS_LOG(DEBUG, "Update message done");
179 NSResult NSProviderCacheUpdate(NSProvider_internal * provider)
181 NSCacheList * ProviderCache = *(NSGetProviderCacheList());
184 NS_LOG(DEBUG, "Provider Cache Init");
185 ProviderCache = NSStorageCreate();
186 NS_VERIFY_NOT_NULL(ProviderCache, NS_ERROR);
188 ProviderCache->cacheType = NS_CONSUMER_CACHE_PROVIDER;
189 NSSetProviderCacheList(ProviderCache);
192 NS_VERIFY_NOT_NULL(provider, NS_ERROR);
194 NSCacheElement * obj = (NSCacheElement *)OICMalloc(sizeof(NSCacheElement));
195 NS_VERIFY_NOT_NULL(obj, NS_ERROR);
197 obj->data = (NSCacheData *) provider;
200 NS_LOG(DEBUG, "try to write to storage");
201 NSResult ret = NSStorageWrite(ProviderCache, obj);
202 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(ret == NS_OK ? (void *) 1 : NULL,
203 NS_ERROR, NSOICFree(obj));
208 void NSCancelAllSubscription()
210 NSCacheList * ProviderCache = *(NSGetProviderCacheList());
213 NS_LOG(DEBUG, "Provider Cache Init");
214 ProviderCache = NSStorageCreate();
215 NS_VERIFY_NOT_NULL_V(ProviderCache);
217 ProviderCache->cacheType = NS_CONSUMER_CACHE_PROVIDER;
218 NSSetProviderCacheList(ProviderCache);
221 NSCacheElement * obj = NULL;
222 while ((obj = NSPopProviderCacheList(ProviderCache)))
224 NS_LOG(DEBUG, "build NSTask");
225 NSProvider * prov = NSCopyProvider((NSProvider_internal *) obj->data);
226 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(prov,
227 NSRemoveProvider_internal((NSProvider_internal *) obj->data));
229 NSTask * task = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL, prov);
230 NS_VERIFY_NOT_NULL_V(task);
232 NSConsumerPushEvent(task);
236 void NSConsumerHandleProviderDiscovered(NSProvider_internal * provider)
238 NS_VERIFY_NOT_NULL_V(provider);
241 bool isSubscribing = false;
243 NSProvider_internal * providerCacheDataFromAddr
244 = NSFindProviderFromAddr(provider->connection->addr);
245 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(
246 (providerCacheDataFromAddr == NULL) ? (void *)1 : NULL,
247 NSRemoveProvider_internal(providerCacheDataFromAddr));
249 NSProvider_internal * providerCacheData = NSProviderCacheFind(provider->providerId);
251 if (providerCacheData == NULL)
257 providerCacheData->accessPolicy = provider->accessPolicy;
258 NSProviderConnectionInfo * infos = providerCacheData->connection;
259 OCTransportAdapter newAdapter = provider->connection->addr->adapter;
262 isSubscribing |= infos->isSubscribing;
263 if (infos->addr->adapter == newAdapter && infos->isSubscribing == true)
265 NS_LOG_V(DEBUG, "This provider already discovered : %s:%d",
266 infos->addr->addr, infos->addr->port);
267 NS_LOG_V(DEBUG, "Subscription : %d", infos->isSubscribing);
274 NSResult ret = NSProviderCacheUpdate(provider);
275 NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *) 1 : NULL);
277 if (isAdded == false)
279 NS_LOG(DEBUG, "New provider is discovered");
283 provider = providerCacheData;
284 NS_LOG(DEBUG, "provider's connection is updated.");
287 if (provider->accessPolicy == NS_SELECTION_CONSUMER && isSubscribing == false)
289 NS_LOG(DEBUG, "accepter is NS_ACCEPTER_CONSUMER, Callback to user");
290 NSProvider * providerForCb = NSCopyProvider(provider);
291 NSProviderChanged(providerForCb, NS_DISCOVERED);
295 NS_LOG(DEBUG, "accepter is NS_ACCEPTER_PROVIDER, request subscribe");
296 NSProvider_internal * subProvider = NSCopyProvider_internal(provider);
297 NSTask * task = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE, (void *) subProvider);
298 NS_VERIFY_NOT_NULL_V(task);
300 NSConsumerPushEvent(task);
303 NSRemoveProvider_internal(providerCacheData);
306 void NSConsumerHandleProviderDeleted(NSProvider_internal * provider)
308 NS_VERIFY_NOT_NULL_V(provider);
310 NSCacheList * providerCache = *(NSGetProviderCacheList());
311 NS_VERIFY_NOT_NULL_V(providerCache);
313 NSResult ret = NSStorageDelete(providerCache, provider->providerId);
314 NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *)1 : NULL);
316 NS_LOG_V(DEBUG, "Stopped Provider : %s", provider->providerId);
317 NSProvider * providerForCb = NSCopyProvider(provider);
318 NSProviderChanged(providerForCb, NS_STOPPED);
321 void NSConsumerHandleSubscribeSucceed(NSProvider_internal * provider)
323 NS_VERIFY_NOT_NULL_V(provider);
325 NSCacheList * ProviderCache = *(NSGetProviderCacheList());
327 NSCacheElement * cacheElement = NSStorageRead(ProviderCache, provider->providerId);
328 NS_VERIFY_NOT_NULL_V(cacheElement);
330 pthread_mutex_t * mutex = NSGetCacheMutex();
331 pthread_mutex_lock(mutex);
333 NS_VERIFY_NOT_NULL_V(cacheElement);
334 NSProvider_internal * prov = (NSProvider_internal *)cacheElement->data;
335 NSProviderConnectionInfo *infos = prov->connection;
338 infos->isSubscribing = true;
342 pthread_mutex_unlock(mutex);
345 void NSConsumerHandleRecvProviderChanged(NSMessage * msg)
347 NS_VERIFY_NOT_NULL_V(msg);
349 NS_LOG_V(DEBUG, "confirmed by : %s", msg->providerId);
351 NSCacheList * ProviderCache = *(NSGetProviderCacheList());
353 NSCacheElement * cacheElement = NSStorageRead(ProviderCache, msg->providerId);
354 NS_VERIFY_NOT_NULL_V(cacheElement);
356 pthread_mutex_t * mutex = NSGetCacheMutex();
357 pthread_mutex_lock(mutex);
358 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(cacheElement, pthread_mutex_unlock(mutex));
359 NSProvider_internal * provider = (NSProvider_internal *) cacheElement->data;
360 if (provider->state == (NSProviderState) msg->messageId)
362 NS_LOG_V(DEBUG, "Already receive message(ALLOW/DENY) : %d", (int) msg->messageId);
363 pthread_mutex_unlock(mutex);
367 NS_LOG_V(DEBUG, "Provider State Changed %d -> %d",
368 (int) provider->state, (int) msg->messageId);
369 NS_LOG(DEBUG, "call back to user");
370 provider->state = (NSProviderState) msg->messageId;
372 NSProvider * prov = NSCopyProvider(provider);
374 pthread_mutex_unlock(mutex);
375 NSProviderChanged(prov, (NSProviderState) msg->messageId);
378 void NSConsumerHandleRecvMessage(NSMessage * msg)
380 NS_VERIFY_NOT_NULL_V(msg);
382 NSResult ret = NSMessageCacheUpdate(msg, NS_SYNC_UNREAD);
383 NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *) 1 : NULL);
385 NSMessagePost((NSMessage *) msg);
388 void NSConsumerHandleRecvSyncInfo(NSSyncInfo * sync)
390 NS_VERIFY_NOT_NULL_V(sync);
392 char msgId[NS_DEVICE_ID_LENGTH] = { 0, };
393 snprintf(msgId, NS_DEVICE_ID_LENGTH, "%lld", (long long int)sync->messageId);
395 NSMessage * msg = NSMessageCacheFind(msgId);
396 NS_VERIFY_NOT_NULL_V(msg);
398 NSResult ret = NSMessageCacheUpdate(msg, sync->state);
399 NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *) 1 : NULL);
400 NSRemoveMessage(msg);
402 NSNotificationSync(sync);
405 void NSConsumerHandleMakeSyncInfo(NSSyncInfo * sync)
407 NS_VERIFY_NOT_NULL_V(sync);
409 NSProvider_internal * provider = NSProviderCacheFind(sync->providerId);
410 NS_VERIFY_NOT_NULL_V (provider);
412 NSProviderConnectionInfo * connections = NSCopyProviderConnections(provider->connection);
413 NS_VERIFY_NOT_NULL_V (connections);
415 NSSyncInfo_internal * syncInfo = (NSSyncInfo_internal *)OICMalloc(sizeof(NSSyncInfo_internal));
416 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(syncInfo, NSRemoveConnections(connections));
418 OICStrcpy(syncInfo->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, sync->providerId);
419 syncInfo->messageId = sync->messageId;
420 syncInfo->state = sync->state;
421 syncInfo->connection = connections;
423 NSTask * syncTask = NSMakeTask(TASK_SEND_SYNCINFO, (void *) syncInfo);
424 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(syncTask, NSOICFree(syncInfo));
426 NSConsumerPushEvent(syncTask);
429 void NSConsumerHandleGetTopicUri(NSMessage * msg)
431 NS_VERIFY_NOT_NULL_V(msg);
433 NSProvider_internal * provider = NSProviderCacheFind(msg->providerId);
434 NS_VERIFY_NOT_NULL_V(provider);
436 NSTask * topicTask = NSMakeTask(TASK_CONSUMER_REQ_TOPIC_LIST, (void *) provider);
437 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(topicTask, NSRemoveProvider_internal(provider));
439 NSConsumerPushEvent(topicTask);
442 void NSConsumerHandleRecvTopicLL(NSProvider_internal * provider)
444 NS_VERIFY_NOT_NULL_V(provider);
446 NSRemoveConnections(provider->connection);
447 provider->connection = NULL;
449 NSResult ret = NSProviderCacheUpdate(provider);
450 NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *) 1 : NULL);
452 NS_LOG(DEBUG, "call back to user");
453 NSProvider * prov = NSCopyProvider(provider);
454 NSProviderChanged((NSProvider *) prov, (NSProviderState) NS_TOPIC);
457 void NSConsumerInternalTaskProcessing(NSTask * task)
459 NS_VERIFY_NOT_NULL_V(task);
461 NS_LOG_V(DEBUG, "Receive Event : %d", (int)task->taskType);
462 switch (task->taskType)
464 case TASK_CONSUMER_SENT_REQ_OBSERVE:
466 NS_LOG(DEBUG, "Receive Subscribe succeed from provider.");
467 NSConsumerHandleSubscribeSucceed((NSProvider_internal *)task->taskData);
468 NSRemoveProvider_internal((NSProvider_internal *)task->taskData);
471 case TASK_CONSUMER_RECV_PROVIDER_CHANGED:
473 NS_LOG(DEBUG, "Receive Provider Changed");
474 NSConsumerHandleRecvProviderChanged((NSMessage *)task->taskData);
475 NSRemoveMessage((NSMessage *)task->taskData);
478 case TASK_CONSUMER_RECV_MESSAGE:
480 NS_LOG(DEBUG, "Receive New Notification");
481 NSConsumerHandleRecvMessage((NSMessage *)task->taskData);
482 NSRemoveMessage((NSMessage *)task->taskData);
485 case TASK_CONSUMER_PROVIDER_DISCOVERED:
487 NS_LOG(DEBUG, "Receive New Provider is discovered.");
488 NSConsumerHandleProviderDiscovered((NSProvider_internal *)task->taskData);
489 NSRemoveProvider_internal((NSProvider_internal *)task->taskData);
492 case TASK_RECV_SYNCINFO:
494 NS_LOG(DEBUG, "Receive SyncInfo.");
495 NSConsumerHandleRecvSyncInfo((NSSyncInfo *)task->taskData);
496 NSOICFree(task->taskData);
499 case TASK_MAKE_SYNCINFO:
501 NS_LOG(DEBUG, "Make SyncInfo, get Provider's Addr");
502 NSConsumerHandleMakeSyncInfo((NSSyncInfo *)task->taskData);
503 NSOICFree(task->taskData);
506 case TASK_CONSUMER_REQ_TOPIC_URI:
508 NS_LOG(DEBUG, "Request Topic Uri");
509 NSConsumerHandleGetTopicUri((NSMessage *)task->taskData);
510 NSRemoveMessage((NSMessage *)task->taskData);
513 case TASK_CONSUMER_RECV_TOPIC_LIST:
515 NS_LOG(DEBUG, "Receive Topic List");
516 NSConsumerHandleRecvTopicLL((NSProvider_internal *)task->taskData);
517 NSRemoveProvider_internal((NSProvider_internal *)task->taskData);
520 case TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL:
522 NS_LOG(DEBUG, "Make Subscribe cancel from provider.");
523 NSConsumerHandleProviderDeleted((NSProvider_internal *)task->taskData);
524 NSRemoveProvider_internal((NSProvider_internal *)task->taskData);
529 NS_LOG(ERROR, "Unknown TASK Type");