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 "RCSRemoteResourceObject.h"
22 #include "DiscoverResourceUnit.h"
23 #include "RCSAddress.h"
25 using namespace OIC::Service;
27 DiscoverResourceUnit::DiscoverResourceUnit(const std::string &bundleId)
28 : m_bundleId(bundleId)
31 isStartedDiscovery = false;
32 discoveryTask = nullptr;
34 pUpdatedCBFromServer = std::bind(&DiscoverResourceUnit::onUpdate, this,
35 std::placeholders::_1, std::placeholders::_2);
38 DiscoverResourceUnit::~DiscoverResourceUnit()
41 discoveryTask = nullptr;
42 pUpdatedCBFromServer = nullptr;
44 m_vecRemoteResource.clear();
47 void DiscoverResourceUnit::startDiscover(DiscoverResourceInfo info, UpdatedCB updatedCB)
49 if (isStartedDiscovery)
51 // Already start Discovery
55 OIC_LOG_V(DEBUG, DISCOVER_TAG, "Start discover %s", info.resourceUri.c_str());
57 m_Uri = info.resourceUri;
58 m_ResourceType = info.resourceType;
59 m_AttrubuteName = info.attributeName;
60 pUpdatedCB = updatedCB;
64 // TODO may be will changed active discovery
67 pDiscoveredCB = std::bind(&DiscoverResourceUnit::discoverdCB, this, std::placeholders::_1,
72 pDiscoveredCB = std::bind(&DiscoverResourceUnit::discoverdCB, this, std::placeholders::_1, m_Uri);
75 discoveryTask = RCSDiscoveryManager::getInstance()->discoverResourceByType(
76 RCSAddress::multicast(), m_ResourceType, pDiscoveredCB);
78 catch (RCSInvalidParameterException &e)
80 // TODO Handle Exception
84 isStartedDiscovery = true;
87 void DiscoverResourceUnit::discoverdCB(RCSRemoteResourceObject::Ptr remoteObject, std::string uri)
89 if (remoteObject && !isAlreadyDiscoveredResource(remoteObject))
91 OIC_LOG_V(DEBUG, DISCOVER_TAG, "Discovered - uri: %s", uri.c_str());
92 if (uri.empty() || uri.compare(remoteObject->getUri()) == 0){
93 RemoteResourceUnit::Ptr newDiscoveredResource =
94 RemoteResourceUnit::createRemoteResourceInfo(remoteObject,
95 pUpdatedCBFromServer);
96 m_vecRemoteResource.push_back(newDiscoveredResource);
97 newDiscoveredResource->startMonitoring();
98 newDiscoveredResource->startCaching();
100 OIC_LOG_V(DEBUG, DISCOVER_TAG, "Created remote resource unit");
103 OIC_LOG_V(DEBUG, DISCOVER_TAG, "URI is not matching - uri: %s", uri.c_str());
108 // Already Discovered Resource
112 void DiscoverResourceUnit::onUpdate(REMOTE_MSG msg, RCSRemoteResourceObject::Ptr updatedResource)
114 if (msg == REMOTE_MSG::DATA_UPDATED)
116 if (updatedResource == nullptr)
122 updatedResource->getCachedAttribute(m_AttrubuteName);
124 catch (RCSInvalidKeyException &e)
126 // TODO Handle Exception
129 catch (std::exception &e)
134 std::vector<RCSResourceAttributes::Value> retVector
135 = buildInputResourceData(updatedResource);
136 if (!retVector.empty() && pUpdatedCB != nullptr)
138 pUpdatedCB(m_AttrubuteName, retVector);
143 // TODO find & delete
147 std::vector<RCSResourceAttributes::Value> DiscoverResourceUnit::buildInputResourceData(
148 RCSRemoteResourceObject::Ptr updatedResource)
150 (void)updatedResource;
151 std::vector<RCSResourceAttributes::Value> retVector = {};
152 for (auto iter : m_vecRemoteResource)
154 if (iter->getRemoteResourceObject()->getCacheState() != CacheState::READY)
161 RCSResourceAttributes::Value value =
162 iter->getRemoteResourceObject()->getCachedAttribute(m_AttrubuteName);
163 retVector.push_back(value);
166 catch (RCSInvalidKeyException &e)
168 // TODO Handle Exception
175 bool DiscoverResourceUnit::isAlreadyDiscoveredResource(
176 RCSRemoteResourceObject::Ptr discoveredResource)
178 for (auto iter : m_vecRemoteResource)
180 if (discoveredResource->getUri().compare(iter->getRemoteResourceUri()) == 0 &&
181 discoveredResource->getAddress().compare(iter->getRemoteResourceObject()->getAddress()) == 0 )