Fix bug for can not callback on consumer cpp layer.
[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 \r
29 namespace OIC\r
30 {\r
31     namespace Service\r
32     {\r
33         void onProviderStateReceived(::NSProvider *provider, ::NSProviderState state)\r
34         {\r
35             NS_LOG(DEBUG, "onNSProviderStateChanged - IN");\r
36             NS_LOG_V(DEBUG, "provider Id : %s", provider->providerId);\r
37             NS_LOG_V(DEBUG, "state : %d", (int)state);\r
38 \r
39             std::string provId;\r
40             provId.assign(provider->providerId, NS_UTILS_UUID_STRING_SIZE - 1);\r
41             NSProvider *oldProvider = NSConsumerService::getInstance()->getProvider(provId);\r
42 \r
43             if (oldProvider == nullptr)\r
44             {\r
45                 NSProvider *nsProvider = new NSProvider(provider);\r
46                 NS_LOG(DEBUG, "Provider with same Id do not exist. updating Data for New Provider");\r
47                 auto discoveredCallback = NSConsumerService::getInstance()->getProviderDiscoveredCb();\r
48                 nsProvider->setProviderState((NSProviderState)state);\r
49                 auto topicLL = NSConsumerGetTopicList(provider->providerId);\r
50                 nsProvider->setTopicList(new NSTopicsList(topicLL));\r
51                 if (state == NS_DISCOVERED)\r
52                 {\r
53                     nsProvider->setProviderSubscribedState(NSProviderSubscribedState::DISCOVERED);\r
54                     if (discoveredCallback != NULL)\r
55                     {\r
56                         NS_LOG(DEBUG, "initiating the Discovered callback : NS_DISCOVERED, policy false");\r
57                         discoveredCallback(nsProvider);\r
58                     }\r
59                 }\r
60                 else if (state == NS_ALLOW)\r
61                 {\r
62                     nsProvider->setProviderSubscribedState(NSProviderSubscribedState::SUBSCRIBED);\r
63                     if (discoveredCallback != NULL)\r
64                     {\r
65                         NS_LOG(DEBUG, "initiating the Discovered callback : NS_ALLOW, policy true");\r
66                         discoveredCallback(nsProvider);\r
67                     }\r
68                 }\r
69                 NSConsumerService::getInstance()->getAcceptedProviders().push_back(nsProvider);\r
70             }\r
71             else\r
72             {\r
73                 NS_LOG(DEBUG, "Provider with same Id exists. updating the old Provider data");\r
74                 auto changeCallback = oldProvider->getProviderStateReceivedCb();\r
75                 auto prevState = oldProvider->getProviderState();\r
76                 oldProvider->setProviderState((NSProviderState)state);\r
77                 if (state == NS_ALLOW)\r
78                 {\r
79                     oldProvider->setProviderSubscribedState(NSProviderSubscribedState::SUBSCRIBED);\r
80                     if (changeCallback != NULL)\r
81                     {\r
82                         NS_LOG(DEBUG, "initiating the callback for Response : NS_ALLOW");\r
83                         changeCallback((NSProviderState)state);\r
84                     }\r
85                     else\r
86                     {\r
87                         oldProvider->setProviderSubscribedState(NSProviderSubscribedState::SUBSCRIBED);\r
88                         auto discoveredCallback = NSConsumerService::getInstance()->getProviderDiscoveredCb();\r
89                         discoveredCallback(oldProvider);\r
90                         auto changeCallback = oldProvider->getProviderStateReceivedCb();\r
91                         changeCallback(prevState);\r
92                     }\r
93                 }\r
94                 else if (state == NS_DENY)\r
95                 {\r
96                     oldProvider->setProviderSubscribedState(NSProviderSubscribedState::DENY);\r
97                     NSConsumerService::getInstance()->getAcceptedProviders().remove(oldProvider);\r
98                     if (changeCallback != NULL)\r
99                     {\r
100                         NS_LOG(DEBUG, "initiating the callback for Response : NS_DENY");\r
101                         changeCallback((NSProviderState)state);\r
102                     }\r
103                     delete oldProvider;\r
104                 }\r
105                 else if (state == NS_TOPIC)\r
106                 {\r
107                     auto topicLL = NSConsumerGetTopicList(provider->providerId);\r
108                     oldProvider->setTopicList(new NSTopicsList(topicLL));\r
109                     if (changeCallback != NULL)\r
110                     {\r
111                         NS_LOG(DEBUG, "initiating the callback for Response : NS_TOPIC");\r
112                         changeCallback((NSProviderState)state);\r
113                     }\r
114                 }\r
115                 else if (state == NS_STOPPED)\r
116                 {\r
117                     oldProvider->setProviderSubscribedState(NSProviderSubscribedState::DENY);\r
118                     NSConsumerService::getInstance()->getAcceptedProviders().remove(oldProvider);\r
119                     NS_LOG(DEBUG, "initiating the State callback : NS_STOPPED");\r
120                     if (changeCallback != NULL)\r
121                     {\r
122                         NS_LOG(DEBUG, "initiating the callback for Response : NS_STOPPED");\r
123                         changeCallback((NSProviderState)state);\r
124                     }\r
125                 }\r
126             }\r
127             NS_LOG(DEBUG, "onNSProviderStateChanged - OUT");\r
128         }\r
129 \r
130         void onNSMessageReceived(::NSMessage *message)\r
131         {\r
132             NS_LOG(DEBUG, "onNSMessageReceived - IN");\r
133             NS_LOG_V(DEBUG, "message->providerId : %s", message->providerId);\r
134 \r
135             NSMessage *nsMessage = new NSMessage(message);\r
136 \r
137             NS_LOG_V(DEBUG, "getAcceptedProviders Size : %d", (int)\r
138                      NSConsumerService::getInstance()->getAcceptedProviders().size());\r
139             for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
140             {\r
141                 if (it->getProviderId() == nsMessage->getProviderId())\r
142                 {\r
143                     NS_LOG(DEBUG, "Found Provider with given ID");\r
144                     auto callback = it->getMessageReceivedCb();\r
145                     if (callback != NULL)\r
146                     {\r
147                         NS_LOG(DEBUG, "initiating the callback for messageReceived");\r
148                         callback(nsMessage);\r
149                     }\r
150                     break;\r
151                 }\r
152             }\r
153             delete nsMessage;\r
154             NS_LOG(DEBUG, "onNSMessageReceived - OUT");\r
155         }\r
156 \r
157         void onNSSyncInfoReceived(::NSSyncInfo *syncInfo)\r
158         {\r
159             NS_LOG(DEBUG, "onNSSyncInfoReceived - IN");\r
160             NSSyncInfo *nsSyncInfo = new NSSyncInfo(syncInfo);\r
161             for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
162             {\r
163                 if (it->getProviderId() == nsSyncInfo->getProviderId())\r
164                 {\r
165                     NS_LOG(DEBUG, "Found Provider with given ID");\r
166                     auto callback = it->getSyncInfoReceivedCb();\r
167                     if (callback != NULL)\r
168                     {\r
169                         NS_LOG(DEBUG, "initiating the callback for SyncInfoReceived");\r
170                         callback(nsSyncInfo);\r
171                     }\r
172                     break;\r
173                 }\r
174             }\r
175             delete nsSyncInfo;\r
176             NS_LOG(DEBUG, "onNSSyncInfoReceived - OUT");\r
177         }\r
178 \r
179         NSConsumerService::NSConsumerService()\r
180         {\r
181             m_providerDiscoveredCb = NULL;\r
182         }\r
183 \r
184         NSConsumerService::~NSConsumerService()\r
185         {\r
186             for (auto it : getAcceptedProviders())\r
187             {\r
188                 delete it;\r
189             }\r
190             getAcceptedProviders().clear();\r
191         }\r
192 \r
193         NSConsumerService *NSConsumerService::getInstance()\r
194         {\r
195             static  NSConsumerService s_instance;\r
196             return &s_instance;\r
197         }\r
198 \r
199         void NSConsumerService::start(NSConsumerService::ProviderDiscoveredCallback providerDiscovered)\r
200         {\r
201             NS_LOG(DEBUG, "start - IN");\r
202             m_providerDiscoveredCb = providerDiscovered;\r
203             NSConsumerConfig nsConfig;\r
204             nsConfig.changedCb = onProviderStateReceived;\r
205             nsConfig.messageCb = onNSMessageReceived;\r
206             nsConfig.syncInfoCb = onNSSyncInfoReceived;\r
207 \r
208             NSStartConsumer(nsConfig);\r
209             NS_LOG(DEBUG, "start - OUT");\r
210             return;\r
211         }\r
212 \r
213         void NSConsumerService::stop()\r
214         {\r
215             NS_LOG(DEBUG, "stop - IN");\r
216             NSStopConsumer();\r
217             for (auto it : getAcceptedProviders())\r
218             {\r
219                 delete it;\r
220             }\r
221             getAcceptedProviders().clear();\r
222             NS_LOG(DEBUG, "stop - OUT");\r
223             return;\r
224         }\r
225 \r
226         NSResult NSConsumerService::enableRemoteService(const std::string &serverAddress)\r
227         {\r
228             NS_LOG(DEBUG, "enableRemoteService - IN");\r
229             NS_LOG_V(DEBUG, "Server Address : %s", serverAddress.c_str());\r
230             NSResult result = NSResult::ERROR;\r
231 #ifdef WITH_CLOUD\r
232             result = (NSResult) NSConsumerEnableRemoteService(OICStrdup(serverAddress.c_str()));\r
233 #else\r
234             NS_LOG(ERROR, "Remote Services feature is not enabled in the Build");\r
235             (void) serverAddress;\r
236 #endif\r
237             NS_LOG(DEBUG, "enableRemoteService - OUT");\r
238             return result;\r
239         }\r
240 \r
241         void NSConsumerService::rescanProvider()\r
242         {\r
243             NS_LOG(DEBUG, "rescanProvider - IN");\r
244             NSRescanProvider();\r
245             NS_LOG(DEBUG, "rescanProvider - OUT");\r
246             return;\r
247         }\r
248 \r
249         NSConsumerService::ProviderDiscoveredCallback NSConsumerService::getProviderDiscoveredCb()\r
250         {\r
251             return m_providerDiscoveredCb;\r
252         }\r
253 \r
254         NSProvider *NSConsumerService::getProvider(const std::string &id)\r
255         {\r
256             for (auto it : getAcceptedProviders())\r
257             {\r
258                 if (it->getProviderId() == id)\r
259                 {\r
260                     NS_LOG(DEBUG, "getProvider : Found Provider with given ID");\r
261                     return it;\r
262                 }\r
263             }\r
264             NS_LOG(DEBUG, "getProvider : Not Found Provider with given ID");\r
265             return NULL;\r
266         }\r
267 \r
268         std::list<NSProvider *> &NSConsumerService::getAcceptedProviders()\r
269         {\r
270             return m_acceptedProviders;\r
271         }\r
272     }\r
273 }\r