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 "SceneListResource.h"
23 #include "RCSRequest.h"
30 SceneListResource::SceneListResource()
31 : m_sceneListObj(createResourceObject())
33 m_sceneListObj->setAttribute(SCENE_KEY_NAME, SCENE_LIST_DEFAULT_NAME);
34 m_sceneListObj->setAttribute(SCENE_KEY_RTS, SCENE_LIST_RT);
36 m_sceneListObj->setSetRequestHandler(&SceneListRequestHandler::onSetRequest);
37 m_sceneListObj->setGetRequestHandler(&SceneListRequestHandler::onGetRequest);
40 SceneListResource * SceneListResource::getInstance()
42 static SceneListResource instance;
46 RCSResourceObject::Ptr SceneListResource::createResourceObject()
48 return RCSResourceObject::Builder(
49 SCENE_LIST_URI, SCENE_LIST_RT, BASELINE_IF).
50 addInterface(OC::BATCH_INTERFACE).
51 addInterface(LINK_BATCH).
52 setDiscoverable(true).setObservable(false).build();
55 void SceneListResource::addSceneCollectionResource(
56 SceneCollectionResource::Ptr newObject)
58 std::lock_guard<std::mutex> collectionlock(m_sceneCollectionLock);
59 m_sceneCollections.push_back(newObject);
60 m_sceneListObj->bindResource(newObject->getRCSResourceObject());
63 std::string SceneListResource::getName() const
65 return m_sceneListObj->getAttributeValue(SCENE_KEY_NAME).get<std::string>();
68 void SceneListResource::setName(std::string && newName)
70 m_sceneListObj->setAttribute(SCENE_KEY_NAME, std::move(newName));
73 void SceneListResource::setName(const std::string & newName)
75 setName(std::string(newName));
78 std::vector<SceneCollectionResource::Ptr> SceneListResource::getSceneCollections() const
80 std::lock_guard<std::mutex> collectionlock(m_sceneCollectionLock);
81 return m_sceneCollections;
84 RCSResourceObject::Ptr SceneListResource::getResourceObject() const
86 return m_sceneListObj;
89 std::vector<RCSResourceAttributes> SceneListResource::getChildrenAttributes() const
91 std::vector<RCSResourceAttributes> childrenAttrs;
93 auto sceneCollections = getSceneCollections();
95 std::for_each(sceneCollections.begin(), sceneCollections.end(),
96 [& childrenAttrs](const SceneCollectionResource::Ptr & pCollection)
98 RCSResourceAttributes collectionAttr;
100 RCSResourceObject::LockGuard guard(
101 pCollection->getRCSResourceObject());
102 collectionAttr = pCollection->getRCSResourceObject()->getAttributes();
105 auto sceneMembers = pCollection->getSceneMembers();
106 std::vector<RCSResourceAttributes> membersAttrs;
108 std::for_each(sceneMembers.begin(), sceneMembers.end(),
109 [& membersAttrs](const SceneMemberResource::Ptr & pMember)
111 RCSResourceObject::LockGuard guard(pMember->getRCSResourceObject());
112 membersAttrs.push_back(pMember->getRCSResourceObject()->getAttributes());
115 if (membersAttrs.size())
117 collectionAttr[SCENE_KEY_CHILD] = membersAttrs;
120 childrenAttrs.push_back(collectionAttr);
123 return childrenAttrs;
126 RCSSetResponse SceneListResource::SceneListRequestHandler::onSetRequest(
127 const RCSRequest & request, RCSResourceAttributes & attributes)
129 RCSResourceAttributes responseAttr;
130 int eCode = SCENE_CLIENT_BADREQUEST;
132 if(request.getInterface() == LINK_BATCH)
135 = SceneCollectionResource::create(attributes);
137 SceneListResource::getInstance()->addSceneCollectionResource(newObject);
139 auto responseAtt = attributes;
140 responseAtt[SCENE_KEY_NAME] = RCSResourceAttributes::Value(newObject->getName());
141 responseAtt[SCENE_KEY_ID] = RCSResourceAttributes::Value(newObject->getId());
143 auto uri = COAP_TAG + newObject->getAddress() + newObject->getUri();
144 responseAtt[SCENE_KEY_PAYLOAD_LINK]
145 = RCSResourceAttributes::Value(uri);
147 responseAttr = responseAtt;
148 eCode = SCENE_RESPONSE_SUCCESS;
151 else if (attributes.contains(SCENE_KEY_NAME))
153 SceneListResource::getInstance()->setName(
154 attributes.at(SCENE_KEY_NAME).get<std::string>());
156 responseAttr = attributes;
157 eCode = SCENE_RESPONSE_SUCCESS;
161 responseAttr = attributes;
162 eCode = SCENE_CLIENT_BADREQUEST;
165 return RCSSetResponse::create(responseAttr, eCode).
166 setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
169 RCSGetResponse SceneListResource::SceneListRequestHandler::onGetRequest(
170 const RCSRequest & request, RCSResourceAttributes & /*attributes*/)
173 if(request.getInterface() != OC::DEFAULT_INTERFACE)
175 return RCSGetResponse::defaultAction();
178 auto childrenAttrs = SceneListResource::getInstance()->getChildrenAttributes();
180 RCSResourceAttributes retAttr;
183 RCSResourceObject::LockGuard lock(
184 SceneListResource::getInstance()->getResourceObject());
185 retAttr = SceneListResource::getInstance()->getResourceObject()->getAttributes();
188 if (childrenAttrs.size())
190 retAttr[SCENE_KEY_CHILD] = childrenAttrs;
193 return RCSGetResponse::create(retAttr);