Update consumer logic for stopped provider.
[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 onNSProviderDiscovered(::NSProvider *provider)\r
34         {\r
35             NS_LOG(DEBUG, "onNSProviderDiscovered - IN");\r
36             NSProvider *nsProvider = new NSProvider(provider);\r
37             if (NSConsumerService::getInstance()->getConsumerConfig().m_discoverCb != NULL)\r
38             {\r
39                 NS_LOG(DEBUG, "initiating the callback");\r
40                 NSConsumerService::getInstance()->getConsumerConfig().m_discoverCb(nsProvider);\r
41             }\r
42             delete nsProvider;\r
43             NS_LOG(DEBUG, "onNSProviderDiscovered - OUT");\r
44         }\r
45 \r
46         void onNSProviderChanged(::NSProvider *provider, ::NSProviderState response)\r
47         {\r
48             NS_LOG(DEBUG, "onNSProviderChanged - IN");\r
49             NS_LOG_V(DEBUG, "provider Id : %s", provider->providerId);\r
50             NS_LOG_V(DEBUG, "response : %d", (int)response);\r
51 \r
52             NSProvider *nsProvider = new NSProvider(provider);\r
53             auto changeCallback = NSConsumerService::getInstance()->getConsumerConfig().m_changedCb;\r
54             if (response == NS_ALLOW)\r
55             {\r
56                 NSConsumerService::getInstance()->getAcceptedProviders().push_back(nsProvider);\r
57                 if (changeCallback != NULL)\r
58                 {\r
59                     NS_LOG(DEBUG, "initiating the callback for Response : ALLOW");\r
60                     changeCallback(nsProvider, (NSResponse) response);\r
61                 }\r
62             }\r
63             else if (response == NS_DENY)\r
64             {\r
65                 NSConsumerService::getInstance()->getAcceptedProviders().remove(nsProvider);\r
66                 if (changeCallback != NULL)\r
67                 {\r
68                     NS_LOG(DEBUG, "initiating the callback for Response : NS_DENY");\r
69                     changeCallback(nsProvider, (NSResponse) response);\r
70                 }\r
71                 delete nsProvider;\r
72             }\r
73             else if (response == NS_TOPIC)\r
74             {\r
75                 NSProvider *oldProvider = NSConsumerService::getInstance()->getProvider(\r
76                                               nsProvider->getProviderId());\r
77                 if (oldProvider != nullptr)\r
78                 {\r
79                     NS_LOG(DEBUG, "Provider with same Id exists. updating the Topics data");\r
80                     nsProvider->setListener(oldProvider->getMessageReceivedCb(), oldProvider->getSyncInfoReceivedCb());\r
81                     NSConsumerService::getInstance()->getAcceptedProviders().remove(oldProvider);\r
82                     NSConsumerService::getInstance()->getAcceptedProviders().push_back(nsProvider);\r
83                     if (changeCallback != NULL)\r
84                     {\r
85                         NS_LOG(DEBUG, "initiating the callback for Response : NS_TOPIC");\r
86                         changeCallback(nsProvider, (NSResponse) response);\r
87                     }\r
88                     delete oldProvider;\r
89                 }\r
90             }\r
91             NS_LOG(DEBUG, "onNSProviderChanged - OUT");\r
92         }\r
93 \r
94         void onNSMessageReceived(::NSMessage *message)\r
95         {\r
96             NS_LOG(DEBUG, "onNSMessageReceived - IN");\r
97             NSMessage *nsMessage = new NSMessage(message);\r
98             for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
99             {\r
100                 if (it->getProviderId() == nsMessage->getProviderId())\r
101                 {\r
102                     NS_LOG(DEBUG, "Found Provider with given ID");\r
103                     auto callback = it->getMessageReceivedCb();\r
104                     if (callback != NULL)\r
105                     {\r
106                         NS_LOG(DEBUG, "initiating the callback for messageReceived");\r
107                         callback(nsMessage);\r
108                     }\r
109                     break;\r
110                 }\r
111             }\r
112             delete nsMessage;\r
113             NS_LOG(DEBUG, "onNSMessageReceived - OUT");\r
114         }\r
115 \r
116         void onNSSyncInfoReceived(::NSSyncInfo *syncInfo)\r
117         {\r
118             NS_LOG(DEBUG, "onNSSyncInfoReceived - IN");\r
119             NSSyncInfo *nsSyncInfo = new NSSyncInfo(syncInfo);\r
120             for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
121             {\r
122                 if (it->getProviderId() == nsSyncInfo->getProviderId())\r
123                 {\r
124                     NS_LOG(DEBUG, "Found Provider with given ID");\r
125                     auto callback = it->getSyncInfoReceivedCb();\r
126                     if (callback != NULL)\r
127                     {\r
128                         NS_LOG(DEBUG, "initiating the callback for SyncInfoReceived");\r
129                         callback(nsSyncInfo);\r
130                     }\r
131                     break;\r
132                 }\r
133             }\r
134             delete nsSyncInfo;\r
135             NS_LOG(DEBUG, "onNSSyncInfoReceived - OUT");\r
136         }\r
137 \r
138         NSConsumerService::NSConsumerService()\r
139         {\r
140             m_config.m_discoverCb = NULL;\r
141             m_config.m_changedCb = NULL;\r
142         }\r
143 \r
144         NSConsumerService::~NSConsumerService()\r
145         {\r
146             for (auto it : getAcceptedProviders())\r
147             {\r
148                 delete it;\r
149             }\r
150             getAcceptedProviders().clear();\r
151         }\r
152         NSConsumerService *NSConsumerService::getInstance()\r
153         {\r
154             static  NSConsumerService s_instance;\r
155             return &s_instance;\r
156         }\r
157 \r
158         void NSConsumerService::Start(NSConsumerService::ConsumerConfig config)\r
159         {\r
160             NS_LOG(DEBUG, "Start - IN");\r
161             m_config = config;\r
162             NSConsumerConfig nsConfig;\r
163 \r
164             // TODO Check to changed c layer ConsumerConfig.\r
165             //nsConfig.discoverCb = onNSProviderDiscovered;\r
166             nsConfig.changedCb = onNSProviderChanged;\r
167             nsConfig.messageCb = onNSMessageReceived;\r
168             nsConfig.syncInfoCb = onNSSyncInfoReceived;\r
169 \r
170             NSStartConsumer(nsConfig);\r
171             NS_LOG(DEBUG, "Start - OUT");\r
172             return;\r
173         }\r
174 \r
175         void NSConsumerService::Stop()\r
176         {\r
177             NS_LOG(DEBUG, "Stop - IN");\r
178             NSStopConsumer();\r
179             NS_LOG(DEBUG, "Stop - OUT");\r
180             return;\r
181         }\r
182 \r
183         NSResult NSConsumerService::EnableRemoteService(const std::string &serverAddress)\r
184         {\r
185             NS_LOG(DEBUG, "EnableRemoteService - IN");\r
186             NSResult result = NSResult::ERROR;\r
187 #ifdef WITH_CLOUD\r
188             result = (NSResult) NSConsumerEnableRemoteService(OICStrdup(serverAddress.c_str()));\r
189 #else\r
190             NS_LOG(ERROR, "Remote Services feature is not enabled in the Build");\r
191 #endif\r
192             NS_LOG(DEBUG, "EnableRemoteService - OUT");\r
193             return result;\r
194         }\r
195 \r
196         void NSConsumerService::RescanProvider()\r
197         {\r
198             NS_LOG(DEBUG, "RescanProvider - IN");\r
199             NSRescanProvider();\r
200             NS_LOG(DEBUG, "RescanProvider - OUT");\r
201             return;\r
202         }\r
203 \r
204         NSProvider *NSConsumerService::getProvider(const std::string &id)\r
205         {\r
206             for (auto it : getAcceptedProviders())\r
207             {\r
208                 if (it->getProviderId() == id)\r
209                 {\r
210                     NS_LOG(DEBUG, "getProvider : Found Provider with given ID");\r
211                     return it;\r
212                 }\r
213             }\r
214             NS_LOG(DEBUG, "getProvider : Not Found Provider with given ID");\r
215             return NULL;\r
216         }\r
217 \r
218         NSMessage *NSConsumerService::getMessage(uint64_t messageId)\r
219         {\r
220             NS_LOG(DEBUG, "getMessage - IN");\r
221             ::NSMessage *message = NSConsumerGetMessage(messageId);\r
222             NSMessage *nsMessage = new NSMessage(message);\r
223 \r
224             delete message->mediaContents;\r
225             delete message;\r
226             NS_LOG(DEBUG, "getMessage - OUT");\r
227             return nsMessage;\r
228         }\r
229 \r
230         NSConsumerService::ConsumerConfig NSConsumerService::getConsumerConfig()\r
231         {\r
232             return m_config;\r
233         }\r
234 \r
235         std::list<NSProvider *>& NSConsumerService::getAcceptedProviders()\r
236         {\r
237             return m_acceptedProviders;\r
238         }\r
239     }\r
240 }\r