1 //******************************************************************
\r
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
\r
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
7 // Licensed under the Apache License, Version 2.0 (the "License");
\r
8 // you may not use this file except in compliance with the License.
\r
9 // You may obtain a copy of the License at
\r
11 // http://www.apache.org/licenses/LICENSE-2.0
\r
13 // Unless required by applicable law or agreed to in writing, software
\r
14 // distributed under the License is distributed on an "AS IS" BASIS,
\r
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 // See the License for the specific language governing permissions and
\r
17 // limitations under the License.
\r
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
21 #include "NSConsumerService.h"
\r
23 #include "NSConsumerInterface.h"
\r
24 #include "NSMessage.h"
\r
25 #include "NSCommon.h"
\r
26 #include "NSConstants.h"
\r
27 #include "oic_string.h"
\r
28 #include "oic_malloc.h"
\r
34 void onProviderStateReceived(::NSProvider *provider, ::NSProviderState state)
\r
36 NS_LOG(DEBUG, "onNSProviderStateChanged - IN");
\r
37 NS_LOG_V(DEBUG, "provider Id : %s", provider->providerId);
\r
38 NS_LOG_V(DEBUG, "state : %d", (int)state);
\r
41 provId.assign(provider->providerId, NS_UTILS_UUID_STRING_SIZE - 1);
\r
42 NSProvider *oldProvider = NSConsumerService::getInstance()->getProvider(provId);
\r
44 if (oldProvider == nullptr)
\r
46 NSProvider *nsProvider = new NSProvider(provider);
\r
47 NS_LOG(DEBUG, "Provider with same Id do not exist. updating Data for New Provider");
\r
48 auto discoveredCallback = NSConsumerService::getInstance()->getProviderDiscoveredCb();
\r
49 nsProvider->setProviderState((NSProviderState)state);
\r
50 auto topicLL = NSConsumerGetTopicList(provider->providerId);
\r
51 nsProvider->setTopicList(new NSTopicsList(topicLL));
\r
52 if (state == NS_DISCOVERED)
\r
54 nsProvider->setProviderSubscribedState(NSProviderSubscribedState::DISCOVERED);
\r
55 if (discoveredCallback != NULL)
\r
57 NS_LOG(DEBUG, "initiating the Discovered callback : NS_DISCOVERED, policy false");
\r
58 discoveredCallback(nsProvider);
\r
61 else if (state == NS_ALLOW)
\r
63 nsProvider->setProviderSubscribedState(NSProviderSubscribedState::SUBSCRIBED);
\r
64 if (discoveredCallback != NULL)
\r
66 NS_LOG(DEBUG, "initiating the Discovered callback : NS_ALLOW, policy true");
\r
67 discoveredCallback(nsProvider);
\r
70 NSConsumerService::getInstance()->getAcceptedProviders().push_back(nsProvider);
\r
74 NS_LOG(DEBUG, "Provider with same Id exists. updating the old Provider data");
\r
75 auto changeCallback = oldProvider->getProviderStateReceivedCb();
\r
76 auto prevState = oldProvider->getProviderState();
\r
77 oldProvider->setProviderState((NSProviderState)state);
\r
78 if (state == NS_ALLOW)
\r
80 oldProvider->setProviderSubscribedState(NSProviderSubscribedState::SUBSCRIBED);
\r
81 if (changeCallback != NULL)
\r
83 NS_LOG(DEBUG, "initiating the callback for Response : NS_ALLOW");
\r
84 changeCallback((NSProviderState)state);
\r
88 oldProvider->setProviderSubscribedState(NSProviderSubscribedState::SUBSCRIBED);
\r
89 auto discoveredCallback = NSConsumerService::getInstance()->getProviderDiscoveredCb();
\r
90 discoveredCallback(oldProvider);
\r
91 auto changeCallback = oldProvider->getProviderStateReceivedCb();
\r
92 changeCallback(prevState);
\r
95 else if (state == NS_DENY)
\r
97 oldProvider->setProviderSubscribedState(NSProviderSubscribedState::DENY);
\r
98 NSConsumerService::getInstance()->getAcceptedProviders().remove(oldProvider);
\r
99 if (changeCallback != NULL)
\r
101 NS_LOG(DEBUG, "initiating the callback for Response : NS_DENY");
\r
102 changeCallback((NSProviderState)state);
\r
104 delete oldProvider;
\r
106 else if (state == NS_TOPIC)
\r
108 auto topicLL = NSConsumerGetTopicList(provider->providerId);
\r
109 oldProvider->setTopicList(new NSTopicsList(topicLL));
\r
110 if (changeCallback != NULL)
\r
112 NS_LOG(DEBUG, "initiating the callback for Response : NS_TOPIC");
\r
113 changeCallback((NSProviderState)state);
\r
117 NSTopicLL *iter = topicLL;
\r
118 NSTopicLL *following = NULL;
\r
122 following = iter->next;
\r
125 NSOICFree(iter->topicName);
\r
133 else if (state == NS_STOPPED)
\r
135 oldProvider->setProviderSubscribedState(NSProviderSubscribedState::DENY);
\r
136 NSConsumerService::getInstance()->getAcceptedProviders().remove(oldProvider);
\r
137 NS_LOG(DEBUG, "initiating the State callback : NS_STOPPED");
\r
138 if (changeCallback != NULL)
\r
140 NS_LOG(DEBUG, "initiating the callback for Response : NS_STOPPED");
\r
141 changeCallback((NSProviderState)state);
\r
145 NS_LOG(DEBUG, "onNSProviderStateChanged - OUT");
\r
148 void onNSMessageReceived(::NSMessage *message)
\r
150 NS_LOG(DEBUG, "onNSMessageReceived - IN");
\r
151 NS_LOG_V(DEBUG, "message->providerId : %s", message->providerId);
\r
153 NSMessage *nsMessage = new NSMessage(message);
\r
155 NS_LOG_V(DEBUG, "getAcceptedProviders Size : %d", (int)
\r
156 NSConsumerService::getInstance()->getAcceptedProviders().size());
\r
157 for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())
\r
159 if (it->getProviderId() == nsMessage->getProviderId())
\r
161 NS_LOG(DEBUG, "Found Provider with given ID");
\r
162 auto callback = it->getMessageReceivedCb();
\r
163 if (callback != NULL)
\r
165 NS_LOG(DEBUG, "initiating the callback for messageReceived");
\r
166 callback(nsMessage);
\r
172 NS_LOG(DEBUG, "onNSMessageReceived - OUT");
\r
175 void onNSSyncInfoReceived(::NSSyncInfo *syncInfo)
\r
177 NS_LOG(DEBUG, "onNSSyncInfoReceived - IN");
\r
178 NSSyncInfo *nsSyncInfo = new NSSyncInfo(syncInfo);
\r
179 for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())
\r
181 if (it->getProviderId() == nsSyncInfo->getProviderId())
\r
183 NS_LOG(DEBUG, "Found Provider with given ID");
\r
184 auto callback = it->getSyncInfoReceivedCb();
\r
185 if (callback != NULL)
\r
187 NS_LOG(DEBUG, "initiating the callback for SyncInfoReceived");
\r
188 callback(nsSyncInfo);
\r
194 NS_LOG(DEBUG, "onNSSyncInfoReceived - OUT");
\r
197 NSConsumerService::NSConsumerService()
\r
199 m_providerDiscoveredCb = NULL;
\r
202 NSConsumerService::~NSConsumerService()
\r
204 for (auto it : getAcceptedProviders())
\r
208 getAcceptedProviders().clear();
\r
211 NSConsumerService *NSConsumerService::getInstance()
\r
213 static NSConsumerService s_instance;
\r
214 return &s_instance;
\r
217 void NSConsumerService::start(NSConsumerService::ProviderDiscoveredCallback providerDiscovered)
\r
219 NS_LOG(DEBUG, "start - IN");
\r
220 m_providerDiscoveredCb = providerDiscovered;
\r
221 NSConsumerConfig nsConfig;
\r
222 nsConfig.changedCb = onProviderStateReceived;
\r
223 nsConfig.messageCb = onNSMessageReceived;
\r
224 nsConfig.syncInfoCb = onNSSyncInfoReceived;
\r
226 NSStartConsumer(nsConfig);
\r
227 NS_LOG(DEBUG, "start - OUT");
\r
231 void NSConsumerService::stop()
\r
233 NS_LOG(DEBUG, "stop - IN");
\r
235 for (auto it : getAcceptedProviders())
\r
239 getAcceptedProviders().clear();
\r
240 NS_LOG(DEBUG, "stop - OUT");
\r
244 NSResult NSConsumerService::enableRemoteService(const std::string &serverAddress)
\r
246 NS_LOG(DEBUG, "enableRemoteService - IN");
\r
247 NS_LOG_V(DEBUG, "Server Address : %s", serverAddress.c_str());
\r
248 NSResult result = NSResult::ERROR;
\r
250 result = (NSResult) NSConsumerEnableRemoteService(OICStrdup(serverAddress.c_str()));
\r
252 NS_LOG(ERROR, "Remote Services feature is not enabled in the Build");
\r
253 (void) serverAddress;
\r
255 NS_LOG(DEBUG, "enableRemoteService - OUT");
\r
259 void NSConsumerService::rescanProvider()
\r
261 NS_LOG(DEBUG, "rescanProvider - IN");
\r
262 NSRescanProvider();
\r
263 NS_LOG(DEBUG, "rescanProvider - OUT");
\r
267 NSConsumerService::ProviderDiscoveredCallback NSConsumerService::getProviderDiscoveredCb()
\r
269 return m_providerDiscoveredCb;
\r
272 NSProvider *NSConsumerService::getProvider(const std::string &id)
\r
274 for (auto it : getAcceptedProviders())
\r
276 if (it->getProviderId() == id)
\r
278 NS_LOG(DEBUG, "getProvider : Found Provider with given ID");
\r
282 NS_LOG(DEBUG, "getProvider : Not Found Provider with given ID");
\r
286 std::list<NSProvider *> &NSConsumerService::getAcceptedProviders()
\r
288 return m_acceptedProviders;
\r