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 NSProvider * retProvider = (NSProvider *)NSCopyProvider((NSProvider_internal *)provider);
137 NS_VERIFY_NOT_NULL_V(retProvider);
139 NSConsumerThread * thread = NSThreadInit(NSDiscoveredProviderFunc, (void *) retProvider);
140 NS_VERIFY_NOT_NULL_V(thread);
143 NSProviderChangedCallback * NSGetProviderChangedCb()
145 static NSProviderChangedCallback g_changedCb = NULL;
147 return & g_changedCb;
150 void NSSetProviderChangedCb(NSProviderChangedCallback cb)
152 *(NSGetProviderChangedCb()) = cb;
155 void NSProviderChanged(NSProvider * provider, NSResponse response)
157 (*(NSGetProviderChangedCb()))(provider, response);
160 NSSyncInfoReceivedCallback * NSGetBoneNotificationSyncCb()
162 static NSSyncInfoReceivedCallback g_syncCb = NULL;
167 void NSSetNotificationSyncCb(NSSyncInfoReceivedCallback cb)
169 * NSGetBoneNotificationSyncCb() = cb;
172 void * NSNotificationSyncFunc(void * obj)
174 (* NSGetBoneNotificationSyncCb())((NSSyncInfo *) obj);
178 void NSNotificationSync(NSSyncInfo * sync)
180 NS_VERIFY_NOT_NULL_V(sync);
182 NSSyncInfo * retSync = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));
183 NS_VERIFY_NOT_NULL_V(retSync);
184 memcpy(retSync, sync, sizeof(NSSyncInfo));
186 NSConsumerThread * thread = NSThreadInit(NSNotificationSyncFunc, (void *) retSync);
187 NS_VERIFY_NOT_NULL_V(thread);
190 NSMessageReceivedCallback * NSGetBoneMessagePostedCb()
192 static NSMessageReceivedCallback g_postCb = NULL;
197 void NSSetMessagePostedCb(NSMessageReceivedCallback cb)
199 * NSGetBoneMessagePostedCb() = cb;
202 NSMessageReceivedCallback NSGetMessagePostedCb()
204 return * NSGetBoneMessagePostedCb();
207 void * NSMessagePostFunc(void * obj)
209 NSGetMessagePostedCb()((NSMessage *) obj);
213 void NSMessagePost(NSMessage * msg)
215 NS_VERIFY_NOT_NULL_V(msg);
217 NSMessage * retMsg = NSCopyMessage(msg);
218 NS_VERIFY_NOT_NULL_V(retMsg);
220 NSConsumerThread * thread = NSThreadInit(NSMessagePostFunc, (void *) retMsg);
221 NS_VERIFY_NOT_NULL_V(thread);
224 NSTask * NSMakeTask(NSTaskType type, void * data)
226 NSTask * retTask = OICMalloc(sizeof(NSTask));
227 NS_VERIFY_NOT_NULL(retTask, NULL);
229 retTask->taskType = type;
230 retTask->taskData = data;
231 retTask->nextTask = NULL;
236 NSMessage * NSCopyMessage(NSMessage * msg)
238 NS_VERIFY_NOT_NULL(msg, NULL);
240 NSMessage * newMsg = (NSMessage *)OICMalloc(sizeof(NSMessage));
241 NS_VERIFY_NOT_NULL(newMsg, NULL);
243 OICStrcpy(newMsg->providerId, NS_DEVICE_ID_LENGTH, msg->providerId);
245 newMsg->messageId = msg->messageId;
246 newMsg->title = OICStrdup(msg->title);
247 newMsg->contentText = OICStrdup(msg->contentText);
248 newMsg->sourceName = OICStrdup(msg->sourceName);
249 newMsg->dateTime = OICStrdup(msg->dateTime);
250 newMsg->type = msg->type;
252 // TODO change to copy function.
253 newMsg->mediaContents = msg->mediaContents;
257 void NSRemoveMessage(NSMessage * msg)
259 NS_VERIFY_NOT_NULL_V(msg);
262 NSOICFree(msg->title);
263 NSOICFree(msg->contentText);
264 NSOICFree(msg->sourceName);
265 NSOICFree(msg->dateTime);
267 // TODO change to remove function.
268 NSOICFree(msg->mediaContents);
273 void NSRemoveConnections(NSProviderConnectionInfo * connections)
275 NS_VERIFY_NOT_NULL_V(connections);
277 NSProviderConnectionInfo * tmp = connections;
281 tmp->messageHandle = NULL;
282 tmp->syncHandle = NULL;
283 NSOICFree(tmp->addr);
287 NSOICFree(connections);
290 NSProviderConnectionInfo * NSCreateProviderConnections(OCDevAddr * inAddr)
292 NSProviderConnectionInfo * connections
293 = (NSProviderConnectionInfo *)OICMalloc(sizeof(NSProviderConnectionInfo));
294 NS_VERIFY_NOT_NULL(connections, NULL);
296 connections->addr = NULL;
297 connections->messageHandle = NULL;
298 connections->syncHandle = NULL;
299 connections->isCloudConnection = false;
300 connections->isSubscribing = false;
301 connections->next = NULL;
305 connections->addr = (OCDevAddr *)OICMalloc(sizeof(OCDevAddr));
306 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(connections->addr, NULL, NSRemoveConnections(connections));
307 memcpy(connections->addr, inAddr, sizeof(OCDevAddr));
313 NSProviderConnectionInfo * NSCopyProviderConnections(NSProviderConnectionInfo * conn)
315 NS_VERIFY_NOT_NULL(conn, NULL);
316 NSProviderConnectionInfo * tmp = conn;
318 NSProviderConnectionInfo * retInfo = NSCreateProviderConnections(tmp->addr);
319 NS_VERIFY_NOT_NULL(retInfo, NULL);
321 NSProviderConnectionInfo * copyInfo = retInfo;
325 copyInfo = NSCreateProviderConnections(tmp->addr);
326 NS_VERIFY_NOT_NULL(copyInfo, NULL);
328 copyInfo->messageHandle = tmp->messageHandle;
329 copyInfo->syncHandle = tmp->syncHandle;
330 copyInfo->isCloudConnection = tmp->isCloudConnection;
331 copyInfo->isSubscribing = tmp->isSubscribing;
333 copyInfo = copyInfo->next;
339 void NSRemoveProviderTopicList(NSTopicList * topicList, size_t dimensionSize)
341 NS_VERIFY_NOT_NULL_V(topicList);
343 for (int i = -1; i < (int)dimensionSize; i++)
345 NSOICFree(topicList->topics[i]);
347 NSOICFree(topicList);
350 NSTopicList * NSCopyProviderTopicList(NSTopicList * topicList, size_t dimensionSize)
352 NS_VERIFY_NOT_NULL(topicList, NULL);
354 NSTopicList * newTopicList = (NSTopicList *)OICMalloc(sizeof(NSTopicList));
355 NS_VERIFY_NOT_NULL(newTopicList, NULL);
357 OICStrcpy(newTopicList->consumerId, NS_DEVICE_ID_LENGTH, topicList->consumerId);
359 newTopicList->topics = (NSTopics **) OICMalloc(sizeof(NSTopics *)*dimensionSize);
360 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newTopicList->topics,
361 NULL, NSRemoveProviderTopicList(newTopicList, -1));
363 for (int i = 0; i < (int)dimensionSize; i++)
365 newTopicList->topics[i] = (NSTopics *) OICMalloc(sizeof(NSTopics));
366 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newTopicList->topics[i],
367 NULL, NSRemoveProviderTopicList(newTopicList, i));
369 newTopicList->topics[i]->topicName = OICStrdup(topicList->topics[i]->topicName);
370 newTopicList->topics[i]->state = topicList->topics[i]->state;
376 void NSCopyProviderPostClean(
377 NSProviderConnectionInfo * connections, NSProvider_internal * provider)
379 NSRemoveConnections(connections);
383 NSProvider_internal * NSCopyProvider(NSProvider_internal * prov)
385 NS_VERIFY_NOT_NULL(prov, NULL);
387 NSProviderConnectionInfo * connections = NSCopyProviderConnections(prov->connection);
388 NS_VERIFY_NOT_NULL(connections, NULL);
390 NSProvider_internal * newProv = (NSProvider_internal *) OICMalloc(sizeof(NSProvider_internal));
391 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newProv, NULL, NSRemoveConnections(connections));
393 newProv->topicList = NULL;
394 newProv->topicListSize = 0;
398 NSTopicList * topicList = NSCopyProviderTopicList(prov->topicList, prov->topicListSize);
399 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(topicList, NULL,
400 NSCopyProviderPostClean(connections, newProv));
402 newProv->topicList = topicList;
403 newProv->topicListSize = prov->topicListSize;
406 newProv->connection = connections;
407 OICStrcpy(newProv->providerId, NS_DEVICE_ID_LENGTH, prov->providerId);
408 newProv->messageUri = OICStrdup(prov->messageUri);
409 newProv->syncUri = OICStrdup(prov->syncUri);
410 newProv->topicUri = OICStrdup(prov->topicUri);
411 newProv->accessPolicy = prov->accessPolicy;
416 void NSRemoveProvider(NSProvider_internal * prov)
418 NS_VERIFY_NOT_NULL_V(prov);
420 NSOICFree(prov->messageUri);
421 NSOICFree(prov->syncUri);
422 NSOICFree(prov->topicUri);
423 NSRemoveConnections(prov->connection);
424 NSRemoveProviderTopicList(prov->topicList, prov->topicListSize);
429 NSSyncInfo_internal * NSCopySyncInfo(NSSyncInfo_internal * syncInfo)
431 NS_VERIFY_NOT_NULL(syncInfo, NULL);
433 NSProviderConnectionInfo * connections = NSCopyProviderConnections(syncInfo->connection);
434 NS_VERIFY_NOT_NULL(connections, NULL);
436 NSSyncInfo_internal * newSyncInfo = (NSSyncInfo_internal *)OICMalloc(sizeof(NSSyncInfo_internal));
437 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newSyncInfo, NULL, NSRemoveConnections(connections));
439 OICStrcpy(newSyncInfo->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, syncInfo->providerId);
440 newSyncInfo->messageId = syncInfo->messageId;
441 newSyncInfo->state = syncInfo->state;
442 newSyncInfo->connection = connections;
447 void NSRemoveSyncInfo(NSSyncInfo_internal * syncInfo)
449 NS_VERIFY_NOT_NULL_V(syncInfo);
451 NSRemoveConnections(syncInfo->connection);
456 OCStackResult NSInvokeRequest(OCDoHandle * handle,
457 OCMethod method, const OCDevAddr * addr,
458 const char * queryUrl, OCPayload * payload,
459 void * callbackFunc, void * callbackData, OCConnectivityType type)
461 int mutexRet = pthread_mutex_lock(*(NSGetStackMutex()));
462 NS_VERIFY_NOT_NULL(mutexRet != 0 ? NULL : (void *)1, OC_STACK_ERROR);
464 OCCallbackData cbdata = { 0, };
466 cbdata.cb = callbackFunc;
467 cbdata.context = callbackData;
470 OCStackResult ret = OCDoResource(handle, method, queryUrl, addr,
471 payload, type, NS_QOS, &cbdata, NULL, 0);
473 mutexRet = pthread_mutex_unlock(*(NSGetStackMutex()));
474 NS_VERIFY_NOT_NULL(mutexRet != 0 ? NULL : (void *)1, OC_STACK_ERROR);
479 bool NSOCResultToSuccess(OCStackResult ret)
484 case OC_STACK_RESOURCE_CREATED:
485 case OC_STACK_RESOURCE_DELETED:
486 case OC_STACK_CONTINUE:
487 case OC_STACK_RESOURCE_CHANGED: