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 "NSConsumerInterface.h"
27 #include "NSConsumerCommon.h"
28 #include "NSConstants.h"
29 #include "NSConsumerScheduler.h"
30 #include "oic_malloc.h"
31 #include "oic_string.h"
34 NSResult NSStartConsumer(NSConsumerConfig config)
36 bool isStartedConsumer = NSIsStartedConsumer();
37 NS_VERIFY_NOT_NULL(isStartedConsumer == false ? (void *) 1 : NULL, NS_OK);
39 NS_VERIFY_NOT_NULL(config.messageCb, NS_ERROR);
40 NS_VERIFY_NOT_NULL(config.syncInfoCb, NS_ERROR);
41 NS_VERIFY_NOT_NULL(config.changedCb, NS_ERROR);
43 NSSetMessagePostedCb(config.messageCb);
44 NSSetNotificationSyncCb(config.syncInfoCb);
45 NSSetProviderChangedCb(config.changedCb);
46 NSSetIsStartedConsumer(true);
48 NSResult ret = NSConsumerMessageHandlerInit();
49 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(ret == NS_OK ? (void *) 1 : NULL,
50 NS_ERROR, NSStopConsumer());
55 NSResult NSStopConsumer()
57 bool isStartedConsumer = NSIsStartedConsumer();
58 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
60 NSSetMessagePostedCb(NULL);
61 NSSetNotificationSyncCb(NULL);
62 NSSetProviderChangedCb(NULL);
63 NSSetIsStartedConsumer(false);
65 NSConsumerMessageHandlerExit();
70 NSResult NSConsumerEnableRemoteService(const char *serverAddress)
72 NS_VERIFY_NOT_NULL(serverAddress, NS_ERROR);
73 bool isStartedConsumer = NSIsStartedConsumer();
74 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
76 char * queryAddr = NULL;
77 if (strstr(serverAddress, "coap+tcp://"))
79 queryAddr = OICStrdup(serverAddress+11);
81 else if (strstr(serverAddress, "coap://"))
83 queryAddr = OICStrdup(serverAddress+7);
87 queryAddr = OICStrdup(serverAddress);
89 NS_VERIFY_NOT_NULL(queryAddr, NS_ERROR);
91 NSTask * discoverTask = NSMakeTask(TASK_CONSUMER_REQ_DISCOVER, (void *)queryAddr);
92 NS_VERIFY_NOT_NULL(discoverTask, NS_ERROR);
94 return NSConsumerPushEvent(discoverTask);
97 NSResult NSSubscribe(const char * providerId)
99 NS_VERIFY_NOT_NULL(providerId, NS_ERROR);
100 bool isStartedConsumer = NSIsStartedConsumer();
101 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
103 NSProvider_internal * provInternal = NSConsumerFindNSProvider(providerId);
104 NS_VERIFY_NOT_NULL(provInternal, NS_ERROR);
106 NSProvider * prov = (NSProvider *)NSCopyProvider(provInternal);
107 NSRemoveProvider_internal(provInternal);
108 NS_VERIFY_NOT_NULL(prov, NS_ERROR);
110 NSTask * subscribeTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE, (void *) prov);
111 NS_VERIFY_NOT_NULL(subscribeTask, NS_ERROR);
113 return NSConsumerPushEvent(subscribeTask);
116 NSResult NSUnsubscribe(const char * providerId)
118 NS_VERIFY_NOT_NULL(providerId, NS_ERROR);
119 bool isStartedConsumer = NSIsStartedConsumer();
120 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
122 NSProvider_internal * provInternal = NSConsumerFindNSProvider(providerId);
123 NS_VERIFY_NOT_NULL(provInternal, NS_ERROR);
125 NSProvider * prov = (NSProvider *)NSCopyProvider((NSProvider_internal *) provInternal);
126 NSRemoveProvider_internal(provInternal);
127 NS_VERIFY_NOT_NULL(prov, NS_ERROR);
129 NSTask * unsubscribeTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL, (void *) prov);
130 NS_VERIFY_NOT_NULL(unsubscribeTask, NS_ERROR);
132 return NSConsumerPushEvent(unsubscribeTask);
135 NSResult NSConsumerSendSyncInfo(const char * providerId, uint64_t messageId, NSSyncType type)
137 NS_VERIFY_NOT_NULL(providerId, NS_ERROR);
138 bool isStartedConsumer = NSIsStartedConsumer();
139 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
141 NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));
142 NS_VERIFY_NOT_NULL(syncInfo, NS_ERROR);
144 OICStrcpy(syncInfo->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, providerId);
145 syncInfo->messageId = messageId;
146 syncInfo->state = type;
148 NSTask * syncTask = NSMakeTask(TASK_MAKE_SYNCINFO, (void *) syncInfo);
149 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(syncTask, NS_ERROR, NSOICFree(syncInfo));
151 return NSConsumerPushEvent(syncTask);
154 NSResult NSRescanProvider()
156 bool isStartedConsumer = NSIsStartedConsumer();
157 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
159 NSTask * discoverTask = NSMakeTask(TASK_CONSUMER_REQ_DISCOVER, NULL);
160 NS_VERIFY_NOT_NULL(discoverTask, NS_ERROR);
162 return NSConsumerPushEvent(discoverTask);
165 NSProvider * NSConsumerGetProvider(const char * providerId)
167 NS_VERIFY_NOT_NULL(providerId, NULL);
168 bool isStartedConsumer = NSIsStartedConsumer();
169 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NULL);
171 NS_VERIFY_NOT_NULL(providerId, NULL);
173 NSProvider_internal * prov = NSConsumerFindNSProvider(providerId);
174 NS_VERIFY_NOT_NULL(prov, NULL);
176 NSProvider * retProv = NSCopyProvider(prov);
177 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(retProv, NULL, NSRemoveProvider_internal(prov));
178 NSRemoveProvider_internal(prov);
183 NSTopicLL * NSConsumerGetTopicList(const char * providerId)
185 NS_VERIFY_NOT_NULL(providerId, NULL);
186 bool isStartedConsumer = NSIsStartedConsumer();
187 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NULL);
189 NS_LOG_V(DEBUG, "NSProvider ID: %s", providerId);
190 NSProvider_internal * prov_internal = NSConsumerFindNSProvider(providerId);
191 NS_VERIFY_NOT_NULL(prov_internal, NULL);
193 NSTopicLL * retTopics = prov_internal->topicLL;
194 prov_internal->topicLL = NULL;
195 NSRemoveProvider_internal(prov_internal);
200 NSResult NSConsumerUpdateTopicList(const char * providerId, NSTopicLL * topics)
202 NS_VERIFY_NOT_NULL(providerId, NS_ERROR);
203 NS_VERIFY_NOT_NULL(topics, NS_ERROR);
204 bool isStartedConsumer = NSIsStartedConsumer();
205 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
207 NSProvider_internal * prov_internal = NSConsumerFindNSProvider(providerId);
208 NS_VERIFY_NOT_NULL(prov_internal, NS_ERROR);
209 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(prov_internal->topicLL, NS_ERROR,
210 NSRemoveProvider_internal(prov_internal));
212 NSSelector selector = prov_internal->accessPolicy;
213 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(
214 selector == NS_SELECTION_CONSUMER ? (void *) 1 : NULL, NS_ERROR,
215 NSRemoveProvider_internal(prov_internal));
217 NSRemoveTopicLL(prov_internal->topicLL);
218 prov_internal->topicLL = NSCopyTopicLL(topics);
220 NSTask * topicTask = NSMakeTask(TASK_CONSUMER_SELECT_TOPIC_LIST, (void *) prov_internal);
221 NS_VERIFY_NOT_NULL(topicTask, NS_ERROR);
223 return NSConsumerPushEvent(topicTask);