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.
17 #include <json-c/json.h>
18 #include "wm_client.hpp"
20 #include <ilm/ilm_control.h>
22 #define INVALID_SURFACE_ID 0
30 static const vector<string> kWMEvents = {
31 // Private event for applications
32 "syncDraw", "flushDraw", "visible", "invisible", "active", "inactive", "error"};
33 static const vector<string> kErrorDescription = {
36 static const char kKeyDrawingName[] = "drawing_name";
37 static const char kKeyrole[] = "role";
38 static const char kKeyError[] = "error";
39 static const char kKeyErrorDesc[] = "kErrorDescription";
41 WMClient::WMClient(const string &appid, unsigned layer, unsigned surface, const string &role)
42 : id(appid), layer(layer), is_source_set(false),
45 role2surface[role] = surface;
46 for (auto x : kWMEvents)
51 afb_event_t ev = afb_api_make_event(afbBindingV3root, x.c_str());
57 WMClient::WMClient(const string &appid, const string &role)
64 role2surface[role] = INVALID_SURFACE_ID;
65 for (auto x : kWMEvents)
70 afb_event_t ev = afb_api_make_event(afbBindingV3root, x.c_str());
76 WMClient::WMClient(const string &appid, unsigned layer, const string &role)
83 role2surface[role] = INVALID_SURFACE_ID;
84 for (auto x : kWMEvents)
89 afb_event_t ev = afb_api_make_event(afbBindingV3root, x.c_str());
95 string WMClient::appID() const
100 string WMClient::role() const
102 return this->main_role;
105 unsigned WMClient::layerID() const
110 unsigned WMClient::surfaceID() const
112 return this->surface;
115 void WMClient::registerSurface(unsigned surface)
117 this->surface = surface;
121 * Add surface to the client
123 * This function add main surface to the client(ivi_layer).
125 * @param string[in] role
128 WMError WMClient::addSurface(unsigned surface)
130 this->surface = surface;
131 ilmErrorTypes err = ilm_layerAddSurface(this->layer, surface);
133 if(err == ILM_SUCCESS)
135 err = ilm_commitChanges();
137 return (err == ILM_SUCCESS) ? WMError::SUCCESS : WMError::FAIL;
140 void WMClient::setSurfaceSizeCorrectly()
142 this->is_source_set = true;
145 bool WMClient::isSourceSizeSet()
147 return this->is_source_set;
150 bool WMClient::removeSurfaceIfExist(unsigned surface)
153 if(surface == this->surface)
155 this->surface = INVALID_SURFACE_ID;
163 bool WMClient::subscribe(afb_req_t req, const string &evname)
165 if(evname != kKeyError){
166 HMI_DEBUG("error is only enabeled for now");
169 int ret = afb_req_subscribe(req, this->evname2list[evname]);
172 HMI_DEBUG("Failed to subscribe %s", evname.c_str());
178 void WMClient::emitError(WM_CLIENT_ERROR_EVENT ev)
180 if (!afb_event_is_valid(this->evname2list[kKeyError])){
181 HMI_ERROR("event err is not valid");
184 json_object *j = json_object_new_object();
185 json_object_object_add(j, kKeyError, json_object_new_int(ev));
186 json_object_object_add(j, kKeyErrorDesc, json_object_new_string(kErrorDescription[ev].c_str()));
187 HMI_DEBUG("error: %d, description:%s", ev, kErrorDescription[ev].c_str());
189 int ret = afb_event_push(this->evname2list[kKeyError], j);
192 HMI_DEBUG("afb_event_push failed: %m");
197 void WMClient::dumpInfo()
199 DUMP("APPID : %s", id.c_str());
200 DUMP(" LAYER : %d", layer);
201 for (const auto &x : this->role2surface)
203 DUMP(" ROLE : %s , SURFACE : %d", x.first.c_str(), x.second);