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 NSProviderStateCallback * NSGetProviderChangedCb()
110 static NSProviderStateCallback g_changedCb = NULL;
112 return & g_changedCb;
115 void NSSetProviderChangedCb(NSProviderStateCallback cb)
117 *(NSGetProviderChangedCb()) = cb;
122 NSProvider * provider;
123 NSProviderState state;
124 } NSProviderChangedData;
126 void * NSProviderChangedFunc(void * obj)
128 NSProviderChangedData * data = (NSProviderChangedData *) obj;
129 (*(NSGetProviderChangedCb()))(data->provider, data->state);
134 void NSProviderChanged(NSProvider * provider, NSProviderState response)
136 NS_VERIFY_NOT_NULL_V(provider);
138 NSProvider * retProvider = NSCopyProvider((NSProvider_internal *) provider);
139 NS_VERIFY_NOT_NULL_V(retProvider);
141 NSProviderChangedData * data =
142 (NSProviderChangedData *)OICMalloc(sizeof(NSProviderChangedData));
143 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(data, NSRemoveProvider(retProvider));
145 data->provider = retProvider;
146 data->state = response;
148 NSConsumerThread * thread = NSThreadInit(NSProviderChangedFunc, (void *) data);
149 NS_VERIFY_NOT_NULL_V(thread);
152 NSSyncInfoReceivedCallback * NSGetBoneNotificationSyncCb()
154 static NSSyncInfoReceivedCallback g_syncCb = NULL;
159 void NSSetNotificationSyncCb(NSSyncInfoReceivedCallback cb)
161 * NSGetBoneNotificationSyncCb() = cb;
164 void * NSNotificationSyncFunc(void * obj)
166 (* NSGetBoneNotificationSyncCb())((NSSyncInfo *) obj);
170 void NSNotificationSync(NSSyncInfo * sync)
172 NS_VERIFY_NOT_NULL_V(sync);
174 NSSyncInfo * retSync = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));
175 NS_VERIFY_NOT_NULL_V(retSync);
176 memcpy(retSync, sync, sizeof(NSSyncInfo));
178 NSConsumerThread * thread = NSThreadInit(NSNotificationSyncFunc, (void *) retSync);
179 NS_VERIFY_NOT_NULL_V(thread);
182 NSMessageReceivedCallback * NSGetBoneMessagePostedCb()
184 static NSMessageReceivedCallback g_postCb = NULL;
189 void NSSetMessagePostedCb(NSMessageReceivedCallback cb)
191 * NSGetBoneMessagePostedCb() = cb;
194 NSMessageReceivedCallback NSGetMessagePostedCb()
196 return * NSGetBoneMessagePostedCb();
199 void * NSMessagePostFunc(void * obj)
201 NSGetMessagePostedCb()((NSMessage *) obj);
205 void NSMessagePost(NSMessage * msg)
207 NS_VERIFY_NOT_NULL_V(msg);
209 NSMessage * retMsg = NSCopyMessage(msg);
210 NS_VERIFY_NOT_NULL_V(retMsg);
212 NSConsumerThread * thread = NSThreadInit(NSMessagePostFunc, (void *) retMsg);
213 NS_VERIFY_NOT_NULL_V(thread);
216 NSTask * NSMakeTask(NSTaskType type, void * data)
218 NSTask * retTask = OICMalloc(sizeof(NSTask));
219 NS_VERIFY_NOT_NULL(retTask, NULL);
221 retTask->taskType = type;
222 retTask->taskData = data;
223 retTask->nextTask = NULL;
228 NSMessage * NSCopyMessage(NSMessage * msg)
230 NS_VERIFY_NOT_NULL(msg, NULL);
232 NSMessage * newMsg = (NSMessage *)OICMalloc(sizeof(NSMessage));
233 NS_VERIFY_NOT_NULL(newMsg, NULL);
235 OICStrcpy(newMsg->providerId, NS_DEVICE_ID_LENGTH, msg->providerId);
237 newMsg->messageId = msg->messageId;
238 newMsg->title = OICStrdup(msg->title);
239 newMsg->contentText = OICStrdup(msg->contentText);
240 newMsg->sourceName = OICStrdup(msg->sourceName);
241 newMsg->dateTime = OICStrdup(msg->dateTime);
242 newMsg->type = msg->type;
243 newMsg->topic = NULL;
244 if (msg->topic && strlen(msg->topic) > 0)
246 newMsg->topic = OICStrdup(msg->topic);
248 if (msg->mediaContents)
250 newMsg->mediaContents = (NSMediaContents *)OICMalloc(sizeof(NSMediaContents));
251 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(
252 newMsg->mediaContents, NULL, NSRemoveMessage(newMsg));
253 newMsg->mediaContents->iconImage =
254 (char *)OICMalloc(sizeof(char)*strlen(msg->mediaContents->iconImage));
255 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(
256 newMsg->mediaContents->iconImage, NULL, NSRemoveMessage(newMsg));
257 memcpy(newMsg->mediaContents->iconImage, msg->mediaContents->iconImage,
258 strlen(msg->mediaContents->iconImage));
263 void NSRemoveMessage(NSMessage * msg)
265 NS_VERIFY_NOT_NULL_V(msg);
268 NSOICFree(msg->title);
269 NSOICFree(msg->contentText);
270 NSOICFree(msg->sourceName);
271 NSOICFree(msg->dateTime);
272 NSOICFree(msg->topic);
274 if (msg->mediaContents)
276 NSOICFree(msg->mediaContents->iconImage);
278 NSOICFree(msg->mediaContents);
283 void NSRemoveConnections(NSProviderConnectionInfo * connections)
285 NS_VERIFY_NOT_NULL_V(connections);
287 NSProviderConnectionInfo * tmp = connections;
291 tmp->messageHandle = NULL;
292 tmp->syncHandle = NULL;
293 NSOICFree(tmp->addr);
297 NSOICFree(connections);
300 NSProviderConnectionInfo * NSCreateProviderConnections(OCDevAddr * inAddr)
302 NSProviderConnectionInfo * connections
303 = (NSProviderConnectionInfo *)OICMalloc(sizeof(NSProviderConnectionInfo));
304 NS_VERIFY_NOT_NULL(connections, NULL);
306 connections->addr = NULL;
307 connections->messageHandle = NULL;
308 connections->syncHandle = NULL;
309 connections->isCloudConnection = false;
310 connections->isSubscribing = false;
311 connections->next = NULL;
315 connections->addr = (OCDevAddr *)OICMalloc(sizeof(OCDevAddr));
316 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(connections->addr, NULL, NSRemoveConnections(connections));
317 memcpy(connections->addr, inAddr, sizeof(OCDevAddr));
323 NSProviderConnectionInfo * NSCopyProviderConnections(NSProviderConnectionInfo * conn)
325 NS_VERIFY_NOT_NULL(conn, NULL);
326 NSProviderConnectionInfo * tmp = conn;
328 NSProviderConnectionInfo * retInfo = NSCreateProviderConnections(tmp->addr);
329 NS_VERIFY_NOT_NULL(retInfo, NULL);
330 retInfo->messageHandle = tmp->messageHandle;
331 retInfo->syncHandle = tmp->syncHandle;
332 retInfo->isCloudConnection = tmp->isCloudConnection;
333 retInfo->isSubscribing = tmp->isSubscribing;
336 NSProviderConnectionInfo * copyInfo = retInfo;
340 NSProviderConnectionInfo * tmpInfo = NSCreateProviderConnections(tmp->addr);
341 NS_VERIFY_NOT_NULL(tmpInfo, NULL);
343 tmpInfo->messageHandle = tmp->messageHandle;
344 tmpInfo->syncHandle = tmp->syncHandle;
345 tmpInfo->isCloudConnection = tmp->isCloudConnection;
346 tmpInfo->isSubscribing = tmp->isSubscribing;
348 copyInfo->next = tmpInfo;
355 void NSRemoveTopicNode(NSTopicLL * topicNode)
357 NS_VERIFY_NOT_NULL_V(topicNode);
359 NSOICFree(topicNode->topicName);
360 topicNode->next = NULL;
362 NSOICFree(topicNode);
365 NSTopicLL * NSCopyTopicNode(NSTopicLL * topicNode)
367 NS_VERIFY_NOT_NULL(topicNode, NULL);
369 NSTopicLL * newTopicNode = (NSTopicLL *)OICMalloc(sizeof(NSTopicLL));
370 NS_VERIFY_NOT_NULL(newTopicNode, NULL);
372 newTopicNode->topicName = OICStrdup(topicNode->topicName);
373 newTopicNode->state = topicNode->state;
374 newTopicNode->next = NULL;
379 NSResult NSInsertTopicNode(NSTopicLL * topicHead, NSTopicLL * topicNode)
381 NS_VERIFY_NOT_NULL(topicHead, NS_ERROR);
382 NS_VERIFY_NOT_NULL(topicNode, NS_ERROR);
384 NSTopicLL * iter = topicHead;
385 NSTopicLL * prev = NULL;
390 iter = (NSTopicLL *) iter->next;
393 prev->next = topicNode;
394 topicNode->next = NULL;
399 void NSRemoveTopicLL(NSTopicLL * topicHead)
401 NS_VERIFY_NOT_NULL_V(topicHead);
403 NSTopicLL * iter = topicHead;
404 NSTopicLL * following = NULL;
408 following = iter->next;
410 NSRemoveTopicNode(iter);
416 NSTopicLL * NSCopyTopicLL(NSTopicLL * topicHead)
418 NS_VERIFY_NOT_NULL(topicHead, NULL);
420 NSTopicLL * iter = topicHead;
422 NS_LOG_V(DEBUG, "[NSCopyTopicLL] Name:%s\t State:%d", iter->topicName, iter->state);
423 NSTopicLL * newTopicHead = NSCopyTopicNode(iter);
424 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newTopicHead, NULL, NSRemoveTopicLL(newTopicHead));
426 iter = (NSTopicLL *) iter->next;
430 NS_LOG_V(DEBUG, "[NSCopyTopicLL] Name:%s\t State:%d", iter->topicName, iter->state);
431 NSTopicLL * newTopicNode = NSCopyTopicNode(iter);
432 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newTopicNode, NULL, NSRemoveTopicLL(newTopicHead));
434 NSResult ret = NSInsertTopicNode(newTopicHead, newTopicNode);
435 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(ret == NS_OK ? (void *)1 : NULL,
436 NULL, NSRemoveTopicLL(newTopicHead));
438 iter = (NSTopicLL *) iter->next;
444 void NSCopyProviderPostClean(
445 NSProviderConnectionInfo * connections, NSProvider_internal * provider)
447 NSRemoveConnections(connections);
451 NSProvider_internal * NSCopyProvider_internal(NSProvider_internal * prov)
453 NS_VERIFY_NOT_NULL(prov, NULL);
455 NSProviderConnectionInfo * connections = NSCopyProviderConnections(prov->connection);
456 NS_VERIFY_NOT_NULL(connections, NULL);
458 NSProvider_internal * newProv = (NSProvider_internal *) OICMalloc(sizeof(NSProvider_internal));
459 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newProv, NULL, NSRemoveConnections(connections));
461 newProv->topicLL = NULL;
465 NSTopicLL * newTopicLL = NSCopyTopicLL(prov->topicLL);
466 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newTopicLL, NULL,
467 NSCopyProviderPostClean(connections, newProv));
469 newProv->topicLL = newTopicLL;
472 newProv->connection = connections;
473 OICStrcpy(newProv->providerId, NS_DEVICE_ID_LENGTH, prov->providerId);
474 newProv->messageUri = OICStrdup(prov->messageUri);
475 newProv->syncUri = OICStrdup(prov->syncUri);
476 newProv->topicUri = OICStrdup(prov->topicUri);
477 newProv->accessPolicy = prov->accessPolicy;
478 newProv->state = prov->state;
483 NSProvider * NSCopyProvider(NSProvider_internal * prov)
485 NS_VERIFY_NOT_NULL(prov, NULL);
487 NSProvider * newProv = (NSProvider *) OICMalloc(sizeof(NSProvider));
488 NS_VERIFY_NOT_NULL(newProv, NULL);
490 OICStrcpy(newProv->providerId, NS_DEVICE_ID_LENGTH, prov->providerId);
495 void NSRemoveProvider_internal(NSProvider_internal * prov)
497 NS_VERIFY_NOT_NULL_V(prov);
499 NSOICFree(prov->messageUri);
500 NSOICFree(prov->syncUri);
501 NSOICFree(prov->topicUri);
502 NSRemoveConnections(prov->connection);
505 NSRemoveTopicLL(prov->topicLL);
511 void NSRemoveProvider(NSProvider * prov)
513 NS_VERIFY_NOT_NULL_V(prov);
517 OCStackResult NSInvokeRequest(OCDoHandle * handle,
518 OCMethod method, const OCDevAddr * addr,
519 const char * queryUrl, OCPayload * payload,
520 void * callbackFunc, void * callbackData, OCConnectivityType type)
522 int mutexRet = pthread_mutex_lock(*(NSGetStackMutex()));
523 NS_VERIFY_NOT_NULL(mutexRet != 0 ? NULL : (void *)1, OC_STACK_ERROR);
525 OCCallbackData cbdata = { 0, };
527 cbdata.cb = callbackFunc;
528 cbdata.context = callbackData;
531 OCStackResult ret = OCDoResource(handle, method, queryUrl, addr,
532 payload, type, NS_QOS, &cbdata, NULL, 0);
534 mutexRet = pthread_mutex_unlock(*(NSGetStackMutex()));
535 NS_VERIFY_NOT_NULL(mutexRet != 0 ? NULL : (void *)1, OC_STACK_ERROR);
540 bool NSOCResultToSuccess(OCStackResult ret)
545 case OC_STACK_RESOURCE_CREATED:
546 case OC_STACK_RESOURCE_DELETED:
547 case OC_STACK_PRESENCE_STOPPED:
548 case OC_STACK_CONTINUE:
549 case OC_STACK_RESOURCE_CHANGED:
552 NS_LOG_V(DEBUG, "OCStackResult : %d", (int)ret);