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 "NSConsumerCommon.h"
22 #include "NSConstants.h"
24 #include "oic_malloc.h"
25 #include "oic_string.h"
29 #define NS_QUERY_CONSUMER_ID "consumerid"
31 pthread_mutex_t ** NSGetStackMutex()
33 static pthread_mutex_t * g_stackMutext = NULL;
34 if (g_stackMutext == NULL)
36 g_stackMutext = (pthread_mutex_t *)OICMalloc(sizeof(pthread_mutex_t));
37 NS_VERIFY_NOT_NULL(g_stackMutext, NULL);
38 pthread_mutex_init(g_stackMutext, NULL);
41 return & g_stackMutext;
44 char ** NSGetConsumerId()
46 static char * g_consumerId = NULL;
47 return & g_consumerId;
50 void NSSetConsumerId(char * cId)
52 NS_VERIFY_NOT_NULL_V(cId);
53 char ** consumerId = NSGetConsumerId();
54 NSOICFree(*consumerId);
55 *consumerId = (char *)OICMalloc(sizeof(char) * NS_DEVICE_ID_LENGTH);
56 NS_VERIFY_NOT_NULL_V(*consumerId);
58 OICStrcpy(*consumerId, sizeof(char) * NS_DEVICE_ID_LENGTH, cId);
61 char * NSMakeRequestUriWithConsumerId(const char * uri)
63 NS_VERIFY_NOT_NULL(uri, NULL);
65 char * consumerId = OICStrdup(*NSGetConsumerId());
66 NS_VERIFY_NOT_NULL(consumerId, NULL);
68 size_t uriLen = strlen(uri) + 1;
69 size_t qKeyLen = sizeof(NS_QUERY_CONSUMER_ID);
70 size_t queryLen = NS_DEVICE_ID_LENGTH + uriLen + qKeyLen + 2;
72 char * retQuery = (char *)OICMalloc(sizeof(char) * queryLen);
73 NS_VERIFY_NOT_NULL(retQuery, NULL);
76 OICStrcpy((retQuery + index), uriLen, uri);
78 OICStrcpy((retQuery + index), 2, "?");
80 OICStrcpy((retQuery + index), qKeyLen, NS_QUERY_CONSUMER_ID);
82 OICStrcpy((retQuery + index), 2, "=");
84 OICStrcpy((retQuery + index), NS_DEVICE_ID_LENGTH, consumerId);
86 NSOICFree(consumerId);
91 bool * NSGetBoneIsStartedConsumer()
93 static bool g_isStartedConsumer = false;
95 return & g_isStartedConsumer;
98 void NSSetIsStartedConsumer(bool setValue)
100 * NSGetBoneIsStartedConsumer() = setValue;
103 bool NSIsStartedConsumer()
105 return * NSGetBoneIsStartedConsumer();
108 NSProviderDiscoveredCallback * NSGetBoneDiscoverCb()
110 static NSProviderDiscoveredCallback g_discoverCb = NULL;
112 return & g_discoverCb;
115 void NSSetDiscoverProviderCb(NSProviderDiscoveredCallback cb)
117 * NSGetBoneDiscoverCb() = cb;
120 NSProviderDiscoveredCallback NSGetDiscoverCb()
122 return * NSGetBoneDiscoverCb();
125 void * NSDiscoveredProviderFunc(void * provider)
127 NSGetDiscoverCb()((NSProvider *) provider);
132 void NSDiscoveredProvider(NSProvider * provider)
134 NS_VERIFY_NOT_NULL_V(provider);
136 NSConsumerThread * thread = NSThreadInit(NSDiscoveredProviderFunc, (void *) provider);
137 NS_VERIFY_NOT_NULL_V(thread);
140 NSProviderChangedCallback * NSGetProviderChangedCb()
142 static NSProviderChangedCallback g_changedCb = NULL;
144 return & g_changedCb;
147 void NSSetProviderChangedCb(NSProviderChangedCallback cb)
149 *(NSGetProviderChangedCb()) = cb;
152 void NSProviderChanged(NSProvider * provider, NSResponse response)
154 (*(NSGetProviderChangedCb()))(provider, response);
157 NSSyncInfoReceivedCallback * NSGetBoneNotificationSyncCb()
159 static NSSyncInfoReceivedCallback g_syncCb = NULL;
164 void NSSetNotificationSyncCb(NSSyncInfoReceivedCallback cb)
166 * NSGetBoneNotificationSyncCb() = cb;
169 void * NSNotificationSyncFunc(void * obj)
171 (* NSGetBoneNotificationSyncCb())((NSSyncInfo *) obj);
175 void NSNotificationSync(NSSyncInfo * sync)
177 NS_VERIFY_NOT_NULL_V(sync);
179 NSSyncInfo * retSync = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));
180 NS_VERIFY_NOT_NULL_V(retSync);
181 memcpy(retSync, sync, sizeof(NSSyncInfo));
183 NSConsumerThread * thread = NSThreadInit(NSNotificationSyncFunc, (void *) retSync);
184 NS_VERIFY_NOT_NULL_V(thread);
187 NSMessageReceivedCallback * NSGetBoneMessagePostedCb()
189 static NSMessageReceivedCallback g_postCb = NULL;
194 void NSSetMessagePostedCb(NSMessageReceivedCallback cb)
196 * NSGetBoneMessagePostedCb() = cb;
199 NSMessageReceivedCallback NSGetMessagePostedCb()
201 return * NSGetBoneMessagePostedCb();
204 void * NSMessagePostFunc(void * obj)
206 NSGetMessagePostedCb()((NSMessage *) obj);
210 void NSMessagePost(NSMessage * msg)
212 NS_VERIFY_NOT_NULL_V(msg);
214 NSMessage * retMsg = NSCopyMessage(msg);
215 NS_VERIFY_NOT_NULL_V(retMsg);
217 NSConsumerThread * thread = NSThreadInit(NSMessagePostFunc, (void *) retMsg);
218 NS_VERIFY_NOT_NULL_V(thread);
221 NSTask * NSMakeTask(NSTaskType type, void * data)
223 NSTask * retTask = OICMalloc(sizeof(NSTask));
224 NS_VERIFY_NOT_NULL(retTask, NULL);
226 retTask->taskType = type;
227 retTask->taskData = data;
228 retTask->nextTask = NULL;
233 NSMessage * NSCopyMessage(NSMessage * msg)
235 NS_VERIFY_NOT_NULL(msg, NULL);
237 NSMessage * newMsg = (NSMessage *)OICMalloc(sizeof(NSMessage));
238 NS_VERIFY_NOT_NULL(newMsg, NULL);
240 OICStrcpy(newMsg->providerId, NS_DEVICE_ID_LENGTH, msg->providerId);
242 newMsg->messageId = msg->messageId;
243 newMsg->title = OICStrdup(msg->title);
244 newMsg->contentText = OICStrdup(msg->contentText);
245 newMsg->sourceName = OICStrdup(msg->sourceName);
246 newMsg->dateTime = OICStrdup(msg->dateTime);
247 newMsg->type = msg->type;
248 newMsg->topic = NULL;
249 if (msg->topic && strlen(msg->topic) > 0)
251 newMsg->topic = OICStrdup(msg->topic);
254 // TODO change to copy function.
255 newMsg->mediaContents = msg->mediaContents;
259 void NSRemoveMessage(NSMessage * msg)
261 NS_VERIFY_NOT_NULL_V(msg);
264 NSOICFree(msg->title);
265 NSOICFree(msg->contentText);
266 NSOICFree(msg->sourceName);
267 NSOICFree(msg->dateTime);
268 NSOICFree(msg->topic);
270 // TODO change to remove function.
271 NSOICFree(msg->mediaContents);
276 void NSRemoveConnections(NSProviderConnectionInfo * connections)
278 NS_VERIFY_NOT_NULL_V(connections);
280 NSProviderConnectionInfo * tmp = connections;
284 tmp->messageHandle = NULL;
285 tmp->syncHandle = NULL;
286 NSOICFree(tmp->addr);
290 NSOICFree(connections);
293 NSProviderConnectionInfo * NSCreateProviderConnections(OCDevAddr * inAddr)
295 NSProviderConnectionInfo * connections
296 = (NSProviderConnectionInfo *)OICMalloc(sizeof(NSProviderConnectionInfo));
297 NS_VERIFY_NOT_NULL(connections, NULL);
299 connections->addr = NULL;
300 connections->messageHandle = NULL;
301 connections->syncHandle = NULL;
302 connections->isCloudConnection = false;
303 connections->isSubscribing = false;
304 connections->next = NULL;
308 connections->addr = (OCDevAddr *)OICMalloc(sizeof(OCDevAddr));
309 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(connections->addr, NULL, NSRemoveConnections(connections));
310 memcpy(connections->addr, inAddr, sizeof(OCDevAddr));
316 NSProviderConnectionInfo * NSCopyProviderConnections(NSProviderConnectionInfo * conn)
318 NS_VERIFY_NOT_NULL(conn, NULL);
319 NSProviderConnectionInfo * tmp = conn;
321 NSProviderConnectionInfo * retInfo = NSCreateProviderConnections(tmp->addr);
322 NS_VERIFY_NOT_NULL(retInfo, NULL);
323 retInfo->messageHandle = tmp->messageHandle;
324 retInfo->syncHandle = tmp->syncHandle;
325 retInfo->isCloudConnection = tmp->isCloudConnection;
326 retInfo->isSubscribing = tmp->isSubscribing;
329 NSProviderConnectionInfo * copyInfo = retInfo;
333 NSProviderConnectionInfo * tmpInfo = NSCreateProviderConnections(tmp->addr);
334 NS_VERIFY_NOT_NULL(tmpInfo, NULL);
336 tmpInfo->messageHandle = tmp->messageHandle;
337 tmpInfo->syncHandle = tmp->syncHandle;
338 tmpInfo->isCloudConnection = tmp->isCloudConnection;
339 tmpInfo->isSubscribing = tmp->isSubscribing;
341 copyInfo->next = tmpInfo;
348 void NSRemoveTopicNode(NSTopicLL * topicNode)
350 NS_VERIFY_NOT_NULL_V(topicNode);
352 NSOICFree(topicNode->topicName);
353 topicNode->next = NULL;
355 NSOICFree(topicNode);
358 NSTopicLL * NSCopyTopicNode(NSTopicLL * topicNode)
360 NS_VERIFY_NOT_NULL(topicNode, NULL);
362 NSTopicLL * newTopicNode = (NSTopicLL *)OICMalloc(sizeof(NSTopicLL));
363 NS_VERIFY_NOT_NULL(newTopicNode, NULL);
365 newTopicNode->topicName = OICStrdup(topicNode->topicName);
366 newTopicNode->state = topicNode->state;
367 newTopicNode->next = NULL;
372 NSResult NSInsertTopicNode(NSTopicLL * topicHead, NSTopicLL * topicNode)
374 NS_VERIFY_NOT_NULL(topicHead, NS_ERROR);
375 NS_VERIFY_NOT_NULL(topicNode, NS_ERROR);
377 NSTopicLL * iter = topicHead;
378 NSTopicLL * prev = NULL;
383 iter = (NSTopicLL *) iter->next;
386 prev->next = topicNode;
387 topicNode->next = NULL;
392 void NSRemoveTopicLL(NSTopicLL * topicHead)
394 NS_VERIFY_NOT_NULL_V(topicHead);
396 NSTopicLL * iter = topicHead;
397 NSTopicLL * following = NULL;
401 following = (NSTopicLL *) iter->next;
403 NSRemoveTopicNode(iter);
409 NSTopicLL * NSCopyTopicLL(NSTopicLL * topicHead)
411 NS_VERIFY_NOT_NULL(topicHead, NULL);
413 NSTopicLL * iter = topicHead;
415 NSTopicLL * newTopicHead = NSCopyTopicNode(iter);
416 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newTopicHead, NULL, NSRemoveTopicLL(newTopicHead));
418 iter = (NSTopicLL *) iter->next;
422 NSTopicLL * newTopicNode = NSCopyTopicNode(iter);
423 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newTopicNode, NULL, NSRemoveTopicLL(newTopicHead));
425 NSResult ret = NSInsertTopicNode(newTopicHead, newTopicNode);
426 NS_VERIFY_STACK_SUCCESS_WITH_POST_CLEANING(ret, NULL, NSRemoveTopicLL(newTopicHead));
428 iter = (NSTopicLL *) iter->next;
434 void NSCopyProviderPostClean(
435 NSProviderConnectionInfo * connections, NSProvider_internal * provider)
437 NSRemoveConnections(connections);
441 NSProvider_internal * NSCopyProvider_internal(NSProvider_internal * prov)
443 NS_VERIFY_NOT_NULL(prov, NULL);
445 NSProviderConnectionInfo * connections = NSCopyProviderConnections(prov->connection);
446 NS_VERIFY_NOT_NULL(connections, NULL);
448 NSProvider_internal * newProv = (NSProvider_internal *) OICMalloc(sizeof(NSProvider_internal));
449 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newProv, NULL, NSRemoveConnections(connections));
451 newProv->topicLL = NULL;
455 NSTopicLL * newTopicLL = NSCopyTopicLL(prov->topicLL);
456 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newTopicLL, NULL,
457 NSCopyProviderPostClean(connections, newProv));
459 newProv->topicLL = newTopicLL;
462 newProv->connection = connections;
463 OICStrcpy(newProv->providerId, NS_DEVICE_ID_LENGTH, prov->providerId);
464 newProv->messageUri = OICStrdup(prov->messageUri);
465 newProv->syncUri = OICStrdup(prov->syncUri);
466 newProv->topicUri = OICStrdup(prov->topicUri);
467 newProv->accessPolicy = prov->accessPolicy;
472 NSProvider * NSCopyProvider(NSProvider_internal * prov)
474 NS_VERIFY_NOT_NULL(prov, NULL);
476 NSProvider * newProv = (NSProvider *) OICMalloc(sizeof(NSProvider));
477 NS_VERIFY_NOT_NULL(newProv, NULL);
479 newProv->topicLL = NULL;
483 NSTopicLL * topicList = NSCopyTopicLL(prov->topicLL);
484 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(topicList, NULL, NSRemoveProvider(newProv));
486 newProv->topicLL = topicList;
489 OICStrcpy(newProv->providerId, NS_DEVICE_ID_LENGTH, prov->providerId);
494 void NSRemoveProvider_internal(NSProvider_internal * prov)
496 NS_VERIFY_NOT_NULL_V(prov);
498 NSOICFree(prov->messageUri);
499 NSOICFree(prov->syncUri);
500 NSOICFree(prov->topicUri);
501 NSRemoveConnections(prov->connection);
504 NSRemoveTopicLL(prov->topicLL);
510 void NSRemoveProvider(NSProvider * prov)
512 NS_VERIFY_NOT_NULL_V(prov);
516 NSRemoveTopicLL(prov->topicLL);
522 NSSyncInfo_internal * NSCopySyncInfo(NSSyncInfo_internal * syncInfo)
524 NS_VERIFY_NOT_NULL(syncInfo, NULL);
526 NSProviderConnectionInfo * connections = NSCopyProviderConnections(syncInfo->connection);
527 NS_VERIFY_NOT_NULL(connections, NULL);
529 NSSyncInfo_internal * newSyncInfo = (NSSyncInfo_internal *)OICMalloc(sizeof(NSSyncInfo_internal));
530 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newSyncInfo, NULL, NSRemoveConnections(connections));
532 OICStrcpy(newSyncInfo->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, syncInfo->providerId);
533 newSyncInfo->messageId = syncInfo->messageId;
534 newSyncInfo->state = syncInfo->state;
535 newSyncInfo->connection = connections;
540 void NSRemoveSyncInfo(NSSyncInfo_internal * syncInfo)
542 NS_VERIFY_NOT_NULL_V(syncInfo);
544 NSRemoveConnections(syncInfo->connection);
549 OCStackResult NSInvokeRequest(OCDoHandle * handle,
550 OCMethod method, const OCDevAddr * addr,
551 const char * queryUrl, OCPayload * payload,
552 void * callbackFunc, void * callbackData, OCConnectivityType type)
554 int mutexRet = pthread_mutex_lock(*(NSGetStackMutex()));
555 NS_VERIFY_NOT_NULL(mutexRet != 0 ? NULL : (void *)1, OC_STACK_ERROR);
557 OCCallbackData cbdata = { 0, };
559 cbdata.cb = callbackFunc;
560 cbdata.context = callbackData;
563 OCStackResult ret = OCDoResource(handle, method, queryUrl, addr,
564 payload, type, NS_QOS, &cbdata, NULL, 0);
566 mutexRet = pthread_mutex_unlock(*(NSGetStackMutex()));
567 NS_VERIFY_NOT_NULL(mutexRet != 0 ? NULL : (void *)1, OC_STACK_ERROR);
572 bool NSOCResultToSuccess(OCStackResult ret)
577 case OC_STACK_RESOURCE_CREATED:
578 case OC_STACK_RESOURCE_DELETED:
579 case OC_STACK_PRESENCE_STOPPED:
580 case OC_STACK_CONTINUE:
581 case OC_STACK_RESOURCE_CHANGED:
584 NS_LOG_V(DEBUG, "OCStackResult : %d", (int)ret);