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"
26 #include "ocpayload.h"
30 #define NS_QUERY_CONSUMER_ID "consumerId"
32 pthread_mutex_t ** NSGetStackMutex()
34 static pthread_mutex_t * g_stackMutext = NULL;
35 if (g_stackMutext == NULL)
37 g_stackMutext = (pthread_mutex_t *)OICMalloc(sizeof(pthread_mutex_t));
38 NS_VERIFY_NOT_NULL(g_stackMutext, NULL);
39 pthread_mutex_init(g_stackMutext, NULL);
42 return & g_stackMutext;
45 char ** NSGetConsumerId()
47 static char * g_consumerId = NULL;
48 return & g_consumerId;
51 void NSSetConsumerId(char * cId)
53 NS_VERIFY_NOT_NULL_V(cId);
54 char ** consumerId = NSGetConsumerId();
55 NSOICFree(*consumerId);
56 *consumerId = (char *)OICMalloc(sizeof(char) * NS_DEVICE_ID_LENGTH);
57 NS_VERIFY_NOT_NULL_V(*consumerId);
59 OICStrcpy(*consumerId, sizeof(char) * NS_DEVICE_ID_LENGTH, cId);
62 char * NSMakeRequestUriWithConsumerId(const char * uri)
64 NS_VERIFY_NOT_NULL(uri, NULL);
66 char * consumerId = OICStrdup(*NSGetConsumerId());
67 NS_VERIFY_NOT_NULL(consumerId, NULL);
69 size_t uriLen = strlen(uri) + 1;
70 size_t qKeyLen = sizeof(NS_QUERY_CONSUMER_ID);
71 size_t queryLen = NS_DEVICE_ID_LENGTH + uriLen + qKeyLen + 2;
73 char * retQuery = (char *)OICMalloc(sizeof(char) * queryLen);
74 NS_VERIFY_NOT_NULL(retQuery, NULL);
77 OICStrcpy((retQuery + index), uriLen, uri);
79 OICStrcpy((retQuery + index), 2, "?");
81 OICStrcpy((retQuery + index), qKeyLen, NS_QUERY_CONSUMER_ID);
83 OICStrcpy((retQuery + index), 2, "=");
85 OICStrcpy((retQuery + index), NS_DEVICE_ID_LENGTH, consumerId);
87 NSOICFree(consumerId);
92 bool * NSGetBoneIsStartedConsumer()
94 static bool g_isStartedConsumer = false;
96 return & g_isStartedConsumer;
99 void NSSetIsStartedConsumer(bool setValue)
101 * NSGetBoneIsStartedConsumer() = setValue;
103 if (setValue == false)
105 pthread_mutex_destroy(*NSGetStackMutex());
106 NSOICFree(*NSGetStackMutex());
107 *NSGetStackMutex() = NULL;
109 NSOICFree(*NSGetConsumerId());
110 *NSGetConsumerId() = NULL;
114 bool NSIsStartedConsumer()
116 return * NSGetBoneIsStartedConsumer();
119 NSProviderStateCallback * NSGetProviderChangedCb()
121 static NSProviderStateCallback g_changedCb = NULL;
123 return & g_changedCb;
126 void NSSetProviderChangedCb(NSProviderStateCallback cb)
128 *(NSGetProviderChangedCb()) = cb;
133 NSProvider * provider;
134 NSProviderState state;
135 } NSProviderChangedData;
137 void * NSProviderChangedFunc(void * obj)
139 NSProviderChangedData * data = (NSProviderChangedData *) obj;
140 (*(NSGetProviderChangedCb()))(data->provider, data->state);
145 void NSProviderChanged(NSProvider * provider, NSProviderState response)
147 NS_VERIFY_NOT_NULL_V(provider);
149 NSProvider * retProvider = NSCopyProvider((NSProvider_internal *) provider);
150 NS_VERIFY_NOT_NULL_V(retProvider);
152 NSProviderChangedData * data =
153 (NSProviderChangedData *)OICMalloc(sizeof(NSProviderChangedData));
154 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(data, NSRemoveProvider(retProvider));
156 data->provider = retProvider;
157 data->state = response;
159 NSConsumerThread * thread = NSThreadInit(NSProviderChangedFunc, (void *) data);
160 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(thread,
162 NSRemoveProvider(retProvider);
166 NSDestroyThreadHandle(thread);
170 NSSyncInfoReceivedCallback * NSGetBoneNotificationSyncCb()
172 static NSSyncInfoReceivedCallback g_syncCb = NULL;
177 void NSSetNotificationSyncCb(NSSyncInfoReceivedCallback cb)
179 * NSGetBoneNotificationSyncCb() = cb;
182 void * NSNotificationSyncFunc(void * obj)
184 (* NSGetBoneNotificationSyncCb())((NSSyncInfo *) obj);
188 void NSNotificationSync(NSSyncInfo * sync)
190 NS_VERIFY_NOT_NULL_V(sync);
192 NSSyncInfo * retSync = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));
193 NS_VERIFY_NOT_NULL_V(retSync);
194 memcpy(retSync, sync, sizeof(NSSyncInfo));
196 NSConsumerThread * thread = NSThreadInit(NSNotificationSyncFunc, (void *) retSync);
197 NS_VERIFY_NOT_NULL_V(thread);
199 NSDestroyThreadHandle(thread);
203 NSMessageReceivedCallback * NSGetBoneMessagePostedCb()
205 static NSMessageReceivedCallback g_postCb = NULL;
210 void NSSetMessagePostedCb(NSMessageReceivedCallback cb)
212 * NSGetBoneMessagePostedCb() = cb;
215 NSMessageReceivedCallback NSGetMessagePostedCb()
217 return * NSGetBoneMessagePostedCb();
220 void * NSMessagePostFunc(void * obj)
222 NSGetMessagePostedCb()((NSMessage *) obj);
226 void NSMessagePost(NSMessage * msg)
228 NS_VERIFY_NOT_NULL_V(msg);
230 NSMessage * retMsg = NSCopyMessage(msg);
231 NS_VERIFY_NOT_NULL_V(retMsg);
233 NSConsumerThread * thread = NSThreadInit(NSMessagePostFunc, (void *) retMsg);
234 NS_VERIFY_NOT_NULL_V(thread);
236 NSDestroyThreadHandle(thread);
240 NSTask * NSMakeTask(NSTaskType type, void * data)
242 NSTask * retTask = OICMalloc(sizeof(NSTask));
243 NS_VERIFY_NOT_NULL(retTask, NULL);
245 retTask->taskType = type;
246 retTask->taskData = data;
247 retTask->nextTask = NULL;
252 NSMessage * NSCopyMessage(NSMessage * msg)
254 NS_VERIFY_NOT_NULL(msg, NULL);
256 NSMessage * newMsg = (NSMessage *)OICMalloc(sizeof(NSMessage));
257 NS_VERIFY_NOT_NULL(newMsg, NULL);
259 OICStrcpy(newMsg->providerId, NS_DEVICE_ID_LENGTH, msg->providerId);
261 newMsg->messageId = msg->messageId;
262 newMsg->title = OICStrdup(msg->title);
263 newMsg->contentText = OICStrdup(msg->contentText);
264 newMsg->sourceName = OICStrdup(msg->sourceName);
265 newMsg->dateTime = OICStrdup(msg->dateTime);
266 newMsg->type = msg->type;
267 newMsg->ttl= msg->ttl;
269 newMsg->topic = NULL;
270 if (msg->topic && strlen(msg->topic) > 0)
272 newMsg->topic = OICStrdup(msg->topic);
275 newMsg->mediaContents = NULL;
276 if (msg->mediaContents)
278 newMsg->mediaContents = (NSMediaContents *)OICMalloc(sizeof(NSMediaContents));
279 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(
280 newMsg->mediaContents, NULL, NSRemoveMessage(newMsg));
281 newMsg->mediaContents->iconImage =
282 (char *)OICMalloc(sizeof(char)*strlen(msg->mediaContents->iconImage) + 1);
283 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(
284 newMsg->mediaContents->iconImage, NULL, NSRemoveMessage(newMsg));
285 memcpy(newMsg->mediaContents->iconImage, msg->mediaContents->iconImage,
286 strlen(msg->mediaContents->iconImage) + 1);
289 newMsg->extraInfo = NULL;
292 newMsg->extraInfo = OCRepPayloadClone(msg->extraInfo);
297 void NSRemoveMessage(NSMessage * msg)
299 NS_VERIFY_NOT_NULL_V(msg);
302 NSOICFree(msg->title);
303 NSOICFree(msg->contentText);
304 NSOICFree(msg->sourceName);
305 NSOICFree(msg->dateTime);
306 NSOICFree(msg->topic);
308 if (msg->mediaContents)
310 NSOICFree(msg->mediaContents->iconImage);
312 NSOICFree(msg->mediaContents);
316 OCRepPayloadDestroy(msg->extraInfo);
317 msg->extraInfo = NULL;
323 void NSRemoveConnections(NSProviderConnectionInfo * connections)
325 NS_VERIFY_NOT_NULL_V(connections);
327 NSProviderConnectionInfo * tmp = connections;
331 tmp->messageHandle = NULL;
332 tmp->syncHandle = NULL;
333 NSOICFree(tmp->addr);
334 NSProviderConnectionInfo * next = tmp->next;
340 NSProviderConnectionInfo * NSCreateProviderConnections(OCDevAddr * inAddr)
342 NSProviderConnectionInfo * connections
343 = (NSProviderConnectionInfo *)OICMalloc(sizeof(NSProviderConnectionInfo));
344 NS_VERIFY_NOT_NULL(connections, NULL);
346 connections->addr = NULL;
347 connections->messageHandle = NULL;
348 connections->syncHandle = NULL;
349 connections->isCloudConnection = false;
350 connections->isSubscribing = false;
351 connections->next = NULL;
355 connections->addr = (OCDevAddr *)OICMalloc(sizeof(OCDevAddr));
356 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(connections->addr, NULL, NSRemoveConnections(connections));
357 memcpy(connections->addr, inAddr, sizeof(OCDevAddr));
363 NSProviderConnectionInfo * NSCopyProviderConnections(NSProviderConnectionInfo * conn)
365 NS_VERIFY_NOT_NULL(conn, NULL);
366 NSProviderConnectionInfo * tmp = conn;
368 NSProviderConnectionInfo * retInfo = NSCreateProviderConnections(tmp->addr);
369 NS_VERIFY_NOT_NULL(retInfo, NULL);
370 retInfo->messageHandle = tmp->messageHandle;
371 retInfo->syncHandle = tmp->syncHandle;
372 retInfo->isCloudConnection = tmp->isCloudConnection;
373 retInfo->isSubscribing = tmp->isSubscribing;
376 NSProviderConnectionInfo * copyInfo = retInfo;
380 NSProviderConnectionInfo * tmpInfo = NSCreateProviderConnections(tmp->addr);
381 NS_VERIFY_NOT_NULL(tmpInfo, NULL);
383 tmpInfo->messageHandle = tmp->messageHandle;
384 tmpInfo->syncHandle = tmp->syncHandle;
385 tmpInfo->isCloudConnection = tmp->isCloudConnection;
386 tmpInfo->isSubscribing = tmp->isSubscribing;
388 copyInfo->next = tmpInfo;
395 void NSRemoveTopicNode(NSTopicLL * topicNode)
397 NS_VERIFY_NOT_NULL_V(topicNode);
399 NSOICFree(topicNode->topicName);
400 topicNode->next = NULL;
402 NSOICFree(topicNode);
405 NSTopicLL * NSCopyTopicNode(NSTopicLL * topicNode)
407 NS_VERIFY_NOT_NULL(topicNode, NULL);
409 NSTopicLL * newTopicNode = (NSTopicLL *)OICMalloc(sizeof(NSTopicLL));
410 NS_VERIFY_NOT_NULL(newTopicNode, NULL);
412 newTopicNode->topicName = OICStrdup(topicNode->topicName);
413 newTopicNode->state = topicNode->state;
414 newTopicNode->next = NULL;
419 NSResult NSInsertTopicNode(NSTopicLL * topicHead, NSTopicLL * topicNode)
421 NS_VERIFY_NOT_NULL(topicHead, NS_ERROR);
422 NS_VERIFY_NOT_NULL(topicNode, NS_ERROR);
424 NSTopicLL * iter = topicHead;
425 NSTopicLL * prev = NULL;
430 iter = (NSTopicLL *) iter->next;
433 prev->next = topicNode;
434 topicNode->next = NULL;
439 void NSRemoveTopicLL(NSTopicLL * topicHead)
441 NS_VERIFY_NOT_NULL_V(topicHead);
443 NSTopicLL * iter = topicHead;
444 NSTopicLL * following = NULL;
448 following = iter->next;
450 NSRemoveTopicNode(iter);
456 NSTopicLL * NSCopyTopicLL(NSTopicLL * topicHead)
458 NS_VERIFY_NOT_NULL(topicHead, NULL);
460 NSTopicLL * iter = topicHead;
462 NS_LOG_V(DEBUG, "[NSCopyTopicLL] Name:%s\t State:%d", iter->topicName, iter->state);
463 NSTopicLL * newTopicHead = NSCopyTopicNode(iter);
464 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newTopicHead, NULL, NSRemoveTopicLL(newTopicHead));
466 iter = (NSTopicLL *) iter->next;
470 NS_LOG_V(DEBUG, "[NSCopyTopicLL] Name:%s\t State:%d", iter->topicName, iter->state);
471 NSTopicLL * newTopicNode = NSCopyTopicNode(iter);
472 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newTopicNode, NULL, NSRemoveTopicLL(newTopicHead));
474 NSResult ret = NSInsertTopicNode(newTopicHead, newTopicNode);
475 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(ret == NS_OK ? (void *)1 : NULL,
476 NULL, NSRemoveTopicLL(newTopicHead));
478 iter = (NSTopicLL *) iter->next;
484 void NSCopyProviderPostClean(
485 NSProviderConnectionInfo * connections, NSProvider_internal * provider)
487 NSRemoveConnections(connections);
491 NSProvider_internal * NSCopyProvider_internal(NSProvider_internal * prov)
493 NS_VERIFY_NOT_NULL(prov, NULL);
495 NSProviderConnectionInfo * connections = NSCopyProviderConnections(prov->connection);
496 NS_VERIFY_NOT_NULL(connections, NULL);
498 NSProvider_internal * newProv = (NSProvider_internal *) OICMalloc(sizeof(NSProvider_internal));
499 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newProv, NULL, NSRemoveConnections(connections));
501 newProv->topicLL = NULL;
505 NSTopicLL * newTopicLL = NSCopyTopicLL(prov->topicLL);
506 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newTopicLL, NULL,
507 NSCopyProviderPostClean(connections, newProv));
509 newProv->topicLL = newTopicLL;
512 newProv->connection = connections;
513 OICStrcpy(newProv->providerId, NS_DEVICE_ID_LENGTH, prov->providerId);
514 newProv->messageUri = OICStrdup(prov->messageUri);
515 newProv->syncUri = OICStrdup(prov->syncUri);
516 newProv->topicUri = OICStrdup(prov->topicUri);
517 newProv->accessPolicy = prov->accessPolicy;
518 newProv->state = prov->state;
523 NSProvider * NSCopyProvider(NSProvider_internal * prov)
525 NS_VERIFY_NOT_NULL(prov, NULL);
527 NSProvider * newProv = (NSProvider *) OICMalloc(sizeof(NSProvider));
528 NS_VERIFY_NOT_NULL(newProv, NULL);
530 OICStrcpy(newProv->providerId, NS_DEVICE_ID_LENGTH, prov->providerId);
535 void NSRemoveProvider_internal(void * data)
537 NS_VERIFY_NOT_NULL_V(data);
539 NSProvider_internal * prov = (NSProvider_internal *) data;
541 NSOICFree(prov->messageUri);
542 NSOICFree(prov->syncUri);
543 NSOICFree(prov->topicUri);
544 NSRemoveConnections(prov->connection);
547 NSRemoveTopicLL(prov->topicLL);
553 void NSRemoveProvider(NSProvider * prov)
555 NS_VERIFY_NOT_NULL_V(prov);
559 OCStackResult NSInvokeRequest(OCDoHandle * handle,
560 OCMethod method, const OCDevAddr * addr,
561 const char * queryUrl, OCPayload * payload,
562 void * callbackFunc, void * callbackData,
563 OCClientContextDeleter cd, OCConnectivityType type)
565 int mutexRet = pthread_mutex_lock(*(NSGetStackMutex()));
566 NS_VERIFY_NOT_NULL(mutexRet != 0 ? NULL : (void *)1, OC_STACK_ERROR);
568 OCCallbackData cbdata = { NULL, NULL, NULL };
570 cbdata.cb = callbackFunc;
571 cbdata.context = callbackData;
574 OCStackResult ret = OCDoResource(handle, method, queryUrl, addr,
575 payload, type, NS_QOS, &cbdata, NULL, 0);
577 mutexRet = pthread_mutex_unlock(*(NSGetStackMutex()));
578 NS_VERIFY_NOT_NULL(mutexRet != 0 ? NULL : (void *)1, OC_STACK_ERROR);
583 bool NSOCResultToSuccess(OCStackResult ret)
588 case OC_STACK_RESOURCE_CREATED:
589 case OC_STACK_RESOURCE_DELETED:
590 case OC_STACK_PRESENCE_STOPPED:
591 case OC_STACK_CONTINUE:
592 case OC_STACK_RESOURCE_CHANGED:
595 NS_LOG_V(DEBUG, "OCStackResult : %d", (int)ret);