1 //******************************************************************
3 // Copyright 2016 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 "RemoteScene.h"
26 #include "SceneCommons.h"
27 #include "SceneCollectionResourceRequestor.h"
28 #include "SceneMemberResourceRequestor.h"
29 #include "OCPlatform.h"
36 RemoteScene::RemoteScene(
37 const std::string &name, std::shared_ptr< SceneCollectionResourceRequestor > requestor)
38 : m_name{ name }, m_requestor{ requestor }
43 void RemoteScene::addNewSceneAction(
44 RCSRemoteResourceObject::Ptr targetResource, const RCSResourceAttributes &attrs,
45 AddNewSceneActionCallback clientCB)
47 if (targetResource == nullptr)
49 throw RCSInvalidParameterException("RCSRemoteResoureObject value is null");
54 throw RCSInvalidParameterException{ "addNewSceneAction : Callback is NULL" };
57 SceneCollectionResourceRequestor::InternalAddMemberCallback internalCB
58 = std::bind(&RemoteScene::onSceneActionAdded, this,
59 std::placeholders::_1, targetResource, attrs, std::move(clientCB));
61 m_requestor->requestAddSceneMember(
62 targetResource, m_name, attrs, internalCB);
65 void RemoteScene::addNewSceneAction(
66 RCSRemoteResourceObject::Ptr targetResource,
67 const std::string &key, const RCSResourceAttributes::Value &value,
68 AddNewSceneActionCallback clientCB)
70 RCSResourceAttributes attrs;
71 attrs[key] = RCSResourceAttributes::Value(value);
73 addNewSceneAction(targetResource, attrs, clientCB);
76 std::vector< RemoteSceneAction::Ptr > RemoteScene::getRemoteSceneActions() const
78 std::lock_guard< std::mutex > actionlock(m_sceneActionLock);
79 std::vector< RemoteSceneAction::Ptr > sceneActionList;
81 for (auto itrMap : m_remoteSceneActions)
83 sceneActionList.push_back(itrMap.second);
86 return sceneActionList;
89 RemoteSceneAction::Ptr RemoteScene::getRemoteSceneAction(
90 const RCSRemoteResourceObject::Ptr targetResource) const
92 if (targetResource == nullptr)
94 throw RCSInvalidParameterException("RCSRemoteResoureObject value is null");
97 std::lock_guard< std::mutex > actionlock(m_sceneActionLock);
98 auto itr = m_remoteSceneActions.find(
99 targetResource->getAddress() + targetResource->getUri());
101 if (itr == m_remoteSceneActions.end())
103 throw RCSInvalidParameterException("Invalid RCSRemoteResoureObject");
109 std::string RemoteScene::getName() const
114 void RemoteScene::execute(RemoteSceneExecuteCallback clientCB)
118 throw RCSInvalidParameterException{ "execute : Callback is NULL" };
121 SceneCollectionResourceRequestor::InternalSceneRequestCallback internalCB
122 = std::bind(&RemoteScene::onSceneExecuted, this, std::placeholders::_2,
123 std::placeholders::_3, std::move(clientCB));
125 m_requestor->requestSceneExecution(m_name, internalCB);
128 RemoteSceneAction::Ptr RemoteScene::createRemoteSceneAction(
129 const std::string &targetHref, const RCSResourceAttributes &attrs)
131 SceneMemberResourceRequestor::Ptr memRequestor
132 = m_requestor->getSceneMemberResourceRequestor(targetHref);
134 if (memRequestor == nullptr)
139 RemoteSceneAction::Ptr newAction(new RemoteSceneAction(memRequestor, m_name, attrs));
142 std::lock_guard< std::mutex > actionlock(m_sceneActionLock);
143 m_remoteSceneActions.insert(
144 std::make_pair(targetHref, newAction));
150 void RemoteScene::addExistingRemoteSceneAction(
151 const std::string &href, const std::string &id, RCSRemoteResourceObject::Ptr target,
152 const std::string &key, const RCSResourceAttributes::Value &value)
154 std::string targetHref = target->getAddress() + target->getUri();
156 SceneMemberResourceRequestor::Ptr foundMemberRequestor
157 = m_requestor->getSceneMemberResourceRequestor(targetHref);
159 if (foundMemberRequestor == nullptr)
160 m_requestor->createSceneMemberResourceRequestor(href, id, target);
162 RCSResourceAttributes attrs;
163 attrs[key] = RCSResourceAttributes::Value(value);
165 createRemoteSceneAction(targetHref, attrs);
168 void RemoteScene::onSceneActionAdded(
169 int eCode, RCSRemoteResourceObject::Ptr target, const RCSResourceAttributes &attrs,
170 const AddNewSceneActionCallback &clientCB)
172 int result = SCENE_CLIENT_BADREQUEST;
173 RemoteSceneAction::Ptr newAction = nullptr;
175 if (eCode == SCENE_RESPONSE_SUCCESS)
177 std::string targetLink = target->getAddress() + target->getUri();
179 newAction = createRemoteSceneAction(targetLink, attrs);
182 result = SCENE_RESPONSE_SUCCESS;
185 clientCB(newAction, result);
188 void RemoteScene::onSceneExecuted(const std::string &sceneName, const int eCode,
189 const RemoteSceneExecuteCallback &clientCB)
191 clientCB(sceneName, eCode);