1 //******************************************************************
3 // Copyright 2015 Samsung Electronics 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 #include "ResourceClient.h"
22 #include "ResourceBroker.h"
23 #include "ResourceCacheManager.h"
25 #define CLIENT_W_TAG PCF("ResourceClient")
27 using namespace OIC::Service;
31 ResourceState getResourceStateFromBrokerState(BROKER_STATE state)
34 OC_LOG(DEBUG, CLIENT_W_TAG, "getResourceStateFromBrokerState entry");
36 if (state == BROKER_STATE::ALIVE)
38 return ResourceState::ALIVE;
40 else if (state == BROKER_STATE::REQUESTED)
42 return ResourceState::REQUESTED;
44 else if (state == BROKER_STATE::LOST_SIGNAL)
46 return ResourceState::LOST_SIGNAL;
48 else if (state == BROKER_STATE::DESTROYED)
50 return ResourceState::DESTROYED;
53 OC_LOG(ERROR, CLIENT_W_TAG, "getResourceStateFromBrokerState ERROR");
55 //Default return value
56 return ResourceState::DESTROYED;
59 CacheState getCacheState(CACHE_STATE state)
62 OC_LOG(DEBUG, CLIENT_W_TAG, "getCacheState (from CACHE_STATE) entry");
64 if (state == CACHE_STATE::READY)
66 return CacheState::READY;
68 else if (state == CACHE_STATE::READY_YET)
70 return CacheState::READY_YET;
72 else if (state == CACHE_STATE::LOST_SIGNAL)
74 return CacheState::LOST_SIGNAL;
76 else if (state == CACHE_STATE::DESTROYED)
78 return CacheState::DESTROYED;
80 else if (state == CACHE_STATE::UPDATING)
82 return CacheState::UPDATING;
84 else if (state == CACHE_STATE::NONE)
86 return CacheState::NONE;
88 OC_LOG(ERROR, CLIENT_W_TAG, "getCacheState (from CACHE_STATE) ERROR");
90 //Default return value
91 return CacheState::NONE;
94 OCStackResult hostingCallback(BROKER_STATE state,
95 RemoteResourceObject::ResourceStateChangedCallback onResourceStateChanged)
97 OC_LOG(DEBUG, CLIENT_W_TAG, "hostingCallback entry");
99 ResourceState resourceState = getResourceStateFromBrokerState(state);
100 onResourceStateChanged(resourceState); //passing ResourceState to application
102 OC_LOG(DEBUG, CLIENT_W_TAG, "hostingCallback exit");
106 OCStackResult cachingCallback(std::shared_ptr<PrimitiveResource> resource,
107 const ResourceAttributes &data,
108 RemoteResourceObject::CacheUpdatedCallback onCacheUpdated)
110 OC_LOG(DEBUG, CLIENT_W_TAG, "cachingCallback entry");
112 onCacheUpdated(data); //passing ResourceAttributes to application
114 OC_LOG(DEBUG, CLIENT_W_TAG, "cachingCallback exit");
118 void setCallback(const HeaderOptions &header, const ResponseStatement &response, int n,
119 RemoteResourceObject::RemoteAttributesSetCallback onRemoteAttributesSet)
121 OC_LOG(DEBUG, CLIENT_W_TAG, "setCallback entry");
123 const ResourceAttributes &attributes = response.getAttributes();
124 onRemoteAttributesSet(attributes); //passing ResourceAttributes to application
126 OC_LOG(DEBUG, CLIENT_W_TAG, "setCallback exit");
129 void getCallback(const HeaderOptions &headerOption, const ResponseStatement &response, int n,
130 RemoteResourceObject::RemoteAttributesReceivedCallback onRemoteAttributesReceived)
132 OC_LOG(DEBUG, CLIENT_W_TAG, "getCallback entry");
134 const ResourceAttributes &attributes = response.getAttributes();
135 onRemoteAttributesReceived(attributes); //passing ResourceAttributes to application
137 OC_LOG(DEBUG, CLIENT_W_TAG, "getCallback exit");
140 void findCallback(std::shared_ptr<PrimitiveResource> primitiveResource,
141 DiscoveryManager::OnResourceDiscoveredCallback OnResourceDiscovered )
143 OC_LOG(DEBUG, CLIENT_W_TAG, "findCallback entry");
145 if (nullptr == primitiveResource)
147 OC_LOG(ERROR, CLIENT_W_TAG, "findCallback::primitiveResource NULL Parameter");
151 std::shared_ptr< RemoteResourceObject> primitiveClientResource =
152 std::shared_ptr< RemoteResourceObject>(new RemoteResourceObject(primitiveResource));
154 OnResourceDiscovered(primitiveClientResource); //passing PrimitiveClientResource to application
156 OC_LOG(DEBUG, CLIENT_W_TAG, "findcb exit");
161 //*******************************Primitive Client Resource*************************************
168 RemoteResourceObject:: RemoteResourceObject(std::shared_ptr<PrimitiveResource> pResource) :
169 m_watchingFlag(false), m_cachingFlag(false), m_observableFlag(pResource->isObservable()),
170 m_primitiveResource(pResource), m_cacheId(0), m_brokerId(0) {}
172 bool RemoteResourceObject::isWatching() const
174 return m_watchingFlag;
177 bool RemoteResourceObject::isCaching() const
179 return m_cachingFlag;
182 void RemoteResourceObject::startWatching(ResourceStateChangedCallback cb)
184 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::startWatching entry");
185 if (true == m_watchingFlag)
187 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::startWatching : Already started");
193 BrokerID brokerId = ResourceBroker::getInstance()->hostResource(m_primitiveResource,
194 std::bind(hostingCallback, std::placeholders::_1,
196 m_watchingFlag = true;
197 m_brokerId = brokerId;
199 catch (InvalidParameterException exception )
201 throw InvalidParameterException {exception.what()};
204 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::startWatching exit");
207 void RemoteResourceObject::stopWatching()
209 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::stopWatching entry");
210 if (true == m_watchingFlag)
214 ResourceBroker::getInstance()->cancelHostResource(m_brokerId);
215 m_watchingFlag = false;
217 catch (InvalidParameterException exception )
219 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::stopWatching InvalidParameterException");
224 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject:: stopWatching : already terminated");
227 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::stopWatching exit");
230 ResourceState RemoteResourceObject::getState() const
232 OC_LOG(DEBUG, CLIENT_W_TAG, " RemoteResourceObject::getState entry");
235 BROKER_STATE brokerState = ResourceBroker::getInstance()->getResourceState(m_primitiveResource);
236 OC_LOG(DEBUG, CLIENT_W_TAG, " RemoteResourceObject::getState exit");
237 return getResourceStateFromBrokerState(brokerState);
239 catch (InvalidParameterException exception)
241 OC_LOG(DEBUG, CLIENT_W_TAG, " RemoteResourceObject::getState InvalidParameterException");
245 void RemoteResourceObject::startCaching()
247 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::startCaching entry");
248 if (true == m_cachingFlag)
250 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::startCaching : already Started");
256 CacheID cacheId = ResourceCacheManager::getInstance()->requestResourceCache(m_primitiveResource,
257 NULL, REPORT_FREQUENCY::NONE, 0);
260 m_cachingFlag = true;
261 OC_LOG_V(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::startCaching CACHE ID %d", cacheId);
263 catch (InvalidParameterException e)
265 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::startCaching InvalidParameterException");
268 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::startCaching exit");
271 void RemoteResourceObject::startCaching(CacheUpdatedCallback cb)
273 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::startCaching entry");
274 if (true == m_cachingFlag)
276 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::startCaching : already Started");
282 CacheID cacheId = ResourceCacheManager::getInstance()->requestResourceCache(m_primitiveResource,
283 std::bind(cachingCallback, std::placeholders::_1, std::placeholders::_2, cb),
284 REPORT_FREQUENCY::UPTODATE, 0);
287 m_cachingFlag = true;
288 OC_LOG_V(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::startCaching CACHE ID %d", cacheId);
290 catch (InvalidParameterException e)
292 throw InvalidParameterException { e.what() };
297 void RemoteResourceObject::stopCaching()
299 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::stopCaching entry");
301 if (true == m_cachingFlag)
305 ResourceCacheManager::getInstance()->cancelResourceCache(m_cacheId);
306 m_cachingFlag = false;
308 catch (InvalidParameterException exception)
310 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::stopCaching InvalidParameterException");
315 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject:: Caching already terminated");
318 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::stopCaching exit");
321 CacheState RemoteResourceObject::getResourceCacheState()
323 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::getResourceCacheState entry");
326 CACHE_STATE cacheState = ResourceCacheManager::getInstance()->getResourceCacheState(
327 m_primitiveResource);
328 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::getResourceCacheState exit");
329 return getCacheState(cacheState);
331 catch (InvalidParameterException exception)
333 OC_LOG(DEBUG, CLIENT_W_TAG,
334 "RemoteResourceObject::getResourceCacheState InvalidParameterException");
338 void RemoteResourceObject::refreshCache()
340 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::refreshCache entry");
344 ResourceCacheManager::getInstance()->updateResourceCache(
345 m_primitiveResource);
347 catch (InvalidParameterException exception)
349 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::refreshCache InvalidParameterException");
351 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::refreshCache exit");
354 ResourceAttributes RemoteResourceObject:: getCachedAttributes() const
356 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject :: getCachedAttributes ");
359 return ResourceCacheManager::getInstance()->getCachedData(m_primitiveResource);
361 catch (InvalidParameterException e)
363 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::getCachedAttributes InvalidParameterException");
367 ResourceAttributes::Value RemoteResourceObject:: getCachedAttribute( const std::string &key)
369 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject :: getCachedAttribute entry");
372 ResourceAttributes Cachedattributes = ResourceCacheManager::getInstance()->getCachedData(
373 m_primitiveResource);
374 return Cachedattributes[key];
376 catch (InvalidParameterException e)
378 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::getCachedAttribute InvalidParameterException");
380 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject :: getCachedAttribute exit");
383 std::string RemoteResourceObject::getUri() const
385 return m_primitiveResource->getUri();
388 std::string RemoteResourceObject::getAddress() const
390 return m_primitiveResource->getHost();
393 std::vector < std::string > RemoteResourceObject::getTypes() const
395 return m_primitiveResource->getTypes();
398 std::vector < std::string > RemoteResourceObject::getInterfaces() const
400 return m_primitiveResource->getInterfaces();
403 void RemoteResourceObject::getRemoteAttributes(RemoteAttributesReceivedCallback cb)
405 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::getRemoteAttributes entry");
407 m_primitiveResource->requestGet(std::bind(getCallback, std::placeholders::_1,
408 std::placeholders::_2, std::placeholders::_3, cb));
410 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::getRemoteAttributes exit");
413 void RemoteResourceObject::setRemoteAttributes(ResourceAttributes &attribute,
414 RemoteAttributesSetCallback cb)
416 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::setRemoteAttributes entry");
418 m_primitiveResource->requestSet(attribute, std::bind(setCallback, std::placeholders::_1,
419 std::placeholders::_2, std::placeholders::_3, cb));
421 OC_LOG(DEBUG, CLIENT_W_TAG, "RemoteResourceObject::setRemoteAttributes exit");
424 bool RemoteResourceObject::isObservable() const
426 return m_observableFlag;
429 //*******************************Discovery Manager****************************************
431 DiscoveryManager *DiscoveryManager:: getInstance()
433 OC_LOG(DEBUG, CLIENT_W_TAG, "DiscoveryManager:: getInstance entry");
434 static DiscoveryManager *s_instance;
435 static std::mutex s_mutex;
438 std::lock_guard<std::mutex> lock(s_mutex);
441 s_instance = new DiscoveryManager();
444 OC_LOG(DEBUG, CLIENT_W_TAG, "DiscoveryManager:: getInstance exit");
448 void DiscoveryManager::discoverResource(std::string host, std::string resourceURI,
449 OCConnectivityType connectivityType,
450 OnResourceDiscoveredCallback cb)
453 OC_LOG(DEBUG, CLIENT_W_TAG, "DiscoveryManager::discoverResource entry");
455 if ( resourceURI.empty() )
457 OC_LOG(ERROR, CLIENT_W_TAG, "discoverResource NULL resourceURI");
458 throw InvalidParameterException { "discoverResource NULL resourceURI'" };
462 OC_LOG(ERROR, CLIENT_W_TAG, "discoverResource NULL Callback");
463 throw InvalidParameterException { "discoverResource NULL Callback'" };
465 OIC::Service::discoverResource(host, resourceURI, connectivityType, std::bind(findCallback,
466 std::placeholders::_1,
469 OC_LOG(DEBUG, CLIENT_W_TAG, "DiscoveryManager::discoverResource exit");