1 //******************************************************************
3 // Copyright 2014 Intel Mobile Communications GmbH All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 //******************************************************************
23 // OCPlatform_impl.cpp
25 // Description: Implementation of the OCPlatform functionality. It contains
26 // a singleton interface that is used only by the OCPlatform namespace and is the
27 // central entrance to the stack.
31 //*********************************************************************
39 #include "OCPlatform.h"
41 #include "OCException.h"
42 #include "OCUtilities.h"
44 #include "oc_logger.hpp"
49 PlatformConfig& OCPlatform_impl::globalConfig()
51 static PlatformConfig s_config;
55 void OCPlatform_impl::Configure(const PlatformConfig& config)
57 globalConfig() = config;
60 OCPlatform_impl& OCPlatform_impl::Instance()
62 static OCPlatform_impl platform(globalConfig());
66 void OCPlatform_impl::init(const PlatformConfig& config)
70 case ModeType::Server:
71 m_server = m_WrapperInstance->CreateServerWrapper(m_csdkLock, config);
74 case ModeType::Client:
75 m_client = m_WrapperInstance->CreateClientWrapper(m_csdkLock, config);
79 m_server = m_WrapperInstance->CreateServerWrapper(m_csdkLock, config);
80 m_client = m_WrapperInstance->CreateClientWrapper(m_csdkLock, config);
85 OCPlatform_impl::OCPlatform_impl(const PlatformConfig& config)
87 m_WrapperInstance { make_unique<WrapperFactory>() },
88 m_csdkLock { make_shared<std::recursive_mutex>() }
93 OCPlatform_impl::~OCPlatform_impl(void)
97 OCStackResult OCPlatform_impl::setDefaultDeviceEntityHandler(EntityHandler entityHandler)
99 return checked_guard(m_server, &IServerWrapper::setDefaultDeviceEntityHandler,
103 OCStackResult OCPlatform_impl::notifyAllObservers(OCResourceHandle resourceHandle,
104 QualityOfService QoS)
106 return result_guard(OCNotifyAllObservers(resourceHandle,
107 static_cast<OCQualityOfService>(QoS)));
110 OCStackResult OCPlatform_impl::notifyAllObservers(OCResourceHandle resourceHandle)
112 return notifyAllObservers(resourceHandle, m_cfg.QoS);
115 OCStackResult OCPlatform_impl::notifyListOfObservers(OCResourceHandle resourceHandle,
116 ObservationIds& observationIds,
117 const std::shared_ptr<OCResourceResponse> pResponse)
119 return notifyListOfObservers(resourceHandle, observationIds, pResponse, m_cfg.QoS);
122 OCStackResult OCPlatform_impl::notifyListOfObservers(OCResourceHandle resourceHandle,
123 ObservationIds& observationIds,
124 const std::shared_ptr<OCResourceResponse> pResponse,
125 QualityOfService QoS)
129 return result_guard(OC_STACK_ERROR);
132 std::string payload(pResponse->getResourceRepresentation().getJSONRepresentation());
135 OCNotifyListOfObservers(resourceHandle,
136 &observationIds[0], observationIds.size(),
137 reinterpret_cast<unsigned char *>(const_cast<char *>(payload.c_str())),
138 static_cast<OCQualityOfService>(QoS)));
142 OCResource::Ptr OCPlatform_impl::constructResourceObject(const std::string& host,
143 const std::string& uri,
144 OCConnectivityType connectivityType,
146 const std::vector<std::string>& resourceTypes,
147 const std::vector<std::string>& interfaces)
151 return std::shared_ptr<OCResource>();
154 return std::shared_ptr<OCResource>(new OCResource(m_client,
156 uri, "", connectivityType,
162 OCStackResult OCPlatform_impl::findResource(const std::string& host,
163 const std::string& resourceName,
164 OCConnectivityType connectivityType,
165 FindCallback resourceHandler)
167 return findResource(host, resourceName, connectivityType, resourceHandler, m_cfg.QoS);
170 OCStackResult OCPlatform_impl::findResource(const std::string& host,
171 const std::string& resourceName,
172 OCConnectivityType connectivityType,
173 FindCallback resourceHandler, QualityOfService QoS)
176 return checked_guard(m_client, &IClientWrapper::ListenForResource,
177 host, resourceName, connectivityType, resourceHandler, QoS);
180 OCStackResult OCPlatform_impl::getDeviceInfo(const std::string& host,
181 const std::string& deviceURI,
182 OCConnectivityType connectivityType,
183 FindDeviceCallback deviceInfoHandler)
185 return result_guard(getDeviceInfo(host, deviceURI, connectivityType,
186 deviceInfoHandler, m_cfg.QoS));
189 OCStackResult OCPlatform_impl::getDeviceInfo(const std::string& host,
190 const std::string& deviceURI,
191 OCConnectivityType connectivityType,
192 FindDeviceCallback deviceInfoHandler,
193 QualityOfService QoS)
195 return checked_guard(m_client, &IClientWrapper::ListenForDevice,
196 host, deviceURI, connectivityType, deviceInfoHandler, QoS);
200 OCResource::Ptr OCPlatform_impl::constructResourceObject(const std::string& host,
201 const std::string& uri,
203 const std::vector<std::string>& resourceTypes,
204 const std::vector<std::string>& interfaces)
208 return std::shared_ptr<OCResource>();
211 return std::shared_ptr<OCResource>(new OCResource(m_client,
214 "", // 'created' Resources have no way of knowing their
215 // server ID, so this has to be blank initially.
221 OCStackResult OCPlatform_impl::findResource(const std::string& host,
222 const std::string& resourceName,
223 FindCallback resourceHandler)
225 return findResource(host, resourceName, resourceHandler, m_cfg.QoS);
228 OCStackResult OCPlatform_impl::findResource(const std::string& host,
229 const std::string& resourceName,
230 FindCallback resourceHandler, QualityOfService QoS)
233 return checked_guard(m_client, &IClientWrapper::ListenForResource,
234 host, resourceName, resourceHandler, QoS);
237 OCStackResult OCPlatform_impl::getDeviceInfo(const std::string& host,
238 const std::string& deviceURI,
239 FindDeviceCallback deviceInfoHandler)
241 return result_guard(getDeviceInfo(host, deviceURI, deviceInfoHandler, m_cfg.QoS));
244 OCStackResult OCPlatform_impl::getDeviceInfo(const std::string& host,
245 const std::string& deviceURI,
246 FindDeviceCallback deviceInfoHandler,
247 QualityOfService QoS)
249 return checked_guard(m_client, &IClientWrapper::ListenForDevice,
250 host, deviceURI, deviceInfoHandler, QoS);
255 OCStackResult OCPlatform_impl::registerResource(OCResourceHandle& resourceHandle,
256 std::string& resourceURI,
257 const std::string& resourceTypeName,
258 const std::string& resourceInterface,
259 EntityHandler entityHandler,
260 uint8_t resourceProperty)
262 return checked_guard(m_server, &IServerWrapper::registerResource,
263 ref(resourceHandle), resourceURI, resourceTypeName,
264 resourceInterface, entityHandler, resourceProperty);
267 OCStackResult OCPlatform_impl::registerDeviceInfo(const OCDeviceInfo deviceInfo)
269 return checked_guard(m_server, &IServerWrapper::registerDeviceInfo, deviceInfo);
272 OCStackResult OCPlatform_impl::registerResource(OCResourceHandle& resourceHandle,
273 const std::shared_ptr< OCResource > resource)
275 uint8_t resourceProperty = OC_DISCOVERABLE | OC_OBSERVABLE;
276 std::vector<std::string> resourceTypes = resource->getResourceTypes();
278 return checked_guard(m_server, &IServerWrapper::registerResourceWithHost,
279 ref(resourceHandle), resource->host(), resource->uri(), resourceTypes[0]/*"core.remote"*/, "oc.mi.def",
280 (EntityHandler) nullptr, resourceProperty);
283 OCStackResult OCPlatform_impl::unregisterResource(const OCResourceHandle& resourceHandle) const
285 return checked_guard(m_server, &IServerWrapper::unregisterResource,
289 OCStackResult OCPlatform_impl::unbindResource(OCResourceHandle collectionHandle,
290 OCResourceHandle resourceHandle)
292 return result_guard(OCUnBindResource(ref(collectionHandle), ref(resourceHandle)));
295 OCStackResult OCPlatform_impl::unbindResources(const OCResourceHandle collectionHandle,
296 const std::vector<OCResourceHandle>& resourceHandles)
298 for(const auto& h : resourceHandles)
302 if(OC_STACK_OK != (r = result_guard(OCUnBindResource(collectionHandle, h))))
311 OCStackResult OCPlatform_impl::bindResource(const OCResourceHandle collectionHandle,
312 const OCResourceHandle resourceHandle)
314 return result_guard(OCBindResource(collectionHandle, resourceHandle));
317 OCStackResult OCPlatform_impl::bindResources(const OCResourceHandle collectionHandle,
318 const std::vector<OCResourceHandle>& resourceHandles)
320 for(const auto& h : resourceHandles)
324 if(OC_STACK_OK != (r = result_guard(OCBindResource(collectionHandle, h))))
333 OCStackResult OCPlatform_impl::bindTypeToResource(const OCResourceHandle& resourceHandle,
334 const std::string& resourceTypeName) const
336 return checked_guard(m_server, &IServerWrapper::bindTypeToResource,
337 resourceHandle, resourceTypeName);
340 OCStackResult OCPlatform_impl::bindInterfaceToResource(const OCResourceHandle& resourceHandle,
341 const std::string& resourceInterfaceName) const
343 return checked_guard(m_server, &IServerWrapper::bindInterfaceToResource,
344 resourceHandle, resourceInterfaceName);
347 OCStackResult OCPlatform_impl::startPresence(const unsigned int announceDurationSeconds)
349 return checked_guard(m_server, &IServerWrapper::startPresence,
350 announceDurationSeconds);
353 OCStackResult OCPlatform_impl::stopPresence()
355 return checked_guard(m_server, &IServerWrapper::stopPresence);
359 OCStackResult OCPlatform_impl::subscribePresence(OCPresenceHandle& presenceHandle,
360 const std::string& host,
361 OCConnectivityType connectivityType,
362 SubscribeCallback presenceHandler)
364 return subscribePresence(presenceHandle, host, "", connectivityType, presenceHandler);
368 OCStackResult OCPlatform_impl::subscribePresence(OCPresenceHandle& presenceHandle,
369 const std::string& host,
370 const std::string& resourceType,
371 OCConnectivityType connectivityType,
372 SubscribeCallback presenceHandler)
374 return checked_guard(m_client, &IClientWrapper::SubscribePresence,
375 &presenceHandle, host, resourceType, connectivityType,
379 OCStackResult OCPlatform_impl::subscribePresence(OCPresenceHandle& presenceHandle,
380 const std::string& host,
381 SubscribeCallback presenceHandler)
383 return subscribePresence(presenceHandle, host, "", presenceHandler);
386 OCStackResult OCPlatform_impl::subscribePresence(OCPresenceHandle& presenceHandle,
387 const std::string& host,
388 const std::string& resourceType,
389 SubscribeCallback presenceHandler)
391 return checked_guard(m_client, &IClientWrapper::SubscribePresence,
392 &presenceHandle, host, resourceType,
397 OCStackResult OCPlatform_impl::unsubscribePresence(OCPresenceHandle presenceHandle)
399 return checked_guard(m_client, &IClientWrapper::UnsubscribePresence,
400 ref(presenceHandle));
403 OCStackResult OCPlatform_impl::sendResponse(const std::shared_ptr<OCResourceResponse> pResponse)
405 return checked_guard(m_server, &IServerWrapper::sendResponse,