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 pDiscoveredCB = std::bind(&DiscoverResourceUnit::discoverdCB, this,
33 std::placeholders::_1);
34 pUpdatedCBFromServer = std::bind(&DiscoverResourceUnit::onUpdate, this,
35 std::placeholders::_1, std::placeholders::_2);
38 DiscoverResourceUnit::~DiscoverResourceUnit()
40 m_vecRemoteResource.clear();
43 void DiscoverResourceUnit::startDiscover(DiscoverResourceInfo info, UpdatedCB updatedCB)
45 if (isStartedDiscovery)
47 // Already start Discovery
51 m_Uri = info.resourceUri;
52 m_ResourceType = info.resourceType;
53 m_AttrubuteName = info.attributeName;
54 pUpdatedCB = updatedCB;
58 // TODO may be will changed active discovery
61 RCSDiscoveryManager::getInstance()->discoverResourceByType(
62 RCSAddress::multicast(), m_ResourceType, pDiscoveredCB);
66 RCSDiscoveryManager::getInstance()->discoverResourceByType(
67 RCSAddress::multicast(), m_Uri, m_ResourceType, pDiscoveredCB);
70 catch (InvalidParameterException &e)
72 // TODO Handle Exception
76 isStartedDiscovery = true;
79 void DiscoverResourceUnit::discoverdCB(RCSRemoteResourceObject::Ptr remoteObject)
81 if (!isAlreadyDiscoveredResource(remoteObject))
83 RemoteResourceUnit::Ptr newDiscoveredResource =
84 RemoteResourceUnit::createRemoteResourceInfo(remoteObject, pUpdatedCBFromServer);
86 m_vecRemoteResource.push_back(newDiscoveredResource);
88 newDiscoveredResource->startMonitoring();
89 newDiscoveredResource->startCaching();
93 // Already Discovered Resource
98 void DiscoverResourceUnit::onUpdate(REMOTE_MSG msg, RCSRemoteResourceObject::Ptr updatedResource)
100 if(msg == REMOTE_MSG::DATA_UPDATED)
102 if (updatedResource == nullptr)
108 updatedResource->getCachedAttribute(m_AttrubuteName);
110 catch (InvalidKeyException &e)
112 // TODO Handle Exception
115 catch (std::exception &e)
120 std::vector<RCSResourceAttributes::Value> retVector
121 = buildInputResourceData(updatedResource);
122 if (!retVector.empty() && pUpdatedCB != nullptr)
124 pUpdatedCB(m_AttrubuteName, retVector);
129 // TODO find & delete
133 std::vector<RCSResourceAttributes::Value> DiscoverResourceUnit::buildInputResourceData(
134 RCSRemoteResourceObject::Ptr updatedResource)
136 (void)updatedResource;
137 std::vector<RCSResourceAttributes::Value> retVector = {};
138 for(auto iter : m_vecRemoteResource)
140 if(iter->getRemoteResourceObject()->getCacheState() != CacheState::READY)
147 RCSResourceAttributes::Value value =
148 iter->getRemoteResourceObject()->getCachedAttribute(m_AttrubuteName);
149 retVector.push_back(value);
152 catch (InvalidKeyException &e)
154 // TODO Handle Exception
161 bool DiscoverResourceUnit::isAlreadyDiscoveredResource(
162 RCSRemoteResourceObject::Ptr discoveredResource)
164 for (auto iter : m_vecRemoteResource)
166 if (discoveredResource->getUri().compare(iter->getRemoteResourceUri()) == 0 &&
167 discoveredResource->getAddress().compare(iter->getRemoteResourceObject()->getAddress()) == 0 )