Updated with Valgrind memory leak fixes for Notification Provider and consumer.
[platform/upstream/iotivity.git] / service / notification / cpp-wrapper / provider / src / NSProviderService.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 \r
22 #include "NSProviderService.h"\r
23 #include <cstring>\r
24 #include "NSCommon.h"\r
25 #include "NSProviderInterface.h"\r
26 #include "NSConsumer.h"\r
27 #include "NSSyncInfo.h"\r
28 #include "NSConstants.h"\r
29 #include "OCRepresentation.h"\r
30 #include "ocpayload.h"\r
31 #include "oic_string.h"\r
32 #include "oic_malloc.h"\r
33 \r
34 namespace OIC\r
35 {\r
36     namespace Service\r
37     {\r
38         void onConsumerSubscribedCallback(::NSConsumer *consumer)\r
39         {\r
40             NS_LOG(DEBUG, "onConsumerSubscribedCallback - IN");\r
41             NSConsumer *nsConsumer = new NSConsumer(consumer);\r
42             NSProviderService::getInstance()->getAcceptedConsumers().push_back(nsConsumer);\r
43             if (NSProviderService::getInstance()->getProviderConfig().m_subscribeRequestCb != NULL)\r
44             {\r
45                 NS_LOG(DEBUG, "initiating the callback for consumer subscribed");\r
46                 NSProviderService::getInstance()->getProviderConfig().m_subscribeRequestCb(nsConsumer);\r
47             }\r
48             NS_LOG(DEBUG, "onConsumerSubscribedCallback - OUT");\r
49         }\r
50 \r
51         void onMessageSynchronizedCallback(::NSSyncInfo *syncInfo)\r
52         {\r
53             NS_LOG(DEBUG, "onMessageSynchronizedCallback - IN");\r
54             NSSyncInfo *nsSyncInfo = new NSSyncInfo(syncInfo);\r
55             if (NSProviderService::getInstance()->getProviderConfig().m_syncInfoCb != NULL)\r
56             {\r
57                 NS_LOG(DEBUG, "initiating the callback for synchronized");\r
58                 NSProviderService::getInstance()->getProviderConfig().m_syncInfoCb(nsSyncInfo);\r
59             }\r
60             delete nsSyncInfo;\r
61             NS_LOG(DEBUG, "onMessageSynchronizedCallback - OUT");\r
62         }\r
63 \r
64         ::NSMessage *NSProviderService::getNSMessage(NSMessage *msg)\r
65         {\r
66             ::NSMessage *nsMsg = new ::NSMessage;\r
67             nsMsg->messageId = msg->getMessageId();\r
68             OICStrcpy(nsMsg->providerId, NS_UTILS_UUID_STRING_SIZE, msg->getProviderId().c_str());\r
69             nsMsg->sourceName = OICStrdup(msg->getSourceName().c_str());\r
70             nsMsg->type = (::NSMessageType) msg->getType();\r
71             nsMsg->dateTime = OICStrdup(msg->getTime().c_str());\r
72             nsMsg->ttl = msg->getTTL();\r
73             nsMsg->title = OICStrdup(msg->getTitle().c_str());\r
74             nsMsg->contentText = OICStrdup(msg->getContentText().c_str());\r
75             nsMsg->topic = OICStrdup(msg->getTopic().c_str());\r
76 \r
77             if (msg->getMediaContents() != nullptr)\r
78             {\r
79                 nsMsg->mediaContents = new ::NSMediaContents;\r
80                 nsMsg->mediaContents->iconImage = OICStrdup(msg->getMediaContents()->getIconImage().c_str());\r
81             }\r
82             else\r
83             {\r
84                 nsMsg->mediaContents = nullptr;\r
85             }\r
86             nsMsg->extraInfo = msg->getExtraInfo().getPayload();\r
87             return nsMsg;\r
88         }\r
89 \r
90         NSProviderService::~NSProviderService()\r
91         {\r
92             for (auto it : getAcceptedConsumers())\r
93             {\r
94                 delete it;\r
95             }\r
96             getAcceptedConsumers().clear();\r
97         }\r
98 \r
99         NSProviderService *NSProviderService::getInstance()\r
100         {\r
101             static NSProviderService s_instance;\r
102             return &s_instance;\r
103         }\r
104 \r
105         NSResult NSProviderService::start(NSProviderService::ProviderConfig config)\r
106         {\r
107             NS_LOG(DEBUG, "start - IN");\r
108 \r
109             m_config = config;\r
110             NSProviderConfig nsConfig;\r
111             nsConfig.subRequestCallback = onConsumerSubscribedCallback;\r
112             nsConfig.syncInfoCallback = onMessageSynchronizedCallback;\r
113             nsConfig.subControllability = config.subControllability;\r
114             nsConfig.userInfo = OICStrdup(config.userInfo.c_str());\r
115             nsConfig.resourceSecurity = config.resourceSecurity;\r
116 \r
117             NSResult result = (NSResult) NSStartProvider(nsConfig);\r
118             OICFree(nsConfig.userInfo);\r
119             NS_LOG(DEBUG, "start - OUT");\r
120             return result;\r
121         }\r
122 \r
123         NSResult NSProviderService::stop()\r
124         {\r
125             NS_LOG(DEBUG, "stop - IN");\r
126             NSResult result = (NSResult) NSStopProvider();\r
127             NS_LOG(DEBUG, "stop - OUT");\r
128             return result;\r
129         }\r
130 \r
131         NSResult NSProviderService::enableRemoteService(const std::string &serverAddress)\r
132         {\r
133             NS_LOG(DEBUG, "enableRemoteService - IN");\r
134             NS_LOG_V(DEBUG, "Server Address : %s", serverAddress.c_str());\r
135             NSResult result = NSResult::ERROR;\r
136 #ifdef WITH_CLOUD\r
137             result = (NSResult) NSProviderEnableRemoteService(OICStrdup(serverAddress.c_str()));\r
138 #else\r
139             (void) serverAddress;\r
140             NS_LOG(ERROR, "Remote Services feature is not enabled in the Build");\r
141 #endif\r
142             NS_LOG(DEBUG, "enableRemoteService - OUT");\r
143             return result;\r
144         }\r
145 \r
146         NSResult NSProviderService::disableRemoteService(const std::string &serverAddress)\r
147         {\r
148             NS_LOG(DEBUG, "disableRemoteService - IN");\r
149             NS_LOG_V(DEBUG, "Server Address : %s", serverAddress.c_str());\r
150             NSResult result = NSResult::ERROR;\r
151 #ifdef WITH_CLOUD\r
152             result = (NSResult) NSProviderDisableRemoteService(OICStrdup(serverAddress.c_str()));\r
153 #else\r
154             (void) serverAddress;\r
155             NS_LOG(ERROR, "Remote Services feature is not enabled in the Build");\r
156 #endif\r
157             NS_LOG(DEBUG, "disableRemoteService - OUT");\r
158             return result;\r
159         }\r
160 \r
161         NSResult NSProviderService::sendMessage(NSMessage *msg)\r
162         {\r
163             NS_LOG(DEBUG, "sendMessage - IN");\r
164             NSResult result = NSResult::ERROR;\r
165             if (msg != nullptr)\r
166             {\r
167                 ::NSMessage *nsMsg = getNSMessage(msg);\r
168 \r
169                 NS_LOG_V(DEBUG, "nsMsg->providerId : %s", nsMsg->providerId);\r
170                 result = (NSResult) NSSendMessage(nsMsg);\r
171                 OICFree(nsMsg->dateTime);\r
172                 OICFree(nsMsg->title);\r
173                 OICFree(nsMsg->contentText);\r
174                 OICFree(nsMsg->sourceName);\r
175                 OICFree(nsMsg->topic);\r
176                 if (nsMsg->mediaContents != NULL)\r
177                 {\r
178                     if (nsMsg->mediaContents->iconImage != NULL)\r
179                     {\r
180                         OICFree(nsMsg->mediaContents->iconImage);\r
181                     }\r
182                     delete nsMsg->mediaContents;\r
183                 }\r
184                 OCPayloadDestroy((OCPayload *) nsMsg->extraInfo);\r
185                 delete nsMsg;\r
186             }\r
187             else\r
188             {\r
189                 NS_LOG(DEBUG, "Empty Message");\r
190             }\r
191             NS_LOG(DEBUG, "sendMessage - OUT");\r
192             return result;\r
193         }\r
194 \r
195         void NSProviderService::sendSyncInfo(uint64_t messageId,\r
196                                              NSSyncInfo::NSSyncType type)\r
197         {\r
198             NS_LOG(DEBUG, "sendSyncInfo - IN");\r
199             NSProviderSendSyncInfo(messageId, (NSSyncType)type);\r
200             NS_LOG(DEBUG, "sendSyncInfo - OUT");\r
201             return;\r
202         }\r
203 \r
204         NSMessage *NSProviderService::createMessage()\r
205         {\r
206             NS_LOG(DEBUG, "createMessage - IN");\r
207 \r
208             ::NSMessage *message = NSCreateMessage();\r
209             NSMessage *nsMessage = new NSMessage(message);\r
210 \r
211             NS_LOG_V(DEBUG, "Message ID : %lld", (long long int) nsMessage->getMessageId());\r
212             NS_LOG_V(DEBUG, "Provider ID : %s", nsMessage->getProviderId().c_str());\r
213             NS_LOG(DEBUG, "createMessage - OUT");\r
214 \r
215             OICFree(message);\r
216             return nsMessage;\r
217         }\r
218 \r
219         NSResult NSProviderService::registerTopic(const std::string &topicName)\r
220         {\r
221             NS_LOG(DEBUG, "registerTopic - IN");\r
222             NSResult result = (NSResult) NSProviderRegisterTopic(topicName.c_str());\r
223             NS_LOG(DEBUG, "registerTopic - OUT");\r
224             return result;\r
225         }\r
226 \r
227         NSResult NSProviderService::unregisterTopic(const std::string &topicName)\r
228         {\r
229             NS_LOG(DEBUG, "unregisterTopic - IN");\r
230             NSResult result = (NSResult) NSProviderUnregisterTopic(topicName.c_str());\r
231             NS_LOG(DEBUG, "unregisterTopic - OUT");\r
232             return result;\r
233         }\r
234 \r
235         NSTopicsList *NSProviderService::getRegisteredTopicList()\r
236         {\r
237             NS_LOG(DEBUG, "getRegisteredTopicList - IN");\r
238             ::NSTopicLL *topics = NSProviderGetTopics();\r
239 \r
240             NSTopicsList *nsTopics = new NSTopicsList(topics);\r
241             NS_LOG(DEBUG, "getRegisteredTopicList - OUT");\r
242             return nsTopics;\r
243         }\r
244 \r
245         NSProviderService::ProviderConfig NSProviderService::getProviderConfig()\r
246         {\r
247             return m_config;\r
248         }\r
249 \r
250         NSConsumer *NSProviderService::getConsumer(const std::string &id)\r
251         {\r
252             for (auto it : getAcceptedConsumers())\r
253             {\r
254                 if (it->getConsumerId() == id)\r
255                 {\r
256                     NS_LOG(DEBUG, "getConsumer : Found Consumer with given ID");\r
257                     return it;\r
258                 }\r
259             }\r
260             NS_LOG(DEBUG, "getConsumer : Not Found Consumer with given ID");\r
261             return NULL;\r
262         }\r
263 \r
264         std::list<NSConsumer *> &NSProviderService::getAcceptedConsumers()\r
265         {\r
266             return m_acceptedConsumers;\r
267         }\r
268     }\r
269 }\r