[IOT-1808]Changes in C++ APIs to remove TopicList raw pointers.
[platform/upstream/iotivity.git] / service / notification / cpp-wrapper / consumer / src / NSProvider.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 "NSProvider.h"\r
22 #include <cstring>\r
23 #include "NSConsumerService.h"\r
24 #include "NSConsumerInterface.h"\r
25 #include "NSAcceptedProviders.h"\r
26 #include "NSConstants.h"\r
27 #include "NSCommon.h"\r
28 #include "oic_string.h"\r
29 #include "oic_malloc.h"\r
30 \r
31 namespace OIC\r
32 {\r
33     namespace Service\r
34     {\r
35         ::NSProvider *NSProvider::getNSProvider()\r
36         {\r
37             ::NSProvider *provider = new ::NSProvider;\r
38             OICStrcpy(provider->providerId, NS_UTILS_UUID_STRING_SIZE, m_providerId.c_str());\r
39             return provider;\r
40         }\r
41 \r
42         NSProvider::NSProvider(::NSProvider *provider)\r
43         {\r
44             m_stateCb = NULL;\r
45             m_messageCb = NULL;\r
46             m_syncInfoCb = NULL;\r
47             m_state = NSProviderState::DENY;\r
48             m_subscribedState = NSProviderSubscribedState::DENY;\r
49 \r
50             m_topicList = std::make_shared<NSTopicsList>();\r
51 \r
52             if (provider != nullptr)\r
53             {\r
54                 m_providerId.assign(provider->providerId, NS_UTILS_UUID_STRING_SIZE - 1);\r
55             }\r
56         }\r
57 \r
58         NSProvider::NSProvider(const NSProvider &provider)\r
59         {\r
60             m_providerId = provider.getProviderId();\r
61             m_topicList = std::make_shared<NSTopicsList>();\r
62             auto topicsList = provider.getTopicList();\r
63             if (topicsList != nullptr)\r
64             {\r
65                 for (auto it : topicsList->getTopicsList())\r
66                 {\r
67                     getTopicList()->addTopic(it.getTopicName(), it.getState());\r
68                 }\r
69             }\r
70             setListener(provider.getProviderStateReceivedCb(), provider.getMessageReceivedCb(),\r
71                         provider.getSyncInfoReceivedCb());\r
72             setProviderState(provider.getProviderState());\r
73             setProviderSubscribedState(provider.getProviderSubscribedState());\r
74         }\r
75 \r
76         NSProvider &NSProvider::operator=(const NSProvider &provider)\r
77         {\r
78             this->m_providerId = provider.getProviderId();\r
79             this->m_topicList = std::make_shared<NSTopicsList>();\r
80             auto topicsList = provider.getTopicList();\r
81             if (topicsList != nullptr)\r
82             {\r
83                 for (auto it : topicsList->getTopicsList())\r
84                 {\r
85                     this->getTopicList()->addTopic(it.getTopicName(), it.getState());\r
86                 }\r
87             }\r
88             this->setListener(provider.getProviderStateReceivedCb(), provider.getMessageReceivedCb(),\r
89                               provider.getSyncInfoReceivedCb());\r
90             this->setProviderState(provider.getProviderState());\r
91             this->setProviderSubscribedState(provider.getProviderSubscribedState());\r
92             return *this;\r
93         }\r
94 \r
95         std::string NSProvider::getProviderId() const\r
96         {\r
97             return m_providerId;\r
98         }\r
99 \r
100         std::shared_ptr<NSTopicsList> NSProvider::getTopicList() const\r
101         {\r
102             NS_LOG(DEBUG, "getTopicList - IN");\r
103             if (!isValid())\r
104             {\r
105                 return nullptr;\r
106             }\r
107             std::shared_ptr<NSTopicsList> topicList = std::make_shared<NSTopicsList>();\r
108             for (auto it : m_topicList->getTopicsList())\r
109             {\r
110                 topicList->addTopic(it.getTopicName(), it.getState());\r
111             }\r
112             topicList->unsetModifiability();\r
113             return topicList;\r
114         }\r
115 \r
116         NSResult NSProvider::updateTopicList(std::shared_ptr<NSTopicsList> topicList)\r
117         {\r
118             NS_LOG(DEBUG, "updateTopicList - IN");\r
119             if (!isValid())\r
120             {\r
121                 return NSResult::FAIL;\r
122             }\r
123             if (topicList == nullptr)\r
124             {\r
125                 return NSResult::ERROR;\r
126             }\r
127             NS_LOG(DEBUG, "Creating TopicLL from TopicList");\r
128             NSTopicLL *topicLL = NULL;\r
129             for (auto it : topicList->getTopicsList())\r
130             {\r
131                 NSTopicLL *topic = (NSTopicLL *) OICMalloc(sizeof(NSTopicLL));\r
132                 if (topic == nullptr)\r
133                 {\r
134                     NS_LOG(ERROR, "new NSTopicLL failed");\r
135                     return NSResult::ERROR;\r
136                 }\r
137                 topic->topicName = NULL;\r
138                 topic->topicName = OICStrdup(it.getTopicName().c_str());\r
139                 topic->state = (::NSTopicState)it.getState();\r
140                 topic->next = NULL;\r
141                 if (topicLL == NULL)\r
142                 {\r
143                     topicLL = topic;\r
144                 }\r
145                 else\r
146                 {\r
147                     NSTopicLL *iter = topicLL;\r
148                     NSTopicLL *prev = NULL;\r
149                     while (iter)\r
150                     {\r
151                         prev = iter;\r
152                         iter = (NSTopicLL *) iter->next;\r
153                     }\r
154                     prev->next = topic;\r
155                     topic->next = NULL;\r
156                 }\r
157             }\r
158             if (topicLL)\r
159             {\r
160                 NSTopicLL *iter = topicLL;\r
161                 while (iter)\r
162                 {\r
163                     NS_LOG_V(DEBUG, "Topic Name : %s", iter->topicName);\r
164                     NS_LOG_V(DEBUG, "Topic State : %d", (int) iter->state);\r
165                     iter = iter->next;\r
166                 }\r
167             }\r
168             NS_LOG_V(DEBUG, "calling Lower layer UpdateTopicList for Provider Id : %s",\r
169                      getProviderId().c_str());\r
170             NSResult result = (NSResult) NSConsumerUpdateTopicList(getProviderId().c_str(), topicLL);\r
171 \r
172             if (topicLL)\r
173             {\r
174                 NSTopicLL *iter = topicLL;\r
175                 NSTopicLL *following = NULL;\r
176 \r
177                 while (iter)\r
178                 {\r
179                     following = iter->next;\r
180                     if (iter)\r
181                     {\r
182                         NSOICFree(iter->topicName);\r
183                         iter->next = NULL;\r
184                         NSOICFree(iter);\r
185                     }\r
186                     iter = following;\r
187                 }\r
188             }\r
189             NS_LOG(DEBUG, "updateTopicList - OUT");\r
190             return result;\r
191         }\r
192 \r
193         NSProviderState NSProvider::getProviderState() const\r
194         {\r
195             NS_LOG_V(DEBUG, "getProviderState  state : %d", (int)m_state);\r
196             if (!isValid())\r
197             {\r
198                 return NSProviderState::STOPPED;\r
199             }\r
200             return m_state;\r
201         }\r
202 \r
203         NSProviderSubscribedState NSProvider::getProviderSubscribedState() const\r
204         {\r
205             NS_LOG_V(DEBUG, "getProviderSubscribedState  state : %d", (int)m_subscribedState);\r
206             if (!isValid())\r
207             {\r
208                 return NSProviderSubscribedState::DENY;\r
209             }\r
210             return m_subscribedState;\r
211         }\r
212 \r
213         NSResult NSProvider::subscribe()\r
214         {\r
215             NS_LOG(DEBUG, "Subscribe - IN");\r
216             if (!isValid())\r
217             {\r
218                 return NSResult::FAIL;\r
219             }\r
220             NSResult result = (NSResult) NSSubscribe(getProviderId().c_str());\r
221             NS_LOG(DEBUG, "Subscribe - OUT");\r
222             return result;\r
223         }\r
224 \r
225         NSResult NSProvider::unsubscribe()\r
226         {\r
227             NS_LOG(DEBUG, "unsubscribe - IN");\r
228             if (!isValid())\r
229             {\r
230                 return NSResult::FAIL;\r
231             }\r
232             NSResult result = (NSResult) NSUnsubscribe(getProviderId().c_str());\r
233             NS_LOG(DEBUG, "unsubscribe - OUT");\r
234             return result;\r
235         }\r
236 \r
237         bool NSProvider::isSubscribed()\r
238         {\r
239             NS_LOG(DEBUG, "isSubscribed - IN");\r
240             if (!isValid())\r
241             {\r
242                 return false;\r
243             }\r
244             NS_LOG_V(DEBUG, "Subscribed state : %d", (int)getProviderSubscribedState());\r
245             if (getProviderSubscribedState() == NSProviderSubscribedState::SUBSCRIBED)\r
246             {\r
247                 return true;\r
248             }\r
249             return false;\r
250         }\r
251 \r
252         NSResult NSProvider::sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type)\r
253         {\r
254             NS_LOG(DEBUG, "SendSyncInfo - IN");\r
255             if (!isValid())\r
256             {\r
257                 return NSResult::FAIL;\r
258             }\r
259             NSResult result = (NSResult) NSConsumerSendSyncInfo(getProviderId().c_str(), messageId,\r
260                               (::NSSyncType)type);\r
261             NS_LOG(DEBUG, "SendSyncInfo - OUT");\r
262             return result;\r
263         }\r
264 \r
265         void NSProvider::setListener(NSProvider::ProviderStateCallback stateHandle,\r
266                                      NSProvider::MessageReceivedCallback messageHandle,\r
267                                      NSProvider::SyncInfoReceivedCallback syncHandle)\r
268         {\r
269             NS_LOG(DEBUG, "setListener - IN");\r
270             m_stateCb = stateHandle;\r
271             m_messageCb = messageHandle;\r
272             m_syncInfoCb = syncHandle;\r
273             NS_LOG(DEBUG, "setListener - OUT");\r
274         }\r
275 \r
276         NSProvider::ProviderStateCallback NSProvider::getProviderStateReceivedCb() const\r
277         {\r
278             return m_stateCb;\r
279         }\r
280 \r
281         NSProvider::MessageReceivedCallback NSProvider::getMessageReceivedCb() const\r
282         {\r
283             return m_messageCb;\r
284         }\r
285 \r
286         NSProvider::SyncInfoReceivedCallback NSProvider::getSyncInfoReceivedCb() const\r
287         {\r
288             return m_syncInfoCb;\r
289         }\r
290 \r
291         void NSProvider::setTopicList(std::shared_ptr<NSTopicsList> topicsList)\r
292         {\r
293             m_topicList = topicsList;\r
294         }\r
295 \r
296         void NSProvider::setProviderState(const NSProviderState &providerState)\r
297         {\r
298             m_state = providerState;\r
299         }\r
300 \r
301         void NSProvider::setProviderSubscribedState(const NSProviderSubscribedState &subscribedState)\r
302         {\r
303             m_subscribedState = subscribedState;\r
304         }\r
305 \r
306         bool NSProvider::isValid() const\r
307         {\r
308             if (!NSConsumerService::getInstance()->getAcceptedProviders()->isAccepted(getProviderId()))\r
309             {\r
310                 NS_LOG(DEBUG, "Invalid Operation with stale reference of Provider. Provider ID doesnot exist");\r
311                 return false;\r
312             }\r
313             return true;\r
314         }\r
315     }\r
316 }\r