Merge remote-tracking branch 'origin/master' into notification-service
[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                 NSConsumerService::getInstance()->getConsumerConfig().m_discoverCb(nsProvider);\r
39             delete nsProvider;\r
40             NS_LOG(DEBUG, "onNSProviderDiscovered - OUT");\r
41         }\r
42 \r
43         void onNSProviderChanged(::NSProvider *provider, ::NSResponse response)\r
44         {\r
45             NS_LOG(DEBUG, "onNSProviderChanged - IN");\r
46             NS_LOG_V(DEBUG, "provider Id : %s",provider->providerId);\r
47             NS_LOG_V(DEBUG, "response : %d",(int)response);\r
48             \r
49             NSProvider *nsProvider = new NSProvider(provider);\r
50             auto changeCallback = NSConsumerService::getInstance()->getConsumerConfig().m_changedCb;\r
51             if(response == NS_ALLOW)\r
52             {\r
53                 NSConsumerService::getInstance()->getAcceptedProviders().push_back(nsProvider);\r
54                 if (changeCallback != NULL)\r
55                     changeCallback(nsProvider, (NSResponse) response);\r
56             }\r
57             else if(response == NS_DENY)\r
58             {\r
59                 NSConsumerService::getInstance()->getAcceptedProviders().remove(nsProvider);\r
60                 if (changeCallback != NULL)\r
61                     changeCallback(nsProvider, (NSResponse) response);\r
62                 delete nsProvider;\r
63             }\r
64             NS_LOG(DEBUG, "onNSProviderChanged - OUT");\r
65         }\r
66 \r
67         void onNSMessageReceived(::NSMessage *message)\r
68         {\r
69             NS_LOG(DEBUG, "onNSMessageReceived - IN");\r
70             NSMessage *nsMessage = new NSMessage(message);\r
71             for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
72             {\r
73                 if (it->getProviderId() == nsMessage->getProviderId())\r
74                 {\r
75                     auto callback = it->getMessageReceivedCb();\r
76                     if (callback != NULL)\r
77                     {\r
78                         callback(nsMessage);\r
79                     }\r
80                     break;\r
81                 }\r
82             }\r
83             delete nsMessage;\r
84             NS_LOG(DEBUG, "onNSMessageReceived - OUT");\r
85         }\r
86 \r
87         void onNSSyncInfoReceived(::NSSyncInfo *syncInfo)\r
88         {\r
89             NS_LOG(DEBUG, "onNSSyncInfoReceived - IN");\r
90             NSSyncInfo *nsSyncInfo = new NSSyncInfo(syncInfo);\r
91             for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
92             {\r
93                 if (it->getProviderId() == nsSyncInfo->getProviderId())\r
94                 {\r
95                     auto callback = it->getSyncInfoReceivedCb();\r
96                     if (callback != NULL)\r
97                     {\r
98                         callback(nsSyncInfo);\r
99                     }\r
100                     break;\r
101                 }\r
102             }\r
103             delete nsSyncInfo;\r
104             NS_LOG(DEBUG, "onNSSyncInfoReceived - OUT");\r
105         }\r
106 \r
107         NSConsumerService::NSConsumerService()\r
108         {\r
109             m_config.m_discoverCb = NULL;\r
110             m_config.m_changedCb = NULL;\r
111         }\r
112 \r
113         NSConsumerService::~NSConsumerService()\r
114         {\r
115             for (auto it : getAcceptedProviders())\r
116             {\r
117                 delete it;\r
118             }\r
119             getAcceptedProviders().clear();\r
120         }\r
121         NSConsumerService *NSConsumerService::getInstance()\r
122         {\r
123             static  NSConsumerService s_instance;\r
124             return &s_instance;\r
125         }\r
126 \r
127         void NSConsumerService::Start(NSConsumerService::ConsumerConfig config)\r
128         {\r
129             NS_LOG(DEBUG, "Start - IN");\r
130             m_config = config;\r
131             NSConsumerConfig nsConfig;\r
132             nsConfig.discoverCb = onNSProviderDiscovered;\r
133             nsConfig.changedCb= onNSProviderChanged;\r
134             nsConfig.messageCb = onNSMessageReceived;\r
135             nsConfig.syncInfoCb = onNSSyncInfoReceived;\r
136 \r
137             NSStartConsumer(nsConfig);\r
138             NS_LOG(DEBUG, "Start - OUT");\r
139             return;\r
140         }\r
141 \r
142         void NSConsumerService::Stop()\r
143         {\r
144             NS_LOG(DEBUG, "Stop - IN");\r
145             NSStopConsumer();\r
146             NS_LOG(DEBUG, "Stop - OUT");\r
147             return;\r
148         }\r
149 \r
150         NSResult NSConsumerService::EnableRemoteService(const std::string &serverAddress)\r
151         {\r
152             NS_LOG(DEBUG, "EnableRemoteService - IN");\r
153             NSResult result = NSResult::ERROR;\r
154 #ifdef WITH_CLOUD\r
155             result = (NSResult) NSConsumerEnableRemoteService(OICStrdup(serverAddress.c_str()));\r
156 #else\r
157             NS_LOG(ERROR, "Remote Services feature is not enabled in the Build");\r
158 #endif\r
159             NS_LOG(DEBUG, "EnableRemoteService - OUT");\r
160             return result;\r
161         }\r
162 \r
163         void NSConsumerService::RescanProvider()\r
164         {\r
165             NS_LOG(DEBUG, "RescanProvider - IN");\r
166             NSRescanProvider();\r
167             NS_LOG(DEBUG, "RescanProvider - OUT");\r
168             return;\r
169         }\r
170 \r
171         NSProvider *NSConsumerService::getProvider(const std::string &id)\r
172         {\r
173             for (auto it : getAcceptedProviders())\r
174             {\r
175                 if (it->getProviderId() == id)\r
176                     return it;\r
177             }\r
178             return NULL;\r
179         }\r
180 \r
181         NSConsumerService::ConsumerConfig NSConsumerService::getConsumerConfig()\r
182         {\r
183             return m_config;\r
184         }\r
185 \r
186         std::list<NSProvider *> NSConsumerService::getAcceptedProviders()\r
187         {\r
188             return m_acceptedProviders;\r
189         }\r
190     }\r
191 }\r