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