}
OCStackResult cachingCallback(std::shared_ptr< PrimitiveResource >,
- const RCSResourceAttributes& data,
- RCSRemoteResourceObject::CacheUpdatedCallback onCacheUpdated)
+ const RCSResourceAttributes& data, int eCode,
+ RCSRemoteResourceObject::CacheUpdatedCallback onCacheUpdated,
+ std::weak_ptr<RCSRemoteResourceObject> resourcePtr)
{
SCOPE_LOG_F(DEBUG, TAG);
- onCacheUpdated(data);
+ //If error code is failure then RE Cache module should
+ //do clean up for caching flags, maps etc.
+ if(eCode > 4)
+ {
+ OIC_LOG_V(ERROR, TAG, "Error code: %d",eCode);
+ try
+ {
+ std::shared_ptr<RCSRemoteResourceObject> resource = resourcePtr.lock();
+ if(resource)
+ {
+ resource->stopCaching();
+ }
+ else
+ {
+ OIC_LOG(ERROR, TAG, "Resource object is null");
+ }
+ }
+ catch(...)
+ {
+ //Exception will be thrown: stack will return OC_STACK_ERROR
+ // if it already stopped observe. This call is reqired for clearing
+ //Cache manager.
+ OIC_LOG(DEBUG, TAG, "Cleared Cache");
+ }
+ }
+
+ //Calling application callback
+ onCacheUpdated(data, eCode);
return OC_STACK_OK;
}
OC::OCResource::Ptr ocResource = OC::OCPlatform::constructResourceObject(rcsResource->getAddress(),
rcsResource->getUri(),
- CT_DEFAULT,
+ rcsResource->m_primitiveResource->getConnectivityType(),
rcsResource->isObservable(),
rcsResource->getTypes(),
rcsResource->getInterfaces());
startCaching({ });
}
- void RCSRemoteResourceObject::startCaching(CacheUpdatedCallback cb)
+ void RCSRemoteResourceObject::startCaching(CacheUpdatedCallback cb, CacheMode mode)
{
SCOPE_LOG_F(DEBUG, TAG);
throw RCSBadRequestException{ "Caching already started." };
}
- if (cb)
+ if (mode == CacheMode::OBSERVE_ONLY)
+ {
+ m_cacheId = ResourceCacheManager::getInstance()->requestResourceCache(
+ m_primitiveResource,
+ std::bind(cachingCallback, std::placeholders::_1,
+ std::placeholders::_2, std::placeholders::_3,
+ std::move(cb), shared_from_this()), CACHE_METHOD::OBSERVE_ONLY,
+ REPORT_FREQUENCY::UPTODATE, 0);
+ }
+
+ else if (cb)
{
m_cacheId = ResourceCacheManager::getInstance()->requestResourceCache(
m_primitiveResource,
- std::bind(cachingCallback, std::placeholders::_1, std::placeholders::_2,
- std::move(cb)), REPORT_FREQUENCY::UPTODATE, 0);
+ std::bind(cachingCallback, std::placeholders::_1,
+ std::placeholders::_2, std::placeholders::_3,
+ std::move(cb), shared_from_this()), CACHE_METHOD::ITERATED_GET,
+ REPORT_FREQUENCY::UPTODATE, 0);
}
else
{
m_cacheId = ResourceCacheManager::getInstance()->requestResourceCache(
- m_primitiveResource, { }, REPORT_FREQUENCY::NONE, 0);
+ m_primitiveResource, { }, CACHE_METHOD::ITERATED_GET,
+ REPORT_FREQUENCY::NONE, 0);
}
OIC_LOG_V(DEBUG, TAG, "startCaching CACHE ID %d", m_cacheId);
return;
}
- ResourceCacheManager::getInstance()->cancelResourceCache(m_cacheId);
+ try
+ {
+ ResourceCacheManager::getInstance()->cancelResourceCache(m_cacheId);
+ }
+ catch (const RCSInvalidParameterException &)
+ {
+ throw;
+ }
+ catch (...)
+ {
+ m_cacheId = 0;
+ throw;
+ }
m_cacheId = 0;
}
}
return convertCacheState(
- ResourceCacheManager::getInstance()->getResourceCacheState(m_primitiveResource));
+ ResourceCacheManager::getInstance()->getResourceCacheState(m_cacheId));
}
bool RCSRemoteResourceObject::isCachedAvailable() const
throw RCSBadRequestException{ "Cache data is not available." };
}
- return ResourceCacheManager::getInstance()->getCachedData(m_primitiveResource);
+ return ResourceCacheManager::getInstance()->getCachedData(m_cacheId);
}
RCSResourceAttributes::Value RCSRemoteResourceObject::getCachedAttribute(