67b7fb629463bf8de378412c04e935c429cb1610
[platform/upstream/iotivity.git] / service / notification / cpp-wrapper / consumer / src / NSConsumerService.cpp
1 //******************************************************************\r
2 //\r
3 // Copyright 2016 Samsung Electronics All Rights Reserved.\r
4 //\r
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
6 //\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
10 //\r
11 //      http://www.apache.org/licenses/LICENSE-2.0\r
12 //\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
18 //\r
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
20 \r
21 #include "NSConsumerService.h"\r
22 #include <cstring>\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
29 \r
30 namespace OIC\r
31 {\r
32     namespace Service\r
33     {\r
34         void onProviderStateReceived(::NSProvider *provider, ::NSProviderState state)\r
35         {\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
39 \r
40             std::string provId;\r
41             provId.assign(provider->providerId, NS_UTILS_UUID_STRING_SIZE - 1);\r
42             NSProvider *oldProvider = NSConsumerService::getInstance()->getProvider(provId);\r
43 \r
44             if (oldProvider == nullptr)\r
45             {\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
53                 {\r
54                     nsProvider->setProviderSubscribedState(NSProviderSubscribedState::DISCOVERED);\r
55                     if (discoveredCallback != NULL)\r
56                     {\r
57                         NS_LOG(DEBUG, "initiating the Discovered callback : NS_DISCOVERED, policy false");\r
58                         discoveredCallback(nsProvider);\r
59                     }\r
60                 }\r
61                 else if (state == NS_ALLOW)\r
62                 {\r
63                     nsProvider->setProviderSubscribedState(NSProviderSubscribedState::SUBSCRIBED);\r
64                     if (discoveredCallback != NULL)\r
65                     {\r
66                         NS_LOG(DEBUG, "initiating the Discovered callback : NS_ALLOW, policy true");\r
67                         discoveredCallback(nsProvider);\r
68                     }\r
69                 }\r
70                 NSConsumerService::getInstance()->getAcceptedProviders().push_back(nsProvider);\r
71             }\r
72             else\r
73             {\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
79                 {\r
80                     oldProvider->setProviderSubscribedState(NSProviderSubscribedState::SUBSCRIBED);\r
81                     if (changeCallback != NULL)\r
82                     {\r
83                         NS_LOG(DEBUG, "initiating the callback for Response : NS_ALLOW");\r
84                         changeCallback((NSProviderState)state);\r
85                     }\r
86                     else\r
87                     {\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
93                     }\r
94                 }\r
95                 else if (state == NS_DENY)\r
96                 {\r
97                     oldProvider->setProviderSubscribedState(NSProviderSubscribedState::DENY);\r
98                     NSConsumerService::getInstance()->getAcceptedProviders().remove(oldProvider);\r
99                     if (changeCallback != NULL)\r
100                     {\r
101                         NS_LOG(DEBUG, "initiating the callback for Response : NS_DENY");\r
102                         changeCallback((NSProviderState)state);\r
103                     }\r
104                     delete oldProvider;\r
105                 }\r
106                 else if (state == NS_TOPIC)\r
107                 {\r
108                     auto topicLL = NSConsumerGetTopicList(provider->providerId);\r
109                     oldProvider->setTopicList(new NSTopicsList(topicLL));\r
110                     if (changeCallback != NULL)\r
111                     {\r
112                         NS_LOG(DEBUG, "initiating the callback for Response : NS_TOPIC");\r
113                         changeCallback((NSProviderState)state);\r
114                     }\r
115                     if (topicLL)\r
116                     {\r
117                         NSTopicLL *iter = topicLL;\r
118                         NSTopicLL *following = NULL;\r
119 \r
120                         while (iter)\r
121                         {\r
122                             following = iter->next;\r
123                             if (iter)\r
124                             {\r
125                                 NSOICFree(iter->topicName);\r
126                                 iter->next = NULL;\r
127                                 NSOICFree(iter);\r
128                             }\r
129                             iter = following;\r
130                         }\r
131                     }\r
132                 }\r
133                 else if (state == NS_STOPPED)\r
134                 {\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
139                     {\r
140                         NS_LOG(DEBUG, "initiating the callback for Response : NS_STOPPED");\r
141                         changeCallback((NSProviderState)state);\r
142                     }\r
143                 }\r
144             }\r
145             NS_LOG(DEBUG, "onNSProviderStateChanged - OUT");\r
146         }\r
147 \r
148         void onNSMessageReceived(::NSMessage *message)\r
149         {\r
150             NS_LOG(DEBUG, "onNSMessageReceived - IN");\r
151             NS_LOG_V(DEBUG, "message->providerId : %s", message->providerId);\r
152 \r
153             NSMessage *nsMessage = new NSMessage(message);\r
154 \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
158             {\r
159                 if (it->getProviderId() == nsMessage->getProviderId())\r
160                 {\r
161                     NS_LOG(DEBUG, "Found Provider with given ID");\r
162                     auto callback = it->getMessageReceivedCb();\r
163                     if (callback != NULL)\r
164                     {\r
165                         NS_LOG(DEBUG, "initiating the callback for messageReceived");\r
166                         callback(nsMessage);\r
167                     }\r
168                     break;\r
169                 }\r
170             }\r
171             delete nsMessage;\r
172             NS_LOG(DEBUG, "onNSMessageReceived - OUT");\r
173         }\r
174 \r
175         void onNSSyncInfoReceived(::NSSyncInfo *syncInfo)\r
176         {\r
177             NS_LOG(DEBUG, "onNSSyncInfoReceived - IN");\r
178             NSSyncInfo *nsSyncInfo = new NSSyncInfo(syncInfo);\r
179             for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
180             {\r
181                 if (it->getProviderId() == nsSyncInfo->getProviderId())\r
182                 {\r
183                     NS_LOG(DEBUG, "Found Provider with given ID");\r
184                     auto callback = it->getSyncInfoReceivedCb();\r
185                     if (callback != NULL)\r
186                     {\r
187                         NS_LOG(DEBUG, "initiating the callback for SyncInfoReceived");\r
188                         callback(nsSyncInfo);\r
189                     }\r
190                     break;\r
191                 }\r
192             }\r
193             delete nsSyncInfo;\r
194             NS_LOG(DEBUG, "onNSSyncInfoReceived - OUT");\r
195         }\r
196 \r
197         NSConsumerService::NSConsumerService()\r
198         {\r
199             m_providerDiscoveredCb = NULL;\r
200         }\r
201 \r
202         NSConsumerService::~NSConsumerService()\r
203         {\r
204             for (auto it : getAcceptedProviders())\r
205             {\r
206                 delete it;\r
207             }\r
208             getAcceptedProviders().clear();\r
209         }\r
210 \r
211         NSConsumerService *NSConsumerService::getInstance()\r
212         {\r
213             static  NSConsumerService s_instance;\r
214             return &s_instance;\r
215         }\r
216 \r
217         void NSConsumerService::start(NSConsumerService::ProviderDiscoveredCallback providerDiscovered)\r
218         {\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
225 \r
226             NSStartConsumer(nsConfig);\r
227             NS_LOG(DEBUG, "start - OUT");\r
228             return;\r
229         }\r
230 \r
231         void NSConsumerService::stop()\r
232         {\r
233             NS_LOG(DEBUG, "stop - IN");\r
234             NSStopConsumer();\r
235             for (auto it : getAcceptedProviders())\r
236             {\r
237                 delete it;\r
238             }\r
239             getAcceptedProviders().clear();\r
240             NS_LOG(DEBUG, "stop - OUT");\r
241             return;\r
242         }\r
243 \r
244         NSResult NSConsumerService::enableRemoteService(const std::string &serverAddress)\r
245         {\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
249 #ifdef WITH_CLOUD\r
250             result = (NSResult) NSConsumerEnableRemoteService(OICStrdup(serverAddress.c_str()));\r
251 #else\r
252             NS_LOG(ERROR, "Remote Services feature is not enabled in the Build");\r
253             (void) serverAddress;\r
254 #endif\r
255             NS_LOG(DEBUG, "enableRemoteService - OUT");\r
256             return result;\r
257         }\r
258 \r
259         void NSConsumerService::rescanProvider()\r
260         {\r
261             NS_LOG(DEBUG, "rescanProvider - IN");\r
262             NSRescanProvider();\r
263             NS_LOG(DEBUG, "rescanProvider - OUT");\r
264             return;\r
265         }\r
266 \r
267         NSConsumerService::ProviderDiscoveredCallback NSConsumerService::getProviderDiscoveredCb()\r
268         {\r
269             return m_providerDiscoveredCb;\r
270         }\r
271 \r
272         NSProvider *NSConsumerService::getProvider(const std::string &id)\r
273         {\r
274             for (auto it : getAcceptedProviders())\r
275             {\r
276                 if (it->getProviderId() == id)\r
277                 {\r
278                     NS_LOG(DEBUG, "getProvider : Found Provider with given ID");\r
279                     return it;\r
280                 }\r
281             }\r
282             NS_LOG(DEBUG, "getProvider : Not Found Provider with given ID");\r
283             return NULL;\r
284         }\r
285 \r
286         std::list<NSProvider *> &NSConsumerService::getAcceptedProviders()\r
287         {\r
288             return m_acceptedProviders;\r
289         }\r
290     }\r
291 }\r