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