Fix for Memory leak results from static analyzer for NS C++ Wrapper.
[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                 oldProvider->setProviderState((NSProviderState)state);\r
76                 if (state == NS_ALLOW)\r
77                 {\r
78                     oldProvider->setProviderSubscribedState(NSProviderSubscribedState::SUBSCRIBED);\r
79                     if (changeCallback != NULL)\r
80                     {\r
81                         NS_LOG(DEBUG, "initiating the callback for Response : NS_ALLOW");\r
82                         changeCallback((NSProviderState)state);\r
83                     }\r
84                 }\r
85                 else if (state == NS_DENY)\r
86                 {\r
87                     oldProvider->setProviderSubscribedState(NSProviderSubscribedState::DENY);\r
88                     NSConsumerService::getInstance()->getAcceptedProviders().remove(oldProvider);\r
89                     if (changeCallback != NULL)\r
90                     {\r
91                         NS_LOG(DEBUG, "initiating the callback for Response : NS_DENY");\r
92                         changeCallback((NSProviderState)state);\r
93                     }\r
94                     delete oldProvider;\r
95                 }\r
96                 else if (state == NS_TOPIC)\r
97                 {\r
98                     auto topicLL = NSConsumerGetTopicList(provider->providerId);\r
99                     oldProvider->setTopicList(new NSTopicsList(topicLL));\r
100                     if (changeCallback != NULL)\r
101                     {\r
102                         NS_LOG(DEBUG, "initiating the callback for Response : NS_TOPIC");\r
103                         changeCallback((NSProviderState)state);\r
104                     }\r
105                 }\r
106                 else if (state == NS_STOPPED)\r
107                 {\r
108                     oldProvider->setProviderSubscribedState(NSProviderSubscribedState::DENY);\r
109                     NSConsumerService::getInstance()->getAcceptedProviders().remove(oldProvider);\r
110                     NS_LOG(DEBUG, "initiating the State callback : NS_STOPPED");\r
111                     if (changeCallback != NULL)\r
112                     {\r
113                         NS_LOG(DEBUG, "initiating the callback for Response : NS_STOPPED");\r
114                         changeCallback((NSProviderState)state);\r
115                     }\r
116                 }\r
117             }\r
118             NS_LOG(DEBUG, "onNSProviderStateChanged - OUT");\r
119         }\r
120 \r
121         void onNSMessageReceived(::NSMessage *message)\r
122         {\r
123             NS_LOG(DEBUG, "onNSMessageReceived - IN");\r
124             NS_LOG_V(DEBUG, "message->providerId : %s", message->providerId);\r
125 \r
126             NSMessage *nsMessage = new NSMessage(message);\r
127 \r
128             NS_LOG_V(DEBUG, "getAcceptedProviders Size : %d", (int)\r
129                      NSConsumerService::getInstance()->getAcceptedProviders().size());\r
130             for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
131             {\r
132                 if (it->getProviderId() == nsMessage->getProviderId())\r
133                 {\r
134                     NS_LOG(DEBUG, "Found Provider with given ID");\r
135                     auto callback = it->getMessageReceivedCb();\r
136                     if (callback != NULL)\r
137                     {\r
138                         NS_LOG(DEBUG, "initiating the callback for messageReceived");\r
139                         callback(nsMessage);\r
140                     }\r
141                     break;\r
142                 }\r
143             }\r
144             delete nsMessage;\r
145             NS_LOG(DEBUG, "onNSMessageReceived - OUT");\r
146         }\r
147 \r
148         void onNSSyncInfoReceived(::NSSyncInfo *syncInfo)\r
149         {\r
150             NS_LOG(DEBUG, "onNSSyncInfoReceived - IN");\r
151             NSSyncInfo *nsSyncInfo = new NSSyncInfo(syncInfo);\r
152             for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
153             {\r
154                 if (it->getProviderId() == nsSyncInfo->getProviderId())\r
155                 {\r
156                     NS_LOG(DEBUG, "Found Provider with given ID");\r
157                     auto callback = it->getSyncInfoReceivedCb();\r
158                     if (callback != NULL)\r
159                     {\r
160                         NS_LOG(DEBUG, "initiating the callback for SyncInfoReceived");\r
161                         callback(nsSyncInfo);\r
162                     }\r
163                     break;\r
164                 }\r
165             }\r
166             delete nsSyncInfo;\r
167             NS_LOG(DEBUG, "onNSSyncInfoReceived - OUT");\r
168         }\r
169 \r
170         NSConsumerService::NSConsumerService()\r
171         {\r
172             m_providerDiscoveredCb = NULL;\r
173         }\r
174 \r
175         NSConsumerService::~NSConsumerService()\r
176         {\r
177             for (auto it : getAcceptedProviders())\r
178             {\r
179                 delete it;\r
180             }\r
181             getAcceptedProviders().clear();\r
182         }\r
183 \r
184         NSConsumerService *NSConsumerService::getInstance()\r
185         {\r
186             static  NSConsumerService s_instance;\r
187             return &s_instance;\r
188         }\r
189 \r
190         void NSConsumerService::start(NSConsumerService::ProviderDiscoveredCallback providerDiscovered)\r
191         {\r
192             NS_LOG(DEBUG, "start - IN");\r
193             m_providerDiscoveredCb = providerDiscovered;\r
194             NSConsumerConfig nsConfig;\r
195             nsConfig.changedCb = onProviderStateReceived;\r
196             nsConfig.messageCb = onNSMessageReceived;\r
197             nsConfig.syncInfoCb = onNSSyncInfoReceived;\r
198 \r
199             NSStartConsumer(nsConfig);\r
200             NS_LOG(DEBUG, "start - OUT");\r
201             return;\r
202         }\r
203 \r
204         void NSConsumerService::stop()\r
205         {\r
206             NS_LOG(DEBUG, "stop - IN");\r
207             NSStopConsumer();\r
208             for (auto it : getAcceptedProviders())\r
209             {\r
210                 delete it;\r
211             }\r
212             getAcceptedProviders().clear();\r
213             NS_LOG(DEBUG, "stop - OUT");\r
214             return;\r
215         }\r
216 \r
217         NSResult NSConsumerService::enableRemoteService(const std::string &serverAddress)\r
218         {\r
219             NS_LOG(DEBUG, "enableRemoteService - IN");\r
220             NS_LOG_V(DEBUG, "Server Address : %s", serverAddress.c_str());\r
221             NSResult result = NSResult::ERROR;\r
222 #ifdef WITH_CLOUD\r
223             result = (NSResult) NSConsumerEnableRemoteService(OICStrdup(serverAddress.c_str()));\r
224 #else\r
225             NS_LOG(ERROR, "Remote Services feature is not enabled in the Build");\r
226             (void) serverAddress;\r
227 #endif\r
228             NS_LOG(DEBUG, "enableRemoteService - OUT");\r
229             return result;\r
230         }\r
231 \r
232         void NSConsumerService::rescanProvider()\r
233         {\r
234             NS_LOG(DEBUG, "rescanProvider - IN");\r
235             NSRescanProvider();\r
236             NS_LOG(DEBUG, "rescanProvider - OUT");\r
237             return;\r
238         }\r
239 \r
240         NSConsumerService::ProviderDiscoveredCallback NSConsumerService::getProviderDiscoveredCb()\r
241         {\r
242             return m_providerDiscoveredCb;\r
243         }\r
244 \r
245         NSProvider *NSConsumerService::getProvider(const std::string &id)\r
246         {\r
247             for (auto it : getAcceptedProviders())\r
248             {\r
249                 if (it->getProviderId() == id)\r
250                 {\r
251                     NS_LOG(DEBUG, "getProvider : Found Provider with given ID");\r
252                     return it;\r
253                 }\r
254             }\r
255             NS_LOG(DEBUG, "getProvider : Not Found Provider with given ID");\r
256             return NULL;\r
257         }\r
258 \r
259         std::list<NSProvider *> &NSConsumerService::getAcceptedProviders()\r
260         {\r
261             return m_acceptedProviders;\r
262         }\r
263     }\r
264 }\r