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