c4d72699926f9fb24b5108aadfdaa4dcb880b0b6
[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_topicList = new NSTopicsList();\r
47 \r
48             if (provider != nullptr)\r
49             {\r
50                 m_providerId.assign(provider->providerId, NS_UTILS_UUID_STRING_SIZE - 1);\r
51             }\r
52         }\r
53 \r
54         NSProvider::NSProvider(const NSProvider &provider)\r
55         {\r
56             m_providerId = provider.getProviderId();\r
57             auto topicsList = provider.getTopicList();\r
58             if (topicsList != nullptr)\r
59             {\r
60                 for (auto it : topicsList->getTopicsList())\r
61                 {\r
62                     getTopicList()->addTopic(it->getTopicName(), it->getState());\r
63                 }\r
64             }\r
65             setListener(provider.getProviderStateReceivedCb(), provider.getMessageReceivedCb(),\r
66                         provider.getSyncInfoReceivedCb());\r
67             setProviderState(provider.getProviderState());\r
68         }\r
69 \r
70         NSProvider &NSProvider::operator=(const NSProvider &provider)\r
71         {\r
72             m_providerId = provider.getProviderId();\r
73             auto topicsList = provider.getTopicList();\r
74             if (topicsList != nullptr)\r
75             {\r
76                 for (auto it : topicsList->getTopicsList())\r
77                 {\r
78                     getTopicList()->addTopic(it->getTopicName(), it->getState());\r
79                 }\r
80             }\r
81             setListener(provider.getProviderStateReceivedCb(), provider.getMessageReceivedCb(),\r
82                         provider.getSyncInfoReceivedCb());\r
83             setProviderState(provider.getProviderState());\r
84             return *this;\r
85         }\r
86 \r
87         NSProvider::~NSProvider()\r
88         {\r
89             if (m_topicList != nullptr)\r
90                 delete m_topicList;\r
91         }\r
92 \r
93         std::string NSProvider::getProviderId() const\r
94         {\r
95             return m_providerId;\r
96         }\r
97 \r
98         NSTopicsList *NSProvider::getTopicList() const\r
99         {\r
100             NS_LOG(DEBUG, "getTopicList - IN");\r
101             return m_topicList;\r
102         }\r
103 \r
104         NSResult NSProvider::updateTopicList(NSTopicsList *topicList)\r
105         {\r
106             NS_LOG(DEBUG, "updateTopicList - IN");\r
107             if (topicList == nullptr)\r
108                 return NSResult::ERROR;\r
109             for (auto it : topicList->getTopicsList())\r
110             {\r
111                 NS_LOG_V(DEBUG, "Topic Name : %s", it->getTopicName().c_str());\r
112                 NS_LOG_V(DEBUG, "Topic State : %d", (int) it->getState());\r
113             }\r
114             NS_LOG(DEBUG, "Creating TopicLL from TopicList");\r
115             NSTopicLL *topicLL = NULL;\r
116             for (auto it : topicList->getTopicsList())\r
117             {\r
118                 NSTopicLL *topic = (NSTopicLL *) OICMalloc(sizeof(NSTopicLL));\r
119                 if (topic == nullptr)\r
120                 {\r
121                     NS_LOG(ERROR, "new NSTopicLL failed");\r
122                     return NSResult::ERROR;\r
123                 }\r
124                 topic->topicName = NULL;\r
125                 topic->topicName = OICStrdup(it->getTopicName().c_str());\r
126                 topic->state = (::NSTopicState)it->getState();\r
127                 topic->next = NULL;\r
128                 if (topicLL == NULL)\r
129                 {\r
130                     topicLL = topic;\r
131                 }\r
132                 else\r
133                 {\r
134                     NSTopicLL *iter = topicLL;\r
135                     NSTopicLL *prev = NULL;\r
136                     while (iter)\r
137                     {\r
138                         prev = iter;\r
139                         iter = (NSTopicLL *) iter->next;\r
140                     }\r
141                     prev->next = topic;\r
142                     topic->next = NULL;\r
143                 }\r
144             }\r
145             if (topicLL)\r
146             {\r
147                 NSTopicLL *iter = topicLL;\r
148                 while (iter)\r
149                 {\r
150                     NS_LOG_V(DEBUG, "Topic Name : %s", iter->topicName);\r
151                     NS_LOG_V(DEBUG, "Topic State : %d", iter->state);\r
152                     iter = iter->next;\r
153                 }\r
154             }\r
155             NS_LOG_V(DEBUG, "calling Lower layer UpdateTopicList for Provider Id : %s",\r
156                      getProviderId().c_str());\r
157             NSResult result = (NSResult) NSConsumerUpdateTopicList(getProviderId().c_str(), topicLL);\r
158             NS_LOG(DEBUG, "updateTopicList - OUT");\r
159             return result;\r
160         }\r
161 \r
162         NSProviderState NSProvider::getProviderState() const\r
163         {\r
164             NS_LOG_V(DEBUG, "getProviderState  state : %d", (int)m_state);\r
165             return m_state;\r
166         }\r
167 \r
168         void NSProvider::subscribe()\r
169         {\r
170             NS_LOG(DEBUG, "Subscribe - IN");\r
171             NSSubscribe(getProviderId().c_str());\r
172             NS_LOG(DEBUG, "Subscribe - OUT");\r
173         }\r
174 \r
175         bool NSProvider::isSubscribed()\r
176         {\r
177             NS_LOG(DEBUG, "isSubscribed - IN");\r
178             auto state = getProviderState();\r
179             NS_LOG_V(DEBUG, "state : %d", (int)state);\r
180             if ((state == NSProviderState::ALLOW) || (state == NSProviderState::TOPIC) )\r
181                 return true;\r
182             return false;\r
183         }\r
184 \r
185         void NSProvider::sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type)\r
186         {\r
187             NS_LOG(DEBUG, "SendSyncInfo - IN");\r
188             NSConsumerSendSyncInfo(m_providerId.c_str(), messageId, (::NSSyncType)type);\r
189             NS_LOG(DEBUG, "SendSyncInfo - OUT");\r
190             return;\r
191         }\r
192 \r
193         void NSProvider::setListener(NSProvider::ProviderStateCallback stateHandle,\r
194                                      NSProvider::MessageReceivedCallback messageHandle,\r
195                                      NSProvider::SyncInfoReceivedCallback syncHandle)\r
196         {\r
197             NS_LOG(DEBUG, "setListener - IN");\r
198             m_stateCb = stateHandle;\r
199             m_messageCb = messageHandle;\r
200             m_syncInfoCb = syncHandle;\r
201             NS_LOG(DEBUG, "setListener - OUT");\r
202         }\r
203 \r
204         NSProvider::ProviderStateCallback NSProvider::getProviderStateReceivedCb() const\r
205         {\r
206             return m_stateCb;\r
207         }\r
208 \r
209         NSProvider::MessageReceivedCallback NSProvider::getMessageReceivedCb() const\r
210         {\r
211             return m_messageCb;\r
212         }\r
213 \r
214         NSProvider::SyncInfoReceivedCallback NSProvider::getSyncInfoReceivedCb() const\r
215         {\r
216             return m_syncInfoCb;\r
217         }\r
218 \r
219         void NSProvider::setTopicList(NSTopicsList *topicsList)\r
220         {\r
221             if (m_topicList != nullptr)\r
222                 delete m_topicList;\r
223             m_topicList = topicsList;\r
224         }\r
225 \r
226         void NSProvider::setProviderState(const NSProviderState &providerState)\r
227         {\r
228             m_state = providerState;\r
229         }\r
230     }\r
231 }\r