/* * Copyright (c) 2017 TOYOTA MOTOR CORPORATION * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include "eventhandler.h" const char _parameter[] = "parameter"; const char _replyto[] = "replyto"; const char _data[] = "data"; const char _file[] = "file"; const char _area[] = "area"; const char _suffix[] = ".qml"; const char _button_name[] = "buttonName"; const char _button_press_mode[] = "buttonPressMode"; const char _button_press_state[] = "buttonPressState"; const char _drawing_name[] = "drawing_name"; const char _application_id[] = "application_id"; const char _onscreen_directory[] = "/usr/lib/qt5/qml/AGL/OnScreen/"; void* EventHandler::myThis = 0; EventHandler::EventHandler(QObject *parent) : QObject(parent), mp_hs(nullptr), mp_wm(nullptr) { m_dspreq = QString(""); m_req.clear(); } EventHandler::~EventHandler() { if (mp_hs != nullptr) { delete mp_hs; } if (mp_wm != nullptr) { delete mp_wm; } } void EventHandler::init(int port, const char *token) { myThis = this; mp_wm = new QLibWindowmanager(); mp_wm->init(port, token); mp_hs = new LibHomeScreen(); mp_hs->init(port, token); mp_hs->registerCallback(nullptr, EventHandler::onRep_static); mp_hs->set_event_handler(LibHomeScreen::Event_ShowWindow, [this](json_object *object){ // {"id": "onscreenXXX", "parameter": {"file": "onsreen file path", "data": {"key": "value", ...}}, "replyto": "app's id"} HMI_DEBUG(APP_ID, "recived json message is[%s]", json_object_get_string(object)); struct json_object *param; json_object_object_get_ex(object, _parameter, ¶m); if(json_object_get_type(param) != json_type_object ) { HMI_DEBUG(APP_ID, "parameter error!"); return; } struct json_object *qml_path; const char *file = nullptr; if(json_object_object_get_ex(param, _file, &qml_path)) file = json_object_get_string(qml_path); if(file == nullptr) { HMI_DEBUG(APP_ID, "received qml file is null!"); return; } QString qml_file = QString(_onscreen_directory) + file; QFileInfo file_info(qml_file); if(!file_info.isFile() || !qml_file.contains(QString(_suffix), Qt::CaseSensitive)) { HMI_DEBUG(APP_ID, "received qml file error! file=%s.", file); return; } struct json_object *replyid; const char *replyto = nullptr; if(json_object_object_get_ex(param, _replyto, &replyid)) replyto = json_object_get_string(replyid); if(replyto == nullptr) { HMI_DEBUG(APP_ID, "received replyto is null!"); return; } struct json_object *display_area; const char *area = nullptr; if(json_object_object_get_ex(param, _area, &display_area)) area = json_object_get_string(display_area); struct json_object *param_data; const char* data = nullptr; if(json_object_object_get_ex(param, _data, ¶m_data)) data = json_object_to_json_string(param_data); m_dspreq = QString(replyto); if(m_req.contains(m_dspreq)) { m_req[m_dspreq] = qMakePair(qml_file, QString(data)); } else m_req.insert(QString(m_dspreq), qMakePair(qml_file, QString(data))); if(area == nullptr) this->activateWindow(ROLE_NAME); else this->activateWindow(ROLE_NAME, area); HMI_DEBUG(APP_ID, "received showWindow event, end!, line=%d", __LINE__); }); mp_hs->set_event_handler(LibHomeScreen::Event_HideWindow, [this](json_object *object){ struct json_object *value; json_object_object_get_ex(object, _application_id, &value); const char *appid = json_object_get_string(value); HMI_DEBUG(APP_ID, "request release onScreen application is %s!", appid); // onscreenapp only can release by application which request show if (appid == m_dspreq) this->deactivateWindow(); else HMI_DEBUG(APP_ID, "request hideWindow application isn't request displaying application, m_dspreq=%s", m_dspreq.toStdString().c_str()); }); if (mp_wm->requestSurface(ROLE_NAME) != 0) { HMI_DEBUG(APP_ID, "!!!!LayoutHandler requestSurface Failed!!!!!"); exit(EXIT_FAILURE); } mp_wm->set_event_handler(QLibWindowmanager::Event_SyncDraw, [this](json_object *object) { HMI_DEBUG(APP_ID, "Surface %s got syncDraw!", ROLE_NAME); emit this->signalLoader(QVariant("file://" + m_req[m_dspreq].first)); emit this->signalOnScreenParameter(QVariant(m_req[m_dspreq].second)); this->mp_wm->endDraw(QString(ROLE_NAME)); }); mp_wm->set_event_handler(QLibWindowmanager::Event_Visible, [this](json_object *object) { struct json_object *value; json_object_object_get_ex(object, _drawing_name, &value); const char *name = json_object_get_string(value); HMI_DEBUG(APP_ID, "Event_Visible kKeyDrawingName = %s", name); }); mp_wm->set_event_handler(QLibWindowmanager::Event_Invisible, [this](json_object *object) { struct json_object *value; json_object_object_get_ex(object, _drawing_name, &value); const char *name = json_object_get_string(value); HMI_DEBUG(APP_ID, "Event_Invisible kKeyDrawingName = %s", name); }); HMI_DEBUG(APP_ID, "LayoutHander::init() finished."); } void EventHandler::onRep_static(struct json_object* reply_contents) { static_cast(EventHandler::myThis)->onRep(reply_contents); } void EventHandler::onRep(struct json_object* reply_contents) { const char* str = json_object_to_json_string(reply_contents); HMI_DEBUG(APP_ID, "EventHandler::onReply %s", str); } void EventHandler::activateWindow(const char *role, const char *area) { HMI_DEBUG(APP_ID, "EventHandler::activateWindow()"); mp_wm->activateWindow(role, area); } void EventHandler::deactivateWindow() { HMI_DEBUG(APP_ID, "EventHandler::deactivateWindow()"); emit this->signalLoader(QVariant("")); mp_wm->deactivateWindow(ROLE_NAME); } void EventHandler::onScreenReply(const QString &btn_name, const QString &press_mode, const QString &press_state) { HMI_DEBUG(APP_ID, "EventHandler::onScreenReply()"); // deactivateWindow(); struct json_object* j_obj = json_object_new_object(); json_object_object_add(j_obj, _application_id, json_object_new_string(m_dspreq.toLatin1())); struct json_object* j_param = json_object_new_object(); json_object_object_add(j_param, _button_name, json_object_new_string(btn_name.toStdString().c_str())); json_object_object_add(j_param, _button_press_mode, json_object_new_string(press_mode.toStdString().c_str())); json_object_object_add(j_param, _button_press_state, json_object_new_string(press_state.toStdString().c_str())); json_object_object_add(j_obj, _parameter, j_param); mp_hs->replyShowWindow(m_dspreq.toLatin1(), j_obj); }