update
[apps/onscreenapp.git] / app / eventhandler.cpp
diff --git a/app/eventhandler.cpp b/app/eventhandler.cpp
new file mode 100644 (file)
index 0000000..044eec6
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ * 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 <functional>
+#include <QUrl>
+#include <QDebug>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QQuickWindow>
+#include <cstring>
+
+#include "eventhandler.h"
+
+void* EventHandler::myThis = 0;
+
+EventHandler::EventHandler(QObject *parent) :
+    QObject(parent),
+    mp_hs(NULL),
+    mp_wm(NULL),
+    mp_qw(NULL)
+{
+    m_dspreq = QString("");
+    my_id = QString(APP_ID);
+    my_role = QString(ROLE_NAME);
+    m_req.clear();
+}
+
+EventHandler::~EventHandler()
+{
+    if (mp_hs != NULL) {
+        delete mp_hs;
+    }
+    if (mp_wm != NULL) {
+        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);
+    
+//    my_id = QString(std::strtok(std::getenv("AFM_ID"), "@"));
+    mp_hs->registerCallback(nullptr, EventHandler::onRep_static);
+    mp_hs->set_event_handler(LibHomeScreen::Event_ShowWindow, [this](json_object *object){
+        // {"id": "onscreenXXX", "parameter": {"replyid": "app's id", "file": "onsreen file path", "data": {"key": "value", ...}}}
+        struct json_object *appid;
+        json_object_object_get_ex(object, "application_id", &appid);
+        const char *id = json_object_get_string(appid);
+        if(my_id != QString(id)) {
+            HMI_DEBUG(APP_ID, "Event_ShowWindow id = %s", id);
+            return;
+        }
+        else
+            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", &param);
+        if(json_object_get_type(param) != json_type_object ) {
+            HMI_DEBUG(APP_ID, "parameter error!");
+            return;
+        }
+
+        struct json_object *replyid;
+        json_object_object_get_ex(param, "replyid", &replyid);
+        const char *_replyid = json_object_get_string(replyid);
+
+        struct json_object *path;
+        json_object_object_get_ex(param, "file", &path);
+        const char *_path = json_object_get_string(path);
+
+        struct json_object *data;
+        json_bool rtn = json_object_object_get_ex(param, "data", &data);
+        const char* _data = "";
+        if(rtn) {
+            _data = json_object_to_json_string(data);
+        }
+
+        m_dspreq = QString(_replyid);
+        if(m_req.contains(m_dspreq)) {
+            m_req[m_dspreq] = qMakePair(QString(_path), QString(_data));
+        }
+        else
+            m_req.insert(QString(m_dspreq), qMakePair(QString(_path), QString(_data)));
+
+        this->mp_wm->activateWindow(ROLE_NAME);
+        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, "release onScreen is %s!", appid);
+
+        if (appid == my_id) {
+            emit this->signalLoader(QVariant(""));
+            this->mp_wm->deactivateWindow(ROLE_NAME);
+        }
+        else {
+            HMI_DEBUG(APP_ID, "!!!!releaseOnScreen is not displaying!!!!!");
+        }
+    });
+
+    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::setQuickWindow(QQuickWindow *qw)
+{
+    mp_qw = qw;
+}
+
+void EventHandler::onRep_static(struct json_object* reply_contents)
+{
+    static_cast<EventHandler*>(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(QString &role)
+{
+    HMI_DEBUG(APP_ID, "EventHandler::activateWindow()");
+    mp_wm->activateWindow(role);
+}
+
+void EventHandler::deactivateWindow(QString &role)
+{
+    HMI_DEBUG(APP_ID, "EventHandler::deactivateWindow()");
+
+    emit this->signalLoader(QVariant(""));
+    mp_wm->deactivateWindow(role);
+}
+
+void EventHandler::onScreenReply(const QString &btn_name)
+{
+    HMI_DEBUG(APP_ID, "EventHandler::onScreenReply()");
+    deactivateWindow(my_role);
+
+    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, "method", json_object_new_string("Buttons.ButtonPress"));
+    json_object_object_add(j_param, "buttonName", json_object_new_string(btn_name.toStdString().c_str()));
+    json_object_object_add(j_param, "buttonPressMode", json_object_new_string("Short"));
+    json_object_object_add(j_obj, "parameter", j_param);
+
+    mp_hs->replyShowWindow(m_dspreq.toLatin1(), j_obj);
+}