Update wm_client and applist
[apps/agl-service-windowmanager.git] / src / wm_client.cpp
1 /*
2  * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <json-c/json.h>
18 #include "wm_client.hpp"
19 #include "util.hpp"
20
21 #define INVALID_SURFACE_ID 0
22
23 using std::string;
24 using std::vector;
25
26 namespace wm
27 {
28
29 static const vector<string> kWMEvents = {
30     // Private event for applications
31     "syncDraw", "flushDraw", "visible", "invisible", "active", "inactive", "error"};
32 static const vector<string> kErrorDescription = {
33     "unknown-error"};
34
35 static const char kKeyDrawingName[] = "drawing_name";
36 static const char kKeyrole[] = "role";
37 static const char kKeyError[] = "error";
38 static const char kKeyErrorDesc[] = "kErrorDescription";
39
40 WMClient::WMClient(const string &appid, unsigned layer, unsigned surface, const string &role)
41     : id(appid), layer(layer),
42       role2surface(0)
43 {
44     role2surface[role] = surface;
45     for (auto x : kWMEvents)
46     {
47 #if GTEST_ENABLED
48         string ev = x;
49 #else
50         afb_event ev = afb_daemon_make_event(x.c_str());
51 #endif
52         evname2afb_event[x] = ev;
53     }
54 }
55
56 WMClient::WMClient(const string &appid, const string &role)
57     : id(appid),
58       layer(0),
59       role2surface(0),
60       evname2afb_event(0)
61 {
62     role2surface[role] = INVALID_SURFACE_ID;
63     for (auto x : kWMEvents)
64     {
65 #if GTEST_ENABLED
66         string ev = x;
67 #else
68         afb_event ev = afb_daemon_make_event(x.c_str());
69 #endif
70         evname2afb_event[x] = ev;
71     }
72 }
73
74 WMClient::WMClient(const string &appid, unsigned layer,
75     const string& layer_name, unsigned surface, const string &role)
76     : id(appid), layer(layer), wm_layer_name(layer_name),
77       role2surface(0)
78 {
79     role2surface[role] = surface;
80     for (auto x : kWMEvents)
81     {
82 #if GTEST_ENABLED
83         string ev = x;
84 #else
85         afb_event ev = afb_daemon_make_event(x.c_str());
86 #endif
87         evname2afb_event[x] = ev;
88     }
89 }
90
91 string WMClient::appID() const
92 {
93     return this->id;
94 }
95
96 unsigned WMClient::surfaceID(const string &role) const
97 {
98     if (0 == this->role2surface.count(role))
99     {
100         return INVALID_SURFACE_ID;
101     }
102     return this->role2surface.at(role);
103 }
104
105 std::string WMClient::role(unsigned surface) const
106 {
107     for(const auto& x : this->role2surface)
108     {
109         if(x.second == surface)
110         {
111             return x.first;
112         }
113     }
114     return std::string("");
115 }
116
117 unsigned WMClient::layerID() const
118 {
119     return this->layer;
120 }
121
122 unsigned WMClient::surfaceID() const
123 {
124     return this->surface;
125 }
126
127 const string& WMClient::getWMLayerName()
128 {
129     return this->wm_layer_name;
130 }
131
132 void WMClient::setRole(const string& role)
133 {
134     this->role_list.clear();
135     this->role_list.push_back(role);
136 }
137
138 void WMClient::appendRole(const string& role)
139 {
140     this->role_list.push_back(role);
141 }
142
143 /**
144  * Add the pair of role and surface to the client
145  *
146  * This function set the pair of role and surface to the client.
147  * This function is used for the client which has multi surfaces.
148  * If the model and relationship for role and surface(layer)
149  * is changed, this function will be changed
150  * Current Window Manager doesn't use this function.
151  *
152  * @param     string[in] role
153  * @param     unsigned[in] surface
154  * @return    true
155  */
156 bool WMClient::addSurface(const string &role, unsigned surface)
157 {
158     HMI_DEBUG("Add role %s with surface %d", role.c_str(), surface);
159     if (0 != this->role2surface.count(role))
160     {
161         HMI_NOTICE("override surfaceID %d with %d", this->role2surface[role], surface);
162     }
163     this->role2surface[role] = surface;
164     return true;
165 }
166
167 bool WMClient::removeSurfaceIfExist(unsigned surface)
168 {
169     bool ret = false;
170     for (auto &x : this->role2surface)
171     {
172         if (surface == x.second)
173         {
174             HMI_INFO("Remove surface from client %s: role %s, surface: %d",
175                                 this->id.c_str(), x.first.c_str(), x.second);
176             this->role2surface.erase(x.first);
177             ret = true;
178             break;
179         }
180     }
181     return ret;
182 }
183
184 bool WMClient::removeRole(const string &role)
185 {
186     bool ret = false;
187     if (this->role2surface.count(role) != 0)
188     {
189         this->role2surface.erase(role);
190         ret = true;
191     }
192     return ret;
193 }
194
195 #if GTEST_ENABLED
196 bool WMClient::subscribe(afb_req req, const string &evname)
197 {
198     if(evname != kKeyError){
199         HMI_DEBUG("error is only enabeled for now");
200         return false;
201     }
202     int ret = afb_req_subscribe(req, this->evname2afb_event[evname]);
203     if (ret)
204     {
205         HMI_DEBUG("Failed to subscribe %s", evname.c_str());
206         return false;
207     }
208     return true;
209 }
210
211 void WMClient::emitError(WM_CLIENT_ERROR_EVENT ev)
212 {
213     if (!afb_event_is_valid(this->evname2afb_event[kKeyError])){
214         HMI_ERROR("event err is not valid");
215         return;
216     }
217     json_object *j = json_object_new_object();
218     json_object_object_add(j, kKeyError, json_object_new_int(ev));
219     json_object_object_add(j, kKeyErrorDesc, json_object_new_string(kErrorDescription[ev].c_str()));
220     HMI_DEBUG("error: %d, description:%s", ev, kErrorDescription[ev].c_str());
221
222     int ret = afb_event_push(this->evname2afb_event[kKeyError], j);
223     if (ret != 0)
224     {
225         HMI_DEBUG("afb_event_push failed: %m");
226     }
227 }
228 #endif
229
230 void WMClient::dumpInfo()
231 {
232     DUMP("APPID : %s", id.c_str());
233     DUMP("  LAYER : %d", layer);
234     for (const auto &x : this->role2surface)
235     {
236         DUMP("  ROLE  : %s , SURFACE : %d", x.first.c_str(), x.second);
237     }
238 }
239
240 } // namespace wm