[IOT-1420] Solve that if, rt properties ommited
[platform/upstream/iotivity.git] / service / scene-manager / src / SceneCollectionResource.h
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 #ifndef SCENE_COLLECTION_RESOURCE_OBJECT_H
22 #define SCENE_COLLECTION_RESOURCE_OBJECT_H
23
24 #include <list>
25
26 #include "RCSResourceObject.h"
27 #include "SceneCommons.h"
28 #include "SceneMemberResource.h"
29
30 namespace OIC
31 {
32     namespace Service
33     {
34         class SceneCollectionResource
35                 : public std::enable_shared_from_this<SceneCollectionResource>
36         {
37         public:
38             typedef std::shared_ptr< SceneCollectionResource > Ptr;
39             typedef std::function< void(int) > SceneExecuteCallback;
40
41             ~SceneCollectionResource() = default;
42
43             static SceneCollectionResource::Ptr create();
44             static SceneCollectionResource::Ptr create(const RCSResourceAttributes &);
45
46             void addScene(std::string &&);
47             void addScene(const std::string &);
48
49             void addSceneMember(SceneMemberResource::Ptr);
50
51             void execute(std::string &&);
52             void execute(const std::string &);
53             void execute(std::string &&, SceneExecuteCallback);
54             void execute(const std::string &, SceneExecuteCallback);
55
56             void setName(std::string &&);
57             void setName(const std::string &);
58
59             std::vector<std::string> getSceneValues() const;
60
61             std::string getName() const;
62
63             std::string getId() const;
64             std::string getUri() const;
65             std::string getAddress() const;
66
67             std::vector<SceneMemberResource::Ptr> getSceneMembers() const;
68
69             std::vector<SceneMemberResource::Ptr> findSceneMembers(
70                     const std::string & sceneName) const;
71
72             RCSResourceObject::Ptr getRCSResourceObject() const;
73
74         private:
75             class SceneExecuteResponseHandler
76             {
77             public:
78                 typedef std::shared_ptr<SceneExecuteResponseHandler> Ptr;
79
80                 SceneExecuteResponseHandler()
81                 : m_numOfMembers(0), m_responseMembers(0), m_errorCode(0) { }
82                 ~SceneExecuteResponseHandler() = default;
83
84                 int m_numOfMembers;
85                 int m_responseMembers;
86                 int m_errorCode;
87                 std::weak_ptr<SceneCollectionResource> m_owner;
88                 SceneExecuteCallback m_cb;
89
90                 static SceneExecuteResponseHandler::Ptr createExecuteHandler(
91                         const SceneCollectionResource::Ptr, SceneExecuteCallback);
92                 void onResponse(const RCSResourceAttributes &, int);
93             };
94
95             class SceneCollectionRequestHandler
96             {
97             public:
98                 SceneCollectionRequestHandler() = default;
99                 ~SceneCollectionRequestHandler() = default;
100
101                 std::weak_ptr<SceneCollectionResource> m_owner;
102
103                 RCSSetResponse onSetRequest(
104                         const RCSRequest &, RCSResourceAttributes &);
105
106             private:
107                 RCSSetResponse addSceneRequest(
108                         const RCSRequest &, RCSResourceAttributes &);
109                 RCSSetResponse executeSceneRequest(
110                         const RCSRequest &, RCSResourceAttributes &);
111                 RCSSetResponse createSceneMemberRequest(
112                         const RCSRequest &, RCSResourceAttributes &);
113                 RCSSetResponse setSceneCollectionName(
114                         const RCSRequest &, RCSResourceAttributes &);
115
116                 void addMemberInfoFromRemote(SceneMemberResource::Ptr,
117                         std::vector<RCSResourceAttributes>);
118             };
119
120             std::string m_uri;
121             std::string m_address;
122
123             RCSResourceObject::Ptr m_sceneCollectionResourceObject;
124             mutable std::mutex m_sceneMemberLock;
125             std::vector<SceneMemberResource::Ptr> m_sceneMembers;
126
127             SceneCollectionRequestHandler m_requestHandler;
128
129             SceneCollectionResource();
130
131             SceneCollectionResource(const SceneCollectionResource &) = delete;
132             SceneCollectionResource & operator = (
133                     const SceneCollectionResource &) = delete;
134
135             SceneCollectionResource(SceneCollectionResource &&) = delete;
136             SceneCollectionResource & operator = (
137                     SceneCollectionResource &&) = delete;
138
139             RCSResourceObject::Ptr createResourceObject();
140             void setDefaultAttributes();
141             void initSetRequestHandler();
142         };
143     }
144 }
145
146 #endif // SCENE_COLLECTION_RESOURCE_OBJECT_H
147