replace : iotivity -> iotivity-sec
[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 "NSAcceptedConsumers.h"\r
27 #include "NSConsumer.h"\r
28 #include "NSSyncInfo.h"\r
29 #include "NSConstants.h"\r
30 #include "OCRepresentation.h"\r
31 #include "ocpayload.h"\r
32 #include "oic_string.h"\r
33 #include "oic_malloc.h"\r
34 \r
35 namespace OIC\r
36 {\r
37     namespace Service\r
38     {\r
39         void NSProviderService::onConsumerSubscribedCallback(::NSConsumer *consumer)\r
40         {\r
41             NS_LOG(DEBUG, "onConsumerSubscribedCallback - IN");\r
42             std::shared_ptr<NSConsumer> nsConsumer = std::make_shared<NSConsumer>(consumer);\r
43             NSProviderService::getInstance()->getAcceptedConsumers()->addConsumer(nsConsumer);\r
44             if (NSProviderService::getInstance()->getProviderConfig().m_subscribeRequestCb != NULL)\r
45             {\r
46                 NS_LOG(DEBUG, "initiating the callback for consumer subscribed");\r
47                 NSProviderService::getInstance()->getProviderConfig().m_subscribeRequestCb(nsConsumer);\r
48             }\r
49             NS_LOG(DEBUG, "onConsumerSubscribedCallback - OUT");\r
50         }\r
51 \r
52         void NSProviderService::onMessageSynchronizedCallback(::NSSyncInfo *syncInfo)\r
53         {\r
54             NS_LOG(DEBUG, "onMessageSynchronizedCallback - IN");\r
55             NSSyncInfo nsSyncInfo(syncInfo);\r
56             if (NSProviderService::getInstance()->getProviderConfig().m_syncInfoCb != NULL)\r
57             {\r
58                 NS_LOG(DEBUG, "initiating the callback for synchronized");\r
59                 NSProviderService::getInstance()->getProviderConfig().m_syncInfoCb(nsSyncInfo);\r
60             }\r
61             NS_LOG(DEBUG, "onMessageSynchronizedCallback - OUT");\r
62         }\r
63 \r
64         ::NSMessage *NSProviderService::getNSMessage(const 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             m_config.m_subscribeRequestCb = NULL;\r
93             m_config.m_syncInfoCb = NULL;\r
94             m_acceptedConsumers = new NSAcceptedConsumers();\r
95         }\r
96 \r
97         NSProviderService::~NSProviderService()\r
98         {\r
99             m_config.m_subscribeRequestCb = NULL;\r
100             m_config.m_syncInfoCb = NULL;\r
101             m_acceptedConsumers->removeConsumers();\r
102             delete m_acceptedConsumers;\r
103         }\r
104 \r
105         NSProviderService *NSProviderService::getInstance()\r
106         {\r
107             static NSProviderService s_instance;\r
108             return &s_instance;\r
109         }\r
110 \r
111         NSResult NSProviderService::start(NSProviderService::ProviderConfig config)\r
112         {\r
113             NS_LOG(DEBUG, "start - IN");\r
114             m_acceptedConsumers->removeConsumers();\r
115 \r
116             m_config = config;\r
117             NSProviderConfig nsConfig;\r
118             nsConfig.subRequestCallback = onConsumerSubscribedCallback;\r
119             nsConfig.syncInfoCallback = onMessageSynchronizedCallback;\r
120             nsConfig.subControllability = config.subControllability;\r
121             nsConfig.userInfo = OICStrdup(config.userInfo.c_str());\r
122             nsConfig.resourceSecurity = config.resourceSecurity;\r
123 \r
124             NSResult result = (NSResult) NSStartProvider(nsConfig);\r
125             OICFree(nsConfig.userInfo);\r
126             NS_LOG(DEBUG, "start - OUT");\r
127             return result;\r
128         }\r
129 \r
130         NSResult NSProviderService::stop()\r
131         {\r
132             NS_LOG(DEBUG, "stop - IN");\r
133 \r
134             m_config.m_subscribeRequestCb = NULL;\r
135             m_config.m_syncInfoCb = NULL;\r
136             m_acceptedConsumers->removeConsumers();\r
137 \r
138             NSResult result = (NSResult) NSStopProvider();\r
139             NS_LOG(DEBUG, "stop - OUT");\r
140             return result;\r
141         }\r
142 \r
143         NSResult NSProviderService::enableRemoteService(const std::string &serverAddress)\r
144         {\r
145             NS_LOG(DEBUG, "enableRemoteService - IN");\r
146             NS_LOG_V(INFO_PRIVATE, "Server Address : %s", serverAddress.c_str());\r
147             NSResult result = NSResult::ERROR;\r
148 #ifdef WITH_CLOUD\r
149             result = (NSResult) NSProviderEnableRemoteService(OICStrdup(serverAddress.c_str()));\r
150 #else\r
151             (void) serverAddress;\r
152             NS_LOG(ERROR, "Remote Services feature is not enabled in the Build");\r
153 #endif\r
154             NS_LOG(DEBUG, "enableRemoteService - OUT");\r
155             return result;\r
156         }\r
157 \r
158         NSResult NSProviderService::disableRemoteService(const std::string &serverAddress)\r
159         {\r
160             NS_LOG(DEBUG, "disableRemoteService - IN");\r
161             NS_LOG_V(INFO_PRIVATE, "Server Address : %s", serverAddress.c_str());\r
162             NSResult result = NSResult::ERROR;\r
163 #ifdef WITH_CLOUD\r
164             result = (NSResult) NSProviderDisableRemoteService(OICStrdup(serverAddress.c_str()));\r
165 #else\r
166             (void) serverAddress;\r
167             NS_LOG(ERROR, "Remote Services feature is not enabled in the Build");\r
168 #endif\r
169             NS_LOG(DEBUG, "disableRemoteService - OUT");\r
170             return result;\r
171         }\r
172 \r
173         NSResult NSProviderService::subscribeMQService(const std::string &serverAddress,\r
174                 const std::string &topicName)\r
175         {\r
176             NS_LOG(DEBUG, "subscribeMQService - IN");\r
177             NS_LOG_V(INFO_PRIVATE, "Server Address : %s", serverAddress.c_str());\r
178             NSResult result = NSResult::ERROR;\r
179 #ifdef WITH_MQ\r
180             result = (NSResult) NSProviderSubscribeMQService(\r
181                          serverAddress.c_str(), topicName.c_str());\r
182 #else\r
183             NS_LOG(ERROR, "MQ Services feature is not enabled in the Build");\r
184             (void) serverAddress;\r
185             (void) topicName;\r
186 #endif\r
187             NS_LOG(DEBUG, "subscribeMQService - OUT");\r
188             return result;\r
189         }\r
190 \r
191         NSResult NSProviderService::sendMessage(const NSMessage &msg)\r
192         {\r
193             NS_LOG(DEBUG, "sendMessage - IN");\r
194             NSResult result = NSResult::ERROR;\r
195 \r
196             ::NSMessage *nsMsg = getNSMessage(msg);\r
197 \r
198             NS_LOG_V(INFO_PRIVATE, "nsMsg->providerId : %s", nsMsg->providerId);\r
199             result = (NSResult) NSSendMessage(nsMsg);\r
200             OICFree(nsMsg->dateTime);\r
201             OICFree(nsMsg->title);\r
202             OICFree(nsMsg->contentText);\r
203             OICFree(nsMsg->sourceName);\r
204             OICFree(nsMsg->topic);\r
205             if (nsMsg->mediaContents != NULL)\r
206             {\r
207                 if (nsMsg->mediaContents->iconImage != NULL)\r
208                 {\r
209                     OICFree(nsMsg->mediaContents->iconImage);\r
210                 }\r
211                 delete nsMsg->mediaContents;\r
212             }\r
213             OCPayloadDestroy((OCPayload *) nsMsg->extraInfo);\r
214             delete nsMsg;\r
215 \r
216             NS_LOG(DEBUG, "sendMessage - OUT");\r
217             return result;\r
218         }\r
219 \r
220         NSResult NSProviderService::sendSyncInfo(uint64_t messageId,\r
221                 NSSyncInfo::NSSyncType type)\r
222         {\r
223             NS_LOG(DEBUG, "sendSyncInfo - IN");\r
224             NSResult result = (NSResult) NSProviderSendSyncInfo(messageId, (NSSyncType)type);\r
225             NS_LOG(DEBUG, "sendSyncInfo - OUT");\r
226             return result;\r
227         }\r
228 \r
229         NSMessage NSProviderService::createMessage()\r
230         {\r
231             NS_LOG(DEBUG, "createMessage - IN");\r
232 \r
233             ::NSMessage *message = NSCreateMessage();\r
234             NSMessage nsMessage(message);\r
235 \r
236             NS_LOG_V(DEBUG, "Message ID : %lld", (long long int) nsMessage.getMessageId());\r
237             NS_LOG_V(INFO_PRIVATE, "Provider ID : %s", nsMessage.getProviderId().c_str());\r
238             NS_LOG(DEBUG, "createMessage - OUT");\r
239 \r
240             OICFree(message);\r
241             return nsMessage;\r
242         }\r
243 \r
244         NSResult NSProviderService::registerTopic(const std::string &topicName)\r
245         {\r
246             NS_LOG(DEBUG, "registerTopic - IN");\r
247             NSResult result = (NSResult) NSProviderRegisterTopic(topicName.c_str());\r
248             NS_LOG(DEBUG, "registerTopic - OUT");\r
249             return result;\r
250         }\r
251 \r
252         NSResult NSProviderService::unregisterTopic(const std::string &topicName)\r
253         {\r
254             NS_LOG(DEBUG, "unregisterTopic - IN");\r
255             NSResult result = (NSResult) NSProviderUnregisterTopic(topicName.c_str());\r
256             NS_LOG(DEBUG, "unregisterTopic - OUT");\r
257             return result;\r
258         }\r
259 \r
260         std::shared_ptr<NSTopicsList> NSProviderService::getRegisteredTopicList()\r
261         {\r
262             NS_LOG(DEBUG, "getRegisteredTopicList - IN");\r
263             ::NSTopicLL *topics = NSProviderGetTopics();\r
264 \r
265             std::shared_ptr<NSTopicsList> nsTopics = std::make_shared<NSTopicsList>(topics, false);\r
266             NS_LOG(DEBUG, "getRegisteredTopicList - OUT");\r
267             return nsTopics;\r
268         }\r
269 \r
270         NSProviderService::ProviderConfig NSProviderService::getProviderConfig()\r
271         {\r
272             return m_config;\r
273         }\r
274 \r
275         std::shared_ptr<NSConsumer> NSProviderService::getConsumer(const std::string &id)\r
276         {\r
277             return m_acceptedConsumers->getConsumer(id);\r
278         }\r
279 \r
280         NSAcceptedConsumers *NSProviderService::getAcceptedConsumers()\r
281         {\r
282             return m_acceptedConsumers;\r
283         }\r
284     }\r
285 }\r