1. Modified the Accepted Providers Consumers list to return references
[platform/upstream/iotivity.git] / service / notification / cpp-wrapper / consumer / src / NSConsumerService.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 "NSConsumerService.h"\r
22 #include <cstring>\r
23 #include "NSConsumerInterface.h"\r
24 #include "NSMessage.h"\r
25 #include "NSCommon.h"\r
26 #include "NSConstants.h"\r
27 #include "oic_string.h"\r
28 \r
29 namespace OIC\r
30 {\r
31     namespace Service\r
32     {\r
33         void onNSProviderDiscovered(::NSProvider *provider)\r
34         {\r
35             NS_LOG(DEBUG, "onNSProviderDiscovered - IN");\r
36             NSProvider *nsProvider = new NSProvider(provider);\r
37             if (NSConsumerService::getInstance()->getConsumerConfig().m_discoverCb != NULL)\r
38             {\r
39                 NS_LOG(DEBUG, "initiating the callback");\r
40                 NSConsumerService::getInstance()->getConsumerConfig().m_discoverCb(nsProvider);\r
41             }\r
42             delete nsProvider;\r
43             NS_LOG(DEBUG, "onNSProviderDiscovered - OUT");\r
44         }\r
45 \r
46         void onNSProviderChanged(::NSProvider *provider, ::NSResponse response)\r
47         {\r
48             NS_LOG(DEBUG, "onNSProviderChanged - IN");\r
49             NS_LOG_V(DEBUG, "provider Id : %s", provider->providerId);\r
50             NS_LOG_V(DEBUG, "response : %d", (int)response);\r
51 \r
52             NSProvider *nsProvider = new NSProvider(provider);\r
53             auto changeCallback = NSConsumerService::getInstance()->getConsumerConfig().m_changedCb;\r
54             if (response == NS_ALLOW)\r
55             {\r
56                 NSConsumerService::getInstance()->getAcceptedProviders().push_back(nsProvider);\r
57                 if (changeCallback != NULL)\r
58                 {\r
59                     NS_LOG(DEBUG, "initiating the callback for Response : ALLOW");\r
60                     changeCallback(nsProvider, (NSResponse) response);\r
61                 }\r
62             }\r
63             else if (response == NS_DENY)\r
64             {\r
65                 NSConsumerService::getInstance()->getAcceptedProviders().remove(nsProvider);\r
66                 if (changeCallback != NULL)\r
67                 {\r
68                     NS_LOG(DEBUG, "initiating the callback for Response : NS_DENY");\r
69                     changeCallback(nsProvider, (NSResponse) response);\r
70                 }\r
71                 delete nsProvider;\r
72             }\r
73             else if (response == NS_TOPIC)\r
74             {\r
75                 NSProvider *oldProvider = NSConsumerService::getInstance()->getProvider(\r
76                                               nsProvider->getProviderId());\r
77                 if (oldProvider != nullptr)\r
78                 {\r
79                     NS_LOG(DEBUG, "Provider with same Id exists. updating the Topics data");\r
80                     nsProvider->setListener(oldProvider->getMessageReceivedCb(), oldProvider->getSyncInfoReceivedCb());\r
81                     NSConsumerService::getInstance()->getAcceptedProviders().remove(oldProvider);\r
82                     NSConsumerService::getInstance()->getAcceptedProviders().push_back(nsProvider);\r
83                     if (changeCallback != NULL)\r
84                     {\r
85                         NS_LOG(DEBUG, "initiating the callback for Response : NS_TOPIC");\r
86                         changeCallback(nsProvider, (NSResponse) response);\r
87                     }\r
88                     delete oldProvider;\r
89                 }\r
90             }\r
91             NS_LOG(DEBUG, "onNSProviderChanged - OUT");\r
92         }\r
93 \r
94         void onNSMessageReceived(::NSMessage *message)\r
95         {\r
96             NS_LOG(DEBUG, "onNSMessageReceived - IN");\r
97             NSMessage *nsMessage = new NSMessage(message);\r
98             for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
99             {\r
100                 if (it->getProviderId() == nsMessage->getProviderId())\r
101                 {\r
102                     NS_LOG(DEBUG, "Found Provider with given ID");\r
103                     auto callback = it->getMessageReceivedCb();\r
104                     if (callback != NULL)\r
105                     {\r
106                         NS_LOG(DEBUG, "initiating the callback for messageReceived");\r
107                         callback(nsMessage);\r
108                     }\r
109                     break;\r
110                 }\r
111             }\r
112             delete nsMessage;\r
113             NS_LOG(DEBUG, "onNSMessageReceived - OUT");\r
114         }\r
115 \r
116         void onNSSyncInfoReceived(::NSSyncInfo *syncInfo)\r
117         {\r
118             NS_LOG(DEBUG, "onNSSyncInfoReceived - IN");\r
119             NSSyncInfo *nsSyncInfo = new NSSyncInfo(syncInfo);\r
120             for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
121             {\r
122                 if (it->getProviderId() == nsSyncInfo->getProviderId())\r
123                 {\r
124                     NS_LOG(DEBUG, "Found Provider with given ID");\r
125                     auto callback = it->getSyncInfoReceivedCb();\r
126                     if (callback != NULL)\r
127                     {\r
128                         NS_LOG(DEBUG, "initiating the callback for SyncInfoReceived");\r
129                         callback(nsSyncInfo);\r
130                     }\r
131                     break;\r
132                 }\r
133             }\r
134             delete nsSyncInfo;\r
135             NS_LOG(DEBUG, "onNSSyncInfoReceived - OUT");\r
136         }\r
137 \r
138         NSConsumerService::NSConsumerService()\r
139         {\r
140             m_config.m_discoverCb = NULL;\r
141             m_config.m_changedCb = NULL;\r
142         }\r
143 \r
144         NSConsumerService::~NSConsumerService()\r
145         {\r
146             for (auto it : getAcceptedProviders())\r
147             {\r
148                 delete it;\r
149             }\r
150             getAcceptedProviders().clear();\r
151         }\r
152         NSConsumerService *NSConsumerService::getInstance()\r
153         {\r
154             static  NSConsumerService s_instance;\r
155             return &s_instance;\r
156         }\r
157 \r
158         void NSConsumerService::Start(NSConsumerService::ConsumerConfig config)\r
159         {\r
160             NS_LOG(DEBUG, "Start - IN");\r
161             m_config = config;\r
162             NSConsumerConfig nsConfig;\r
163             nsConfig.discoverCb = onNSProviderDiscovered;\r
164             nsConfig.changedCb = onNSProviderChanged;\r
165             nsConfig.messageCb = onNSMessageReceived;\r
166             nsConfig.syncInfoCb = onNSSyncInfoReceived;\r
167 \r
168             NSStartConsumer(nsConfig);\r
169             NS_LOG(DEBUG, "Start - OUT");\r
170             return;\r
171         }\r
172 \r
173         void NSConsumerService::Stop()\r
174         {\r
175             NS_LOG(DEBUG, "Stop - IN");\r
176             NSStopConsumer();\r
177             NS_LOG(DEBUG, "Stop - OUT");\r
178             return;\r
179         }\r
180 \r
181         NSResult NSConsumerService::EnableRemoteService(const std::string &serverAddress)\r
182         {\r
183             NS_LOG(DEBUG, "EnableRemoteService - IN");\r
184             NSResult result = NSResult::ERROR;\r
185 #ifdef WITH_CLOUD\r
186             result = (NSResult) NSConsumerEnableRemoteService(OICStrdup(serverAddress.c_str()));\r
187 #else\r
188             NS_LOG(ERROR, "Remote Services feature is not enabled in the Build");\r
189 #endif\r
190             NS_LOG(DEBUG, "EnableRemoteService - OUT");\r
191             return result;\r
192         }\r
193 \r
194         void NSConsumerService::RescanProvider()\r
195         {\r
196             NS_LOG(DEBUG, "RescanProvider - IN");\r
197             NSRescanProvider();\r
198             NS_LOG(DEBUG, "RescanProvider - OUT");\r
199             return;\r
200         }\r
201 \r
202         NSProvider *NSConsumerService::getProvider(const std::string &id)\r
203         {\r
204             for (auto it : getAcceptedProviders())\r
205             {\r
206                 if (it->getProviderId() == id)\r
207                 {\r
208                     NS_LOG(DEBUG, "getProvider : Found Provider with given ID");\r
209                     return it;\r
210                 }\r
211             }\r
212             NS_LOG(DEBUG, "getProvider : Not Found Provider with given ID");\r
213             return NULL;\r
214         }\r
215 \r
216         NSMessage *NSConsumerService::getMessage(uint64_t messageId)\r
217         {\r
218             NS_LOG(DEBUG, "getMessage - IN");\r
219             ::NSMessage *message = NSConsumerGetMessage(messageId);\r
220             NSMessage *nsMessage = new NSMessage(message);\r
221 \r
222             delete message->mediaContents;\r
223             delete message;\r
224             NS_LOG(DEBUG, "getMessage - OUT");\r
225             return nsMessage;\r
226         }\r
227 \r
228         NSConsumerService::ConsumerConfig NSConsumerService::getConsumerConfig()\r
229         {\r
230             return m_config;\r
231         }\r
232 \r
233         std::list<NSProvider *>& NSConsumerService::getAcceptedProviders()\r
234         {\r
235             return m_acceptedProviders;\r
236         }\r
237     }\r
238 }\r