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"
31 #include "oic_malloc.h"
32 #include "oic_string.h"
35 NSResult NSStartConsumer(NSConsumerConfig config)
37 bool isStartedConsumer = NSIsStartedConsumer();
38 NS_VERIFY_NOT_NULL(isStartedConsumer == false ? (void *) 1 : NULL, NS_OK);
40 NS_VERIFY_NOT_NULL(config.messageCb, NS_ERROR);
41 NS_VERIFY_NOT_NULL(config.syncInfoCb, NS_ERROR);
42 NS_VERIFY_NOT_NULL(config.changedCb, NS_ERROR);
44 NSSetMessagePostedCb(config.messageCb);
45 NSSetNotificationSyncCb(config.syncInfoCb);
46 NSSetProviderChangedCb(config.changedCb);
47 NSSetIsStartedConsumer(true);
49 NSResult ret = NSConsumerMessageHandlerInit();
50 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(ret == NS_OK ? (void *) 1 : NULL,
51 NS_ERROR, NSStopConsumer());
56 NSResult NSStopConsumer()
58 bool isStartedConsumer = NSIsStartedConsumer();
59 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
61 NSSetMessagePostedCb(NULL);
62 NSSetNotificationSyncCb(NULL);
63 NSSetProviderChangedCb(NULL);
64 NSSetIsStartedConsumer(false);
66 NSConsumerMessageHandlerExit();
72 NSResult NSConsumerSubscribeMQService(const char * serverAddress, const char * topicName)
74 NS_VERIFY_NOT_NULL(serverAddress, NS_ERROR);
75 NS_VERIFY_NOT_NULL(topicName, NS_ERROR);
76 bool isStartedConsumer = NSIsStartedConsumer();
77 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
79 char * queryAddr = NSGetQueryAddress(serverAddress);
80 NS_VERIFY_NOT_NULL(queryAddr, NS_ERROR);
82 NSMQTopicAddress * topicAddr = (NSMQTopicAddress *)OICMalloc(sizeof(NSMQTopicAddress));
83 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(queryAddr, NS_ERROR, NSOICFree(queryAddr));
85 topicAddr->serverAddr = queryAddr;
86 topicAddr->topicName = OICStrdup(topicName);
88 NSTask * subMQTask = NSMakeTask(TASK_MQ_REQ_SUBSCRIBE, (void *)topicAddr);
89 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(subMQTask, NS_ERROR,
91 NSOICFree(topicAddr->serverAddr);
92 NSOICFree(topicAddr->topicName)
96 return NSConsumerPushEvent(subMQTask);
100 NSResult NSConsumerEnableRemoteService(const char * serverAddress)
102 NS_VERIFY_NOT_NULL(serverAddress, NS_ERROR);
103 bool isStartedConsumer = NSIsStartedConsumer();
104 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
106 char * queryAddr = OICStrdup(serverAddress);
107 NS_VERIFY_NOT_NULL(queryAddr, NS_ERROR);
109 NSTask * discoverTask = NSMakeTask(TASK_CONSUMER_REQ_DISCOVER, (void *)queryAddr);
110 NS_VERIFY_NOT_NULL(discoverTask, NS_ERROR);
112 return NSConsumerPushEvent(discoverTask);
115 NSResult NSSubscribe(const char * providerId)
117 NS_VERIFY_NOT_NULL(providerId, NS_ERROR);
118 bool isStartedConsumer = NSIsStartedConsumer();
119 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
121 NSProvider_internal * provInternal = NSConsumerFindNSProvider(providerId);
122 NS_VERIFY_NOT_NULL(provInternal, NS_ERROR);
124 NSProvider * prov = (NSProvider *)NSCopyProvider(provInternal);
125 NSRemoveProvider_internal(provInternal);
126 NS_VERIFY_NOT_NULL(prov, NS_ERROR);
128 NSTask * subscribeTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE, (void *) prov);
129 NS_VERIFY_NOT_NULL(subscribeTask, NS_ERROR);
131 return NSConsumerPushEvent(subscribeTask);
134 NSResult NSUnsubscribe(const char * providerId)
136 NS_VERIFY_NOT_NULL(providerId, NS_ERROR);
137 bool isStartedConsumer = NSIsStartedConsumer();
138 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
140 NSProvider_internal * provInternal = NSConsumerFindNSProvider(providerId);
141 NS_VERIFY_NOT_NULL(provInternal, NS_ERROR);
143 NSProvider * prov = (NSProvider *)NSCopyProvider((NSProvider_internal *) provInternal);
144 NSRemoveProvider_internal(provInternal);
145 NS_VERIFY_NOT_NULL(prov, NS_ERROR);
147 NSTask * unsubscribeTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL, (void *) prov);
148 NS_VERIFY_NOT_NULL(unsubscribeTask, NS_ERROR);
150 return NSConsumerPushEvent(unsubscribeTask);
153 NSResult NSConsumerSendSyncInfo(const char * providerId, uint64_t messageId, NSSyncType type)
155 NS_VERIFY_NOT_NULL(providerId, NS_ERROR);
156 bool isStartedConsumer = NSIsStartedConsumer();
157 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
159 NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));
160 NS_VERIFY_NOT_NULL(syncInfo, NS_ERROR);
162 OICStrcpy(syncInfo->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, providerId);
163 syncInfo->messageId = messageId;
164 syncInfo->state = type;
166 NSTask * syncTask = NSMakeTask(TASK_MAKE_SYNCINFO, (void *) syncInfo);
167 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(syncTask, NS_ERROR, NSOICFree(syncInfo));
169 return NSConsumerPushEvent(syncTask);
172 NSResult NSRescanProvider()
174 bool isStartedConsumer = NSIsStartedConsumer();
175 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
177 NSTask * discoverTask = NSMakeTask(TASK_CONSUMER_REQ_DISCOVER, NULL);
178 NS_VERIFY_NOT_NULL(discoverTask, NS_ERROR);
180 return NSConsumerPushEvent(discoverTask);
183 NSProvider * NSConsumerGetProvider(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_VERIFY_NOT_NULL(providerId, NULL);
191 NSProvider_internal * prov = NSConsumerFindNSProvider(providerId);
192 NS_VERIFY_NOT_NULL(prov, NULL);
194 NSProvider * retProv = NSCopyProvider(prov);
195 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(retProv, NULL, NSRemoveProvider_internal(prov));
196 NSRemoveProvider_internal(prov);
201 NSTopicLL * NSConsumerGetTopicList(const char * providerId)
203 NS_VERIFY_NOT_NULL(providerId, NULL);
204 bool isStartedConsumer = NSIsStartedConsumer();
205 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NULL);
207 NS_LOG_V(INFO_PRIVATE, "NSProvider ID: %s", providerId);
208 NSProvider_internal * prov_internal = NSConsumerFindNSProvider(providerId);
209 NS_VERIFY_NOT_NULL(prov_internal, NULL);
211 NSTopicLL * retTopics = prov_internal->topicLL;
212 prov_internal->topicLL = NULL;
213 NSRemoveProvider_internal(prov_internal);
218 NSResult NSConsumerUpdateTopicList(const char * providerId, NSTopicLL * topics)
220 NS_VERIFY_NOT_NULL(providerId, NS_ERROR);
221 NS_VERIFY_NOT_NULL(topics, NS_ERROR);
222 bool isStartedConsumer = NSIsStartedConsumer();
223 NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
225 NSProvider_internal * prov_internal = NSConsumerFindNSProvider(providerId);
226 NS_VERIFY_NOT_NULL(prov_internal, NS_ERROR);
227 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(prov_internal->topicLL, NS_ERROR,
228 NSRemoveProvider_internal(prov_internal));
230 NSSelector selector = prov_internal->accessPolicy;
231 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(
232 selector == NS_SELECTION_CONSUMER ? (void *) 1 : NULL, NS_ERROR,
233 NSRemoveProvider_internal(prov_internal));
235 NSRemoveTopicLL(prov_internal->topicLL);
236 prov_internal->topicLL = NSCopyTopicLL(topics);
238 NSTask * topicTask = NSMakeTask(TASK_CONSUMER_SELECT_TOPIC_LIST, (void *) prov_internal);
239 NS_VERIFY_NOT_NULL(topicTask, NS_ERROR);
241 return NSConsumerPushEvent(topicTask);