2 * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include "applist.hpp"
19 #include "../include/hmi-debug.h"
21 using std::shared_ptr;
35 void AppList::addClient(const string &appid, const string &role)
37 shared_ptr<WMClient> client = std::make_shared<WMClient>(appid, role);
38 this->app2client[appid] = client;
42 void AppList::addClient(const std::string &appid, unsigned layer, unsigned surface, const std::string &role)
44 shared_ptr<WMClient> client = std::make_shared<WMClient>(appid, layer, surface, role);
45 this->app2client[appid] = client;
49 void AppList::removeClient(const string &appid)
51 this->app2client.erase(appid);
54 bool AppList::contains(const string &appid) const
56 auto result = this->app2client.find(appid);
57 return (this->app2client.end() != result) ? true : false;
60 void AppList::removeSurface(unsigned surface_id){
61 // This function may be very slow
63 for (auto &x : this->app2client)
65 ret = x.second->removeSurfaceIfExist(surface_id);
67 HMI_DEBUG("wm", "remove surface %d from Client %s finish", surface_id, x.second->appID().c_str());
74 * @brief get WMClient object. Before call this function, must call "contains"
75 * to check the key is contained, otherwise, you have to take care of std::out_of_range.
76 * @param string[in] application id(key)
77 * @return WMClient object
79 shared_ptr<WMClient> AppList::lookUpClient(const string &appid)
81 return this->app2client.at(appid);
84 int AppList::countClient() const
86 return this->app2client.size();
89 unsigned AppList::currentRequestNumber() const
91 return this->current_req;
94 WMError AppList::lookUpFloatingSurface(unsigned pid, unsigned *surface)
96 WMError ret = WMError::NO_ENTRY;
98 for (auto itr = this->floating_surfaces.begin(); itr != this->floating_surfaces.end(); ++itr)
101 *surface = itr->surface_id;
102 itr = this->floating_surfaces.erase(itr);
103 ret = WMError::SUCCESS;
104 HMI_DEBUG("wm", "Erase surface %d", *surface);
111 WMError AppList::lookUpFloatingSurface(const std::string &appid, unsigned *surface)
113 HMI_ERROR("wm", "This function is not implemented");
114 return WMError::SUCCESS;
117 void addFloatingClient(const std::string &appid, unsigned layer, const std::string &role)
121 WMError AppList::appendRole(const std::string &id, const std::string &role, unsigned surface)
123 WMError wm_err = WMError::NO_ENTRY;
124 if (this->contains(id))
126 auto x = this->lookUpClient(id);
127 x->addSurface(role, surface);
128 wm_err = WMError::SUCCESS;
133 unsigned AppList::getRequestNumber(const string &appid) const
135 for (const auto &x : this->req_list)
137 // Since app will not request twice and more, comparing appid is enough?
138 if ((x.trigger.appid == appid))
146 unsigned AppList::addAllocateRequest(WMRequest req)
148 if (this->req_list.size() == 0)
150 req.req_num = current_req;
154 HMI_SEQ_DEBUG(this->current_req, "add: %d", this->req_list.back().req_num + 1);
155 req.req_num = this->req_list.back().req_num + 1;
157 this->req_list.push_back(req);
158 return req.req_num; // return 1; if you test time_expire
161 struct WMTrigger AppList::getRequest(unsigned req_num)
163 for (const auto &x : this->req_list)
165 if (req_num == x.req_num)
172 const vector<struct WMAction> &AppList::getActions(unsigned req_num)
174 for (auto &x : this->req_list)
176 if (req_num == x.req_num)
178 return x.sync_draw_req;
183 WMError AppList::setAction(unsigned req_num, const struct WMAction &action)
185 WMError result = WMError::FAIL;
186 for (auto &x : this->req_list)
188 if (req_num != x.req_num)
192 x.sync_draw_req.push_back(action);
193 result = WMError::SUCCESS;
202 * This function set action with parameters.
203 * if visible is true, it means app should be visible, so enddraw_finished parameter should be false.
204 * otherwise (visible is false) app should be invisible. Then enddraw_finished param is set to true.
205 * This function doesn't support actions for focus yet.
207 WMError AppList::setAction(unsigned req_num, const string &appid, const string &role, const string &area, bool visible)
209 WMError result = WMError::NOT_REGISTERED;
210 for (auto &x : req_list)
212 if (req_num != x.req_num)
216 bool edraw_f = (visible) ? false : true;
217 WMAction action{appid, role, area, visible, edraw_f};
219 x.sync_draw_req.push_back(action);
220 result = WMError::SUCCESS;
227 * This function checks
228 * * req_num is equal to current request number
229 * * appid and role are equeal to the appid and role stored in action list(sync_draw_req)
231 bool AppList::setEndDrawFinished(unsigned req_num, const string &appid, const string &role)
234 for (auto &x : req_list)
236 if (req_num < x.req_num)
240 if (req_num == x.req_num)
242 for (auto &y : x.sync_draw_req)
244 if (y.appid == appid && y.role == role)
246 y.end_draw_finished = true;
257 * @brief check all actions of the requested sequence is finished
258 * @param unsigned request_number
259 * @return true if all action is set.
261 bool AppList::endDrawFullfilled(unsigned req_num)
264 for (const auto &x : req_list)
266 if (req_num < x.req_num)
270 if (req_num == x.req_num)
273 for (const auto &y : x.sync_draw_req)
275 result &= y.end_draw_finished;
286 void AppList::removeRequest(unsigned req_num)
288 this->req_list.erase(remove_if(this->req_list.begin(), this->req_list.end(),
289 [req_num](WMRequest x) {
290 return x.req_num == req_num;
297 if (0 == this->current_req)
299 this->current_req = 1;
303 bool AppList::haveRequest() const
305 return !this->req_list.empty();
308 void AppList::clientDump()
310 DUMP("======= client dump =====");
311 for (const auto &x : this->app2client)
313 const auto &y = x.second;
316 DUMP("======= client dump end=====");
319 void AppList::reqDump()
321 DUMP("======= req dump =====");
322 DUMP("current request : %d", current_req);
323 for (const auto &x : req_list)
325 DUMP("requested with : %d", x.req_num);
326 DUMP("Trigger : (APPID :%s, ROLE :%s, AREA :%s, TASK: %d)",
327 x.trigger.appid.c_str(),
328 x.trigger.role.c_str(),
329 x.trigger.area.c_str(),
332 for (const auto &y : x.sync_draw_req)
335 "Action : (APPID :%s, ROLE :%s, AREA :%s, END_DRAW_FINISHED: %d)",
339 y.end_draw_finished);
342 DUMP("======= req dump end =====\n");