Merge "Merge branch 'master' into group-manager" into group-manager
[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 createSceneCollectionObject();
44
45             void addScene(std::string &&);
46             void addScene(const std::string &);
47
48             void addSceneMember(SceneMemberResource::Ptr);
49
50             void execute(std::string &&);
51             void execute(const std::string &);
52             void execute(std::string &&, SceneExecuteCallback);
53             void execute(const std::string &, SceneExecuteCallback);
54
55             void setName(std::string &&);
56             void setName(const std::string &);
57
58             std::vector<std::string> getSceneValues() const;
59
60             std::string getName() const;
61
62             std::string getId() const;
63             std::string getUri() const;
64             std::string getAddress() const;
65
66             std::vector<SceneMemberResource::Ptr> getSceneMembers() const;
67
68             RCSResourceObject::Ptr getRCSResourceObject() const;
69
70         private:
71             class SceneExecuteResponseHandler
72             {
73             public:
74                 typedef std::shared_ptr<SceneExecuteResponseHandler> Ptr;
75
76                 SceneExecuteResponseHandler()
77                 : m_numOfMembers(0), m_responseMembers(0), m_errorCode(0) { }
78                 ~SceneExecuteResponseHandler() = default;
79
80                 int m_numOfMembers;
81                 int m_responseMembers;
82                 int m_errorCode;
83                 std::weak_ptr<SceneCollectionResource> m_owner;
84                 SceneExecuteCallback m_cb;
85
86                 static SceneExecuteResponseHandler::Ptr createExecuteHandler(
87                         const SceneCollectionResource::Ptr, SceneExecuteCallback);
88                 void onResponse(const RCSResourceAttributes &, int);
89             };
90
91             class SceneCollectionRequestHandler
92             {
93             public:
94                 SceneCollectionRequestHandler() = default;
95                 ~SceneCollectionRequestHandler() = default;
96
97                 std::weak_ptr<SceneCollectionResource> m_owner;
98
99                 RCSSetResponse onSetRequest(
100                         const RCSRequest &, RCSResourceAttributes &);
101                 void onExecute(int, const RCSRequest &, RCSResourceAttributes &);
102
103             private:
104                 RCSSetResponse addSceneRequest(
105                         const RCSRequest &, RCSResourceAttributes &);
106                 RCSSetResponse executeSceneRequest(
107                         const RCSRequest &, RCSResourceAttributes &);
108                 RCSSetResponse createSceneMemberRequest(
109                         const RCSRequest &, RCSResourceAttributes &);
110                 RCSSetResponse setSceneCollectionName(
111                         const RCSRequest &, RCSResourceAttributes &);
112
113                 SceneMemberResource::Ptr createSceneMemberFromRemote(RCSResourceAttributes &);
114                 void addMemberInfoFromRemote(SceneMemberResource::Ptr,
115                         std::vector<RCSResourceAttributes>);
116             };
117
118             std::string m_uri;
119             std::string m_address;
120
121             RCSResourceObject::Ptr m_sceneCollectionResourceObj;
122             std::mutex m_sceneMemberLock;
123             std::vector<SceneMemberResource::Ptr> m_sceneMembers;
124
125             SceneCollectionRequestHandler m_requestHandler;
126             std::mutex m_executeHandlerLock;
127             std::list<SceneExecuteResponseHandler::Ptr> m_executeHandlers;
128
129             SceneCollectionResource() = default;
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             void createResourceObject();
140             void setDefaultAttributes();
141             void initSetRequestHandler();
142
143             void onExecute(int, SceneExecuteCallback, SceneExecuteResponseHandler::Ptr);
144         };
145     }
146 }
147
148
149 #endif // SCENE_COLLECTION_RESOURCE_OBJECT_H
150