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 NSConsumerThread * thread = NSThreadInit(NSDiscoveredProviderFunc, (void *) provider);
135 NS_VERIFY_NOT_NULL_V(thread);
138 NSSubscriptionAcceptedCallback * NSGetSubscriptionAcceptedCb()
140 static NSSubscriptionAcceptedCallback g_acceptCb = NULL;
145 void NSSetSubscriptionAcceptedCb(NSSubscriptionAcceptedCallback cb)
147 *(NSGetSubscriptionAcceptedCb()) = cb;
150 void NSSubscriptionAccepted(NSProvider * provider)
152 (*(NSGetSubscriptionAcceptedCb()))(provider);
155 NSSyncInfoReceivedCallback * NSGetBoneNotificationSyncCb()
157 static NSSyncInfoReceivedCallback g_syncCb = NULL;
162 void NSSetNotificationSyncCb(NSSyncInfoReceivedCallback cb)
164 * NSGetBoneNotificationSyncCb() = cb;
167 void * NSNotificationSyncFunc(void * obj)
169 (* NSGetBoneNotificationSyncCb())((NSSyncInfo *) obj);
173 void NSNotificationSync(NSSyncInfo * sync)
175 NS_VERIFY_NOT_NULL_V(sync);
176 NSConsumerThread * thread = NSThreadInit(NSNotificationSyncFunc, (void *) sync);
177 NS_VERIFY_NOT_NULL_V(thread);
180 NSMessageReceivedCallback * NSGetBoneMessagePostedCb()
182 static NSMessageReceivedCallback g_postCb = NULL;
187 void NSSetMessagePostedCb(NSMessageReceivedCallback cb)
189 * NSGetBoneMessagePostedCb() = cb;
192 NSMessageReceivedCallback NSGetMessagePostedCb()
194 return * NSGetBoneMessagePostedCb();
197 void * NSMessagePostFunc(void * obj)
199 NSGetMessagePostedCb()((NSMessage *) obj);
203 void NSMessagePost(NSMessage * msg)
205 NS_VERIFY_NOT_NULL_V(msg);
206 NSConsumerThread * thread = NSThreadInit(NSMessagePostFunc, (void *) msg);
207 NS_VERIFY_NOT_NULL_V(thread);
210 NSTask * NSMakeTask(NSTaskType type, void * data)
212 NSTask * retTask = OICMalloc(sizeof(NSTask));
213 NS_VERIFY_NOT_NULL(retTask, NULL);
215 retTask->taskType = type;
216 retTask->taskData = data;
217 retTask->nextTask = NULL;
222 NSMessage_consumer * NSCopyMessage(NSMessage_consumer * msg)
224 NS_VERIFY_NOT_NULL(msg, NULL);
226 NSMessage_consumer * newMsg = (NSMessage_consumer *)OICMalloc(sizeof(NSMessage_consumer));
227 NS_VERIFY_NOT_NULL(newMsg, NULL);
229 OICStrcpy(newMsg->providerId, NS_DEVICE_ID_LENGTH, msg->providerId);
230 newMsg->i_addr = (OCDevAddr *)OICMalloc(sizeof(OCDevAddr));
231 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newMsg, NULL, OICFree(newMsg));
232 memcpy(newMsg->i_addr, msg->i_addr, sizeof(OCDevAddr));
234 newMsg->messageId = msg->messageId;
235 newMsg->title = OICStrdup(msg->title);
236 newMsg->contentText = OICStrdup(msg->contentText);
237 newMsg->sourceName = OICStrdup(msg->sourceName);
241 void NSRemoveMessage(NSMessage_consumer * msg)
244 NSOICFree(msg->title);
245 NSOICFree(msg->contentText);
246 NSOICFree(msg->sourceName);
247 NSOICFree(msg->i_addr);
252 void NSRemoveConnections(NSProviderConnectionInfo * connections)
254 NSProviderConnectionInfo * tmp = connections;
258 tmp->messageHandle = NULL;
259 tmp->syncHandle = NULL;
260 NSOICFree(tmp->addr);
264 NSOICFree(connections);
267 NSProviderConnectionInfo * NSCreateProviderConnections(OCDevAddr * inAddr)
269 NSProviderConnectionInfo * connections
270 = (NSProviderConnectionInfo *)OICMalloc(sizeof(NSProviderConnectionInfo));
271 NS_VERIFY_NOT_NULL(connections, NULL);
273 connections->addr = NULL;
274 connections->messageHandle = NULL;
275 connections->syncHandle = NULL;
276 connections->next = NULL;
280 connections->addr = (OCDevAddr *)OICMalloc(sizeof(OCDevAddr));
281 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(connections->addr, NULL, NSRemoveConnections(connections));
282 memcpy(connections->addr, inAddr, sizeof(OCDevAddr));
288 NSProviderConnectionInfo * NSCopyProviderConnections(NSProviderConnectionInfo * conn)
290 NS_VERIFY_NOT_NULL(conn, NULL);
291 NSProviderConnectionInfo * tmp = conn;
293 NSProviderConnectionInfo * retInfo = NSCreateProviderConnections(tmp->addr);
295 NSProviderConnectionInfo * copyInfo = retInfo;
299 copyInfo = NSCreateProviderConnections(tmp->addr);
300 NS_VERIFY_NOT_NULL(copyInfo, NULL);
302 copyInfo->messageHandle = tmp->messageHandle;
303 copyInfo->syncHandle = tmp->syncHandle;
305 copyInfo = copyInfo->next;
311 NSProvider_internal * NSCopyProvider(NSProvider_internal * prov)
313 NS_VERIFY_NOT_NULL(prov, NULL);
315 NSProviderConnectionInfo * connections = NSCopyProviderConnections(prov->connection);
316 NS_VERIFY_NOT_NULL(connections, NULL);
318 NSProvider_internal * newProv = (NSProvider_internal *)OICMalloc(sizeof(NSProvider_internal));
319 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newProv, NULL, NSRemoveConnections(connections));
321 newProv->connection = connections;
322 OICStrcpy(newProv->providerId, NS_DEVICE_ID_LENGTH, prov->providerId);
323 newProv->messageUri = OICStrdup(prov->messageUri);
324 newProv->syncUri = OICStrdup(prov->syncUri);
325 newProv->accessPolicy = prov->accessPolicy;
329 void NSRemoveProvider(NSProvider_internal * prov)
331 NSOICFree(prov->messageUri);
332 NSOICFree(prov->syncUri);
333 NSRemoveConnections(prov->connection);
338 OCStackResult NSInvokeRequest(OCDoHandle * handle,
339 OCMethod method, const OCDevAddr * addr,
340 const char * queryUrl, OCPayload * payload,
341 void * callbackFunc, void * callbackData, OCConnectivityType type)
343 int mutexRet = pthread_mutex_lock(*(NSGetStackMutex()));
344 NS_VERIFY_NOT_NULL(mutexRet != 0 ? NULL : (void *)1, OC_STACK_ERROR);
346 OCCallbackData cbdata = { 0, };
348 cbdata.cb = callbackFunc;
349 cbdata.context = callbackData;
352 OCStackResult ret = OCDoResource(handle, method, queryUrl, addr,
353 payload, type, NS_QOS, &cbdata, NULL, 0);
355 mutexRet = pthread_mutex_unlock(*(NSGetStackMutex()));
356 NS_VERIFY_NOT_NULL(mutexRet != 0 ? NULL : (void *)1, OC_STACK_ERROR);