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