{
return resource->getSid() + resource->getUri();
}
+
+ void validateTypes(const std::vector< std::string >& resourceTypes) {
+ if (resourceTypes.size() == 1) return;
+
+ for (const auto& type : resourceTypes)
+ {
+ if (type == OIC::Service::RCSDiscoveryManagerImpl::ALL_RESOURCE_TYPE)
+ {
+ throw OIC::Service::RCSBadRequestException{
+ "resource types must have no empty string!" };
+ }
+ }
+ }
}
namespace OIC
namespace Service
{
constexpr RCSDiscoveryManagerImpl::ID RCSDiscoveryManagerImpl::INVALID_ID;
+ constexpr char const* RCSDiscoveryManagerImpl::ALL_RESOURCE_TYPE;
RCSDiscoveryManagerImpl::RCSDiscoveryManagerImpl()
{
- subscribePresenceWithMuticast();
+ subscribePresenceWithMulticast();
- m_timer.post(POLLING_INTERVAL_TIME, std::bind(&RCSDiscoveryManagerImpl::onPolling, this));
+ m_timer.post(POLLING_INTERVAL_TIME,
+ std::bind(&RCSDiscoveryManagerImpl::onPolling, this));
}
RCSDiscoveryManagerImpl* RCSDiscoveryManagerImpl::getInstance()
return &instance;
}
- void RCSDiscoveryManagerImpl::onResourceFound(std::shared_ptr<PrimitiveResource> resource,
- ID discoveryId, const RCSDiscoveryManager::ResourceDiscoveredCallback& discoverCB)
+ void RCSDiscoveryManagerImpl::onResourceFound(
+ std::shared_ptr< PrimitiveResource > resource, ID discoveryId,
+ const RCSDiscoveryManager::ResourceDiscoveredCallback& discoverCB)
{
{
- std::lock_guard< std::mutex > lock(m_mutex);
+ std::lock_guard < std::mutex > lock(m_mutex);
auto it = m_discoveryMap.find(discoveryId);
if (it == m_discoveryMap.end()) return;
it->second.addKnownResource(resource);
}
- discoverCB(std::make_shared< RCSRemoteResourceObject > (resource));
+ discoverCB(std::make_shared < RCSRemoteResourceObject > (resource));
}
RCSDiscoveryManager::DiscoveryTask::Ptr RCSDiscoveryManagerImpl::startDiscovery(
const RCSAddress& address, const std::string& relativeUri,
- const std::string& resourceType, RCSDiscoveryManager::ResourceDiscoveredCallback cb)
+ const std::vector< std::string >& resourceTypes,
+ RCSDiscoveryManager::ResourceDiscoveredCallback cb)
{
if (!cb)
{
throw RCSInvalidParameterException{ "Callback is empty" };
}
+ validateTypes(resourceTypes);
+
const ID discoveryId = createId();
- DiscoveryRequestInfo discoveryInfo(address, relativeUri, resourceType,
+ DiscoveryRequestInfo discoveryInfo(address, relativeUri, resourceTypes,
std::bind(&RCSDiscoveryManagerImpl::onResourceFound, this,
std::placeholders::_1, discoveryId, std::move(cb)));
+
discoveryInfo.discover();
{
- std::lock_guard< std::mutex > lock(m_mutex);
+ std::lock_guard < std::mutex > lock(m_mutex);
m_discoveryMap.insert(std::make_pair(discoveryId, std::move(discoveryInfo)));
}
new RCSDiscoveryManager::DiscoveryTask(discoveryId));
}
- void RCSDiscoveryManagerImpl::subscribePresenceWithMuticast()
+ void RCSDiscoveryManagerImpl::subscribePresenceWithMulticast()
{
using namespace std::placeholders;
void RCSDiscoveryManagerImpl::onPolling()
{
{
- std::lock_guard< std::mutex > lock(m_mutex);
+ std::lock_guard < std::mutex > lock(m_mutex);
for (const auto& it : m_discoveryMap)
{
it.second.discover();
}
}
- m_timer.post(POLLING_INTERVAL_TIME, std::bind(&RCSDiscoveryManagerImpl::onPolling, this));
+ m_timer.post(POLLING_INTERVAL_TIME,
+ std::bind(&RCSDiscoveryManagerImpl::onPolling, this));
}
void RCSDiscoveryManagerImpl::onPresence(OCStackResult result, const unsigned int /*seq*/,
{
if (result != OC_STACK_OK && result != OC_STACK_RESOURCE_CREATED) return;
- std::lock_guard< std::mutex > lock(m_mutex);
+ std::lock_guard < std::mutex > lock(m_mutex);
for (const auto& it : m_discoveryMap)
{
if (it.second.isMatchedAddress(address))
{
static ID s_nextId = INVALID_ID + 1;
- std::lock_guard< std::mutex > lock(m_mutex);
+ std::lock_guard < std::mutex > lock(m_mutex);
while (s_nextId == INVALID_ID || m_discoveryMap.find(s_nextId) != m_discoveryMap.end())
{
void RCSDiscoveryManagerImpl::cancel(ID id)
{
- std::lock_guard< std::mutex > lock(m_mutex);
+ std::lock_guard < std::mutex > lock(m_mutex);
m_discoveryMap.erase(id);
}
DiscoveryRequestInfo::DiscoveryRequestInfo(const RCSAddress& address,
- const std::string& relativeUri, const std::string& resourceType,
+ const std::string& relativeUri, const std::vector< std::string >& resourceTypes,
DiscoverCallback cb) :
m_address{ address },
m_relativeUri{ relativeUri },
- m_resourceType{ resourceType },
+ m_resourceTypes{ resourceTypes },
m_knownResourceIds{ },
m_discoverCb{ std::move(cb) }
{
+ if (m_resourceTypes.empty())
+ {
+ m_resourceTypes.push_back(RCSDiscoveryManagerImpl::ALL_RESOURCE_TYPE);
+ }
}
void DiscoveryRequestInfo::discover() const
{
- discoverResource(m_address, m_relativeUri + "?rt=" + m_resourceType, m_discoverCb);
+ for (const auto& it : m_resourceTypes)
+ {
+ std::string uri = std::string(OC_RSRVD_WELL_KNOWN_URI);
+ if (!it.empty())
+ {
+ uri = std::string(OC_RSRVD_WELL_KNOWN_URI) + "?rt=" + it;
+ }
+ discoverResource(m_address, uri, m_discoverCb);
+ }
}
bool DiscoveryRequestInfo::isKnownResource(
bool DiscoveryRequestInfo::isMatchedAddress(const std::string& address) const
{
- return RCSAddressDetail::getDetail(m_address)->isMulticast() ||
- RCSAddressDetail::getDetail(m_address)->getAddress() == address;
+ return RCSAddressDetail::getDetail(m_address)->isMulticast()
+ || RCSAddressDetail::getDetail(m_address)->getAddress() == address;
}
}
}