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 "SceneCollectionResource.h"
25 #include "RCSRequest.h"
26 #include "RCSSeparateResponse.h"
34 std::atomic_int numOfSceneCollection(0);
37 SceneCollectionResource::Ptr
38 SceneCollectionResource::createSceneCollectionObject()
40 SceneCollectionResource::Ptr newSceneCollectionObject(new SceneCollectionResource());
42 newSceneCollectionObject->m_uri
43 = PREFIX_SCENE_COLLECTION_URI + "/" + std::to_string(numOfSceneCollection++);
45 newSceneCollectionObject->m_address = SceneUtils::getNetAddress();
47 newSceneCollectionObject->createResourceObject();
49 newSceneCollectionObject->setDefaultAttributes();
51 newSceneCollectionObject->initSetRequestHandler();
53 return newSceneCollectionObject;
56 void SceneCollectionResource::createResourceObject()
58 m_sceneCollectionResourceObj
59 = RCSResourceObject::Builder(
60 m_uri, SCENE_COLLECTION_RT, OC_RSRVD_INTERFACE_DEFAULT).
61 addInterface(OC::BATCH_INTERFACE).
62 setDiscoverable(true).setObservable(false).build();
65 void SceneCollectionResource::setDefaultAttributes()
67 m_sceneCollectionResourceObj->setAttribute(SCENE_KEY_LAST_SCENE, std::string());
68 m_sceneCollectionResourceObj->setAttribute(SCENE_KEY_NAME, std::string());
69 m_sceneCollectionResourceObj->setAttribute(
70 SCENE_KEY_ID, SceneUtils::OICGenerateUUIDStr());
71 m_sceneCollectionResourceObj->setAttribute(SCENE_KEY_RTS, SCENE_MEMBER_RT);
72 m_sceneCollectionResourceObj->setAttribute(
73 SCENE_KEY_SCENEVALUES, std::vector<std::string>());
74 m_sceneCollectionResourceObj->setAttribute(SCENE_KEY_URI, m_uri);
77 void SceneCollectionResource::initSetRequestHandler()
79 m_requestHandler.m_owner
80 = std::weak_ptr<SceneCollectionResource>(shared_from_this());
82 m_sceneCollectionResourceObj->setSetRequestHandler(std::bind(
83 &SceneCollectionResource::SceneCollectionRequestHandler::onSetRequest,
84 m_requestHandler, std::placeholders::_1, std::placeholders::_2));
87 void SceneCollectionResource::addScene(const std::string & newScene)
89 addScene(std::string(newScene));
92 void SceneCollectionResource::addScene(std::string && newScene)
94 auto sceneValues = m_sceneCollectionResourceObj->getAttributeValue(
95 SCENE_KEY_SCENEVALUES).get< std::vector< std::string > >();
98 = std::find(sceneValues.begin(), sceneValues.end(), newScene);
99 if (foundScene == sceneValues.end())
101 sceneValues.push_back(std::move(newScene));
103 m_sceneCollectionResourceObj->setAttribute(SCENE_KEY_SCENEVALUES, sceneValues);
107 void SceneCollectionResource::addSceneMember(
108 SceneMemberResource::Ptr newMember)
110 std::lock_guard<std::mutex> memberlock(m_sceneMemberLock);
112 auto foundmember = std::find_if(m_sceneMembers.begin(), m_sceneMembers.end(),
113 [& newMember](const SceneMemberResource::Ptr & ptr) -> bool
115 return ptr->getFullUri() == newMember->getFullUri();
118 if (foundmember != m_sceneMembers.end())
120 throw std::exception();
123 m_sceneMembers.push_back(newMember);
124 m_sceneCollectionResourceObj->bindResource(newMember->getRCSResourceObject());
127 void SceneCollectionResource::execute(std::string && sceneName)
129 execute(std::move(sceneName), nullptr);
132 void SceneCollectionResource::execute(const std::string & sceneName)
134 execute(std::string(sceneName));
137 void SceneCollectionResource::execute(
138 const std::string & sceneName, SceneExecuteCallback executeCB)
140 execute(std::string(sceneName), std::move(executeCB));
143 void SceneCollectionResource::execute(
144 std::string && sceneName, SceneExecuteCallback executeCB)
146 auto sceneValues = m_sceneCollectionResourceObj->getAttributeValue(
147 SCENE_KEY_SCENEVALUES).get< std::vector< std::string > >();
150 = std::find(sceneValues.begin(), sceneValues.end(), sceneName);
151 if (foundSceneValue == sceneValues.end() && executeCB)
153 std::thread(executeCB, SCENE_CLIENT_BADREQUEST).detach();
158 = SceneExecuteResponseHandler::createExecuteHandler(
159 shared_from_this(), std::move(executeCB));
162 std::lock_guard<std::mutex> handlerlock(m_executeHandlerLock);
163 m_executeHandlers.push_back(executeHandler);
167 std::lock_guard<std::mutex> memberlock(m_sceneMemberLock);
168 for (auto & it : m_sceneMembers)
170 it->execute(sceneName, std::bind(
171 &SceneExecuteResponseHandler::onResponse, executeHandler,
172 std::placeholders::_1, std::placeholders::_2));
176 m_sceneCollectionResourceObj->setAttribute(SCENE_KEY_LAST_SCENE, sceneName);
179 void SceneCollectionResource::onExecute(
180 int errorCode, SceneExecuteCallback cb, SceneExecuteResponseHandler::Ptr ptr)
183 std::lock_guard<std::mutex> handlerlock(m_executeHandlerLock);
184 m_executeHandlers.remove(ptr);
187 std::thread(cb, errorCode).detach();
190 std::string SceneCollectionResource::getId() const
192 return m_sceneCollectionResourceObj->getAttributeValue(
193 SCENE_KEY_ID).get<std::string>();
196 std::string SceneCollectionResource::getUri() const
201 std::string SceneCollectionResource::getAddress() const
206 std::vector<std::string> SceneCollectionResource::getSceneValues() const
208 return m_sceneCollectionResourceObj->getAttributeValue(
209 SCENE_KEY_SCENEVALUES).get<std::vector<std::string>>();
212 std::vector<SceneMemberResource::Ptr> SceneCollectionResource::getSceneMembers() const
214 return m_sceneMembers;
217 RCSResourceObject::Ptr SceneCollectionResource::getRCSResourceObject() const
219 return m_sceneCollectionResourceObj;
222 void SceneCollectionResource::setName(std::string && sceneCollectionName)
224 m_sceneCollectionResourceObj->setAttribute(
225 SCENE_KEY_NAME, std::move(sceneCollectionName));
228 void SceneCollectionResource::setName(const std::string & sceneCollectionName)
230 setName(std::string(sceneCollectionName));
233 std::string SceneCollectionResource::getName() const
235 return m_sceneCollectionResourceObj->getAttributeValue(
236 SCENE_KEY_NAME).get<std::string>();
239 RCSSetResponse SceneCollectionResource::SceneCollectionRequestHandler::
240 onSetRequest(const RCSRequest & request, RCSResourceAttributes & attributes)
242 if (request.getInterface() == OC::BATCH_INTERFACE)
244 return createSceneMemberRequest(request, attributes);
247 if (attributes.contains(SCENE_KEY_SCENEVALUES))
249 return addSceneRequest(request, attributes);
252 if (attributes.contains(SCENE_KEY_LAST_SCENE))
254 return executeSceneRequest(request, attributes);
257 if (attributes.contains(SCENE_KEY_NAME))
259 return setSceneCollectionName(request, attributes);
262 return RCSSetResponse::create(attributes, (int)SCENE_CLIENT_BADREQUEST).
263 setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
266 RCSSetResponse SceneCollectionResource::SceneCollectionRequestHandler::
267 addSceneRequest(const RCSRequest & /*request*/, RCSResourceAttributes & attributes)
269 SceneCollectionResource::Ptr ptr = m_owner.lock();
272 return RCSSetResponse::create(attributes, SCENE_CLIENT_BADREQUEST).
273 setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
276 auto values = attributes.at(SCENE_KEY_SCENEVALUES).get<std::vector<std::string>>();
277 std::for_each (values.begin(), values.end(),
278 [& ptr](const std::string & value)
280 ptr->addScene(value);
283 return RCSSetResponse::create(attributes).
284 setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
287 RCSSetResponse SceneCollectionResource::SceneCollectionRequestHandler::
288 executeSceneRequest(const RCSRequest & request, RCSResourceAttributes & attributes)
290 SceneCollectionResource::Ptr ptr = m_owner.lock();
293 return RCSSetResponse::create(attributes, SCENE_CLIENT_BADREQUEST).
294 setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
297 auto requestKey = attributes.at(SCENE_KEY_LAST_SCENE).get<std::string>();
299 RCSRequest req(request.getResourceObject().lock(), request.getOCRequest());
300 ptr->execute(std::string(requestKey), std::bind(
301 &SceneCollectionResource::SceneCollectionRequestHandler::onExecute, this,
302 std::placeholders::_1, req, attributes));
304 return RCSSetResponse::separate();
307 RCSSetResponse SceneCollectionResource::SceneCollectionRequestHandler::
308 createSceneMemberRequest(const RCSRequest & /*request*/, RCSResourceAttributes & attributes)
310 SceneCollectionResource::Ptr ptr = m_owner.lock();
311 if (ptr == nullptr || !attributes.contains(SCENE_KEY_PAYLOAD_LINK))
313 return RCSSetResponse::create(attributes, SCENE_CLIENT_BADREQUEST).
314 setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
317 auto linkAtt = attributes.at(SCENE_KEY_PAYLOAD_LINK).get<RCSResourceAttributes>();
318 if (!linkAtt.contains(SCENE_KEY_HREF) ||
319 !linkAtt.contains(SCENE_KEY_RT) || !linkAtt.contains(SCENE_KEY_IF))
321 return RCSSetResponse::create(attributes, SCENE_CLIENT_BADREQUEST).
322 setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
325 auto memberObj = createSceneMemberFromRemote(linkAtt);
326 if (memberObj == nullptr)
328 return RCSSetResponse::create(attributes, SCENE_CLIENT_BADREQUEST).
329 setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
332 if (attributes.contains(SCENE_KEY_SCENEMAPPINGS))
334 addMemberInfoFromRemote(memberObj, attributes.at(
335 SCENE_KEY_SCENEMAPPINGS).get<std::vector<RCSResourceAttributes>>());
338 RCSResourceAttributes responseAtt(attributes);
339 responseAtt[SCENE_KEY_ID] = RCSResourceAttributes::Value(memberObj->getId());
340 responseAtt[SCENE_KEY_CREATEDLINK]
341 = RCSResourceAttributes::Value(memberObj->getFullUri());
343 return RCSSetResponse::create(responseAtt).
344 setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
348 SceneCollectionResource::SceneCollectionRequestHandler::setSceneCollectionName(
349 const RCSRequest & /*request*/, RCSResourceAttributes & attr)
351 SceneCollectionResource::Ptr ptr = m_owner.lock();
354 return RCSSetResponse::create(attr, SCENE_CLIENT_BADREQUEST).
355 setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
358 ptr->setName(attr.at(SCENE_KEY_NAME).get<std::string>());
360 return RCSSetResponse::create(attr).
361 setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
364 SceneMemberResource::Ptr
365 SceneCollectionResource::SceneCollectionRequestHandler::createSceneMemberFromRemote(
366 RCSResourceAttributes & linkAtt)
368 auto memberObj = SceneMemberResource::createSceneMemberResource(linkAtt);
372 SceneCollectionResource::Ptr ptr = m_owner.lock();
373 ptr->addSceneMember(memberObj);
382 void SceneCollectionResource::SceneCollectionRequestHandler::addMemberInfoFromRemote(
383 SceneMemberResource::Ptr memberObj, std::vector<RCSResourceAttributes> mInfo)
385 std::for_each (mInfo.begin(), mInfo.end(),
386 [& memberObj](const RCSResourceAttributes & att)
388 memberObj->addMappingInfo(SceneMemberResource::MappingInfo(
389 att.at(SCENE_KEY_SCENE).get<std::string>(),
390 att.at(SCENE_KEY_MEMBERPROPERTY).get<std::string>(),
391 att.at(SCENE_KEY_MEMBERVALUE)));
395 void SceneCollectionResource::SceneCollectionRequestHandler::
396 onExecute(int /*errorCode*/, const RCSRequest & request, RCSResourceAttributes & /*att*/)
398 // TODO need to set error code.
399 // and need to set specific attr' but this attr not to be apply to RCSResourceObject.
400 RCSSeparateResponse(request).set();
403 void SceneCollectionResource::SceneExecuteResponseHandler::
404 onResponse(const RCSResourceAttributes & /*attributes*/, int errorCode)
407 if (errorCode != SCENE_RESPONSE_SUCCESS && m_errorCode != errorCode)
409 m_errorCode = errorCode;
411 if (m_responseMembers == m_numOfMembers)
417 SceneCollectionResource::SceneExecuteResponseHandler::Ptr
418 SceneCollectionResource::SceneExecuteResponseHandler::createExecuteHandler(
419 const SceneCollectionResource::Ptr ptr, SceneExecuteCallback executeCB)
421 auto executeHandler = std::make_shared<SceneExecuteResponseHandler>();
423 executeHandler->m_numOfMembers = ptr->m_sceneMembers.size();
424 executeHandler->m_responseMembers = 0;
426 executeHandler->m_cb = std::bind(
427 &SceneCollectionResource::onExecute, ptr,
428 std::placeholders::_1, std::move(executeCB), executeHandler);
430 executeHandler->m_owner
431 = std::weak_ptr<SceneCollectionResource>(ptr);
432 executeHandler->m_errorCode = SCENE_RESPONSE_SUCCESS;
434 return executeHandler;