[IOT-1065][IOT-1069] RC - Tizen: sample application fix
[platform/upstream/iotivity.git] / service / scene-manager / src / Scene.cpp
1 //******************************************************************
2 //
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
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
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
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.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 #include "Scene.h"
22
23 #include "SceneCollectionResource.h"
24
25 #include <algorithm>
26
27 namespace OIC
28 {
29     namespace Service
30     {
31         Scene::Scene(const std::string& sceneName,
32                 SceneCollectionResource::Ptr sceneCollectionResource) :
33                 m_name(sceneName), m_sceneCollectionResource(sceneCollectionResource) {}
34
35         SceneAction::Ptr Scene::addNewSceneAction(
36                const RCSRemoteResourceObject::Ptr& pRCSRemoteResourceObject,
37                std::string key, RCSResourceAttributes::Value value)
38         {
39             RCSResourceAttributes resAttr;
40             resAttr[key] = value;
41             return addNewSceneAction(pRCSRemoteResourceObject, std::move(resAttr));
42         }
43
44         SceneAction::Ptr Scene::addNewSceneAction(
45                 const RCSRemoteResourceObject::Ptr& pRCSRemoteResourceObject,
46                 RCSResourceAttributes attr)
47         {
48             if(pRCSRemoteResourceObject == nullptr)
49             {
50                 throw RCSInvalidParameterException("pRCSRemoteResourceObject is empty!");
51             }
52
53             SceneMemberResource::Ptr sceneMemberResObj;
54             sceneMemberResObj = SceneMemberResource::createSceneMemberResource(
55                     pRCSRemoteResourceObject);
56             try
57             {
58                 m_sceneCollectionResource->addSceneMember(sceneMemberResObj);
59             }
60             catch(RCSBadRequestException& e)
61             {
62                 auto sceneMemberRes = m_sceneCollectionResource->findSceneMembers(m_name);
63
64                 auto it = std::find_if(sceneMemberRes.begin(), sceneMemberRes.end(),
65                         [&pRCSRemoteResourceObject](const SceneMemberResource::Ptr& member)
66                         {
67                             return member->getRemoteResourceObject() == pRCSRemoteResourceObject;
68                         }
69                 );
70
71                 if(it != sceneMemberRes.end())
72                 {
73                     throw RCSBadRequestException(
74                             "It is already registered member. Please set Execution Parameter!");
75                 }
76
77                 auto sceneMembers = m_sceneCollectionResource->getSceneMembers();
78                 auto memberRes = std::find_if(sceneMembers.begin(), sceneMembers.end(),
79                         [&pRCSRemoteResourceObject](const SceneMemberResource::Ptr& member)
80                         {
81                             return member->getRemoteResourceObject() == pRCSRemoteResourceObject;
82                         }
83                 );
84                 return SceneAction::Ptr(new SceneAction((*memberRes), m_name, attr));
85             }
86
87             return SceneAction::Ptr(new SceneAction(sceneMemberResObj, m_name, attr));
88         }
89
90         SceneAction::Ptr Scene::getSceneAction(
91                 const RCSRemoteResourceObject::Ptr& pRCSRemoteResourceObject) const
92         {
93             auto sceneMemberRes = m_sceneCollectionResource->findSceneMembers(m_name);
94
95             auto it = std::find_if(sceneMemberRes.begin(), sceneMemberRes.end(),
96                     [&pRCSRemoteResourceObject](const SceneMemberResource::Ptr& member)
97                     {
98                         return member->getRemoteResourceObject() == pRCSRemoteResourceObject;
99                     }
100             );
101
102             if(it == sceneMemberRes.end())
103             {
104                 throw RCSInvalidParameterException("Unknown Remote Resource!");
105             }
106
107             RCSResourceAttributes actionParam;
108             for(const auto &info : (*it)->findMappingInfos(m_name))
109             {
110                 actionParam[info.key] = info.value;
111             }
112
113             return SceneAction::Ptr(new SceneAction((*it), m_name, actionParam));
114         }
115
116         std::vector<SceneAction::Ptr> Scene::getSceneActions() const
117         {
118             std::vector<SceneAction::Ptr> actions;
119             auto sceneMemberRes = m_sceneCollectionResource->findSceneMembers(m_name);
120
121             std::for_each(sceneMemberRes.begin(), sceneMemberRes.end(),
122                 [&](const SceneMemberResource::Ptr& member)
123                 {
124                     RCSResourceAttributes actionParam;
125
126                     for(const auto &it : member->findMappingInfos(m_name))
127                     {
128                         actionParam[it.key] = it.value;
129                     }
130                     actions.push_back(SceneAction::Ptr(
131                             new SceneAction(member, m_name, actionParam)));
132                 }
133             );
134
135             return actions;
136          }
137
138         std::string Scene::getName() const
139         {
140             return m_name;
141         }
142
143         void Scene::execute(ExecuteCallback cb)
144         {
145             if(cb == nullptr)
146             {
147                 throw RCSInvalidParameterException("Callback is empty!");
148             }
149
150             m_sceneCollectionResource->execute(m_name, std::move(cb));
151         }
152     } /* namespace Service */
153 } /* namespace OIC */