aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp375
1 files changed, 303 insertions, 72 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 6483655..6fff161 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -18,6 +18,9 @@
#include <algorithm>
#include <mutex>
#include <json.h>
+#include <stdlib.h>
+#include <vector>
+#include "util.hpp"
#include "window_manager.hpp"
#include "json_helper.hpp"
@@ -56,7 +59,7 @@ int afb_instance::init()
return this->wmgr.init();
}
-static int _binding_init()
+int _binding_init()
{
HMI_NOTICE("WinMan ver. %s", WINMAN_VERSION_STRING);
@@ -78,7 +81,7 @@ error:
return -1;
}
-static int binding_init (afb_api_t api) noexcept
+int binding_init() noexcept
{
try
{
@@ -110,20 +113,21 @@ static void cbRemoveClientCtxt(void *data)
delete ctxt;
}
-static void createSecurityContext(afb_req_t req, const char* appid, const char* role)
+static void createSecurityContext(afb_req req, const char* appid, const char* role)
{
WMClientCtxt *ctxt = (WMClientCtxt *)afb_req_context_get(req);
if (!ctxt)
{
// Create Security Context at first time
- WMClientCtxt *ctxt = new WMClientCtxt(appid, role);
+ const char *new_role = g_afb_instance->wmgr.convertRoleOldToNew(role);
+ WMClientCtxt *ctxt = new WMClientCtxt(appid, new_role);
HMI_DEBUG("create session for %s", ctxt->name.c_str());
afb_req_session_set_LOA(req, 1);
afb_req_context_set(req, ctxt, cbRemoveClientCtxt);
}
}
-void windowmanager_requestsurface(afb_req_t req) noexcept
+void windowmanager_requestsurface(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
if (g_afb_instance == nullptr)
@@ -169,7 +173,7 @@ void windowmanager_requestsurface(afb_req_t req) noexcept
}
}
-void windowmanager_requestsurfacexdg(afb_req_t req) noexcept
+void windowmanager_requestsurfacexdg(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
if (g_afb_instance == nullptr)
@@ -222,7 +226,50 @@ void windowmanager_requestsurfacexdg(afb_req_t req) noexcept
}
}
-void windowmanager_activatewindow(afb_req_t req) noexcept
+void windowmanager_setrole(afb_req req) noexcept
+{
+ std::lock_guard<std::mutex> guard(binding_m);
+ if (g_afb_instance == nullptr)
+ {
+ afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?");
+ return;
+ }
+ try
+ {
+ json_object *jreq = afb_req_json(req);
+
+ json_object *j_role = nullptr;
+ if (!json_object_object_get_ex(jreq, "role", &j_role))
+ {
+ afb_req_fail(req, "failed", "Need char const* argument role");
+ return;
+ }
+ char const *a_role = json_object_get_string(j_role);
+ char *appid = afb_req_get_application_id(req);
+
+ if(appid)
+ {
+ auto ret = g_afb_instance->wmgr.api_set_role(appid, a_role);
+ if (!ret)
+ {
+ afb_req_fail(req, "failed", "Couldn't register");
+ }
+ else
+ {
+ createSecurityContext(req, appid, a_role);
+ afb_req_success(req, NULL, "success");
+ }
+ free(appid);
+ }
+ }
+ catch (std::exception &e)
+ {
+ afb_req_fail_f(req, "failed", "Uncaught exception while calling requestsurfacexdg: %s", e.what());
+ return;
+ }
+}
+
+void windowmanager_activatewindow(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
if (g_afb_instance == nullptr)
@@ -250,17 +297,40 @@ void windowmanager_activatewindow(afb_req_t req) noexcept
char* appid = afb_req_get_application_id(req);
if(appid)
{
- g_afb_instance->wmgr.api_activate_window(
- appid, a_drawing_name, a_drawing_area,
- [&req](const char *errmsg) {
- if (errmsg != nullptr)
- {
- HMI_ERROR(errmsg);
- afb_req_fail(req, "failed", errmsg);
- return;
- }
- afb_req_success(req, NULL, "success");
- });
+ auto reply = [&req](const char *errmsg) {
+ if (errmsg != nullptr)
+ {
+ HMI_ERROR(errmsg);
+ afb_req_fail(req, "failed", errmsg);
+ return;
+ }
+ afb_req_success(req, NULL, "success");
+ };
+
+ if (!g_afb_instance->wmgr.wmcon.isRemoteArea(a_drawing_area))
+ {
+ g_afb_instance->wmgr.api_activate_window(
+ appid, a_drawing_name, a_drawing_area, reply);
+ }
+ else
+ {
+ std::string ecu_name;
+ ecu_name = g_afb_instance->wmgr.wmcon.getAreaToEcuName(a_drawing_area);
+
+ // TODO: temporarily
+ if (!g_afb_instance->wmgr.wmcon.isConnectionMode())
+ {
+ HMI_ERROR("WM Standalone Mode");
+ afb_req_fail(req, "failed", "Standalone Mode");
+ }
+ else
+ {
+ // If Window Manager is slave and this request is for master,
+ // request activateWindow to master
+ g_afb_instance->wmgr.api_activate_surface_to_master(
+ appid, a_drawing_name, a_drawing_area, reply);
+ }
+ }
free(appid);
}
}
@@ -272,7 +342,7 @@ void windowmanager_activatewindow(afb_req_t req) noexcept
}
}
-void windowmanager_deactivatewindow(afb_req_t req) noexcept
+void windowmanager_deactivatewindow(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
if (g_afb_instance == nullptr)
@@ -293,17 +363,30 @@ void windowmanager_deactivatewindow(afb_req_t req) noexcept
char* appid = afb_req_get_application_id(req);
if(appid)
{
- g_afb_instance->wmgr.api_deactivate_window(
- appid, a_drawing_name,
- [&req](const char *errmsg) {
- if (errmsg != nullptr)
- {
- HMI_ERROR(errmsg);
- afb_req_fail(req, "failed", errmsg);
- return;
- }
- afb_req_success(req, NULL, "success");
- });
+ auto reply = [&req](const char *errmsg) {
+ if (errmsg != nullptr)
+ {
+ HMI_ERROR(errmsg);
+ afb_req_fail(req, "failed", errmsg);
+ return;
+ }
+ afb_req_success(req, NULL, "success");
+ };
+
+ // TODO: Check whether role is tbtnavi to request remote invisible
+ if (g_afb_instance->wmgr.wmcon.getAppIdToEcuName(appid) == "" ||
+ ("tbtnavi" != std::string(a_drawing_name)))
+ {
+ g_afb_instance->wmgr.api_deactivate_window(
+ appid, a_drawing_name, reply);
+ }
+ else
+ {
+ // If Window Manager is slave and this request is for master,
+ // request deactivateWindow to master
+ g_afb_instance->wmgr.api_deactivate_surface_to_master(
+ appid, a_drawing_name, reply);
+ }
free(appid);
}
}
@@ -315,7 +398,7 @@ void windowmanager_deactivatewindow(afb_req_t req) noexcept
}
}
-void windowmanager_enddraw(afb_req_t req) noexcept
+void windowmanager_enddraw(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
if (g_afb_instance == nullptr)
@@ -337,8 +420,18 @@ void windowmanager_enddraw(afb_req_t req) noexcept
char* appid = afb_req_get_application_id(req);
if(appid)
{
- g_afb_instance->wmgr.api_enddraw(appid, a_drawing_name);
- free(appid);
+ if (g_afb_instance->wmgr.wmcon.getAppIdToEcuName(appid) == "" ||
+ !g_afb_instance->wmgr.wmcon.isSyncDrawingForRemote(appid))
+ {
+ g_afb_instance->wmgr.api_enddraw(appid, a_drawing_name);
+ }
+ else
+ {
+ // If Window Manager is slave and requesting app is syncDrawing,
+ // request endDraw to master
+ g_afb_instance->wmgr.api_enddraw_for_remote(appid, a_drawing_name);
+ }
+ free(appid);
}
}
catch (std::exception &e)
@@ -349,7 +442,7 @@ void windowmanager_enddraw(afb_req_t req) noexcept
}
}
-void windowmanager_getdisplayinfo_thunk(afb_req_t req) noexcept
+void windowmanager_getdisplayinfo_thunk(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
if (g_afb_instance == nullptr)
@@ -376,7 +469,7 @@ void windowmanager_getdisplayinfo_thunk(afb_req_t req) noexcept
}
}
-void windowmanager_getareainfo_thunk(afb_req_t req) noexcept
+void windowmanager_getareainfo_thunk(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
if (g_afb_instance == nullptr)
@@ -413,14 +506,132 @@ void windowmanager_getareainfo_thunk(afb_req_t req) noexcept
}
}
-void windowmanager_get_area_list(afb_req_t req) noexcept
+void windowmanager_getcarinfo_thunk(afb_req req) noexcept
+{
+ std::lock_guard<std::mutex> guard(binding_m);
+ if (g_afb_instance == nullptr)
+ {
+ afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?");
+ return;
+ }
+
+ try
+ {
+ json_object *jreq = afb_req_json(req);
+
+ json_object *j_label = nullptr;
+ if (! json_object_object_get_ex(jreq, "label", &j_label))
+ {
+ afb_req_fail(req, "failed", "Need char const* argument label");
+ return;
+ }
+ char const* a_label = json_object_get_string(j_label);
+
+ auto ret = g_afb_instance->wmgr.api_get_car_info(a_label);
+ if (ret.is_err())
+ {
+ afb_req_fail(req, "failed", ret.unwrap_err());
+ return;
+ }
+
+ afb_req_success(req, ret.unwrap(), "success");
+ }
+ catch (std::exception &e)
+ {
+ afb_req_fail_f(req, "failed", "Uncaught exception while calling getcarinfo: %s", e.what());
+ return;
+ }
+}
+
+void windowmanager_set_render_order(afb_req req) noexcept
+{
+ std::lock_guard<std::mutex> guard(binding_m);
+ if (g_afb_instance == nullptr)
+ {
+ afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?");
+ return;
+ }
+
+ char* appid = afb_req_get_application_id(req);
+ if(appid)
+ {
+ json_object *jreq = afb_req_json(req);
+ json_object *j_ro; // Do not free this. binder frees jreq, then free j_ro
+ if (json_object_object_get_ex(jreq, "render_order", &j_ro))
+ {
+ int size = json_object_array_length(j_ro);
+ std::vector<std::string> ro(size);
+ for(int i = 0; i < size; i++)
+ {
+ ro[i] = json_object_get_string(json_object_array_get_idx(j_ro, i));
+ }
+
+ auto ret = g_afb_instance->wmgr.api_client_set_render_order(appid, ro);
+ if (!ret)
+ {
+ afb_req_fail(req, "failed", nullptr);
+ }
+ else
+ {
+ afb_req_success(req, nullptr, nullptr);
+ }
+ }
+ free(appid);
+ }
+ else
+ {
+ afb_req_fail(req, "failed", nullptr);
+ }
+}
+
+void windowmanager_attach_app(afb_req req) noexcept
+{
+ std::lock_guard<std::mutex> guard(binding_m);
+ if (g_afb_instance == nullptr)
+ {
+ afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?");
+ return;
+ }
+
+ char* appid = afb_req_get_application_id(req);
+ if(appid)
+ {
+ json_object *jreq = afb_req_json(req);
+ json_object *j_dest, *j_id; // Do not free this. binder frees jreq, then free j_ro
+ if (json_object_object_get_ex(jreq, "destination", &j_dest) &&
+ json_object_object_get_ex(jreq, "service_surface", &j_id))
+ {
+ const char* dest_app = json_object_get_string(j_dest);
+ const char* service = json_object_get_string(j_id);
+
+ std::string uuid = g_afb_instance->wmgr.api_client_attach_service_surface(appid, dest_app, service);
+ if (uuid.empty())
+ {
+ afb_req_fail(req, "failed", nullptr);
+ }
+ else
+ {
+ json_object *resp = json_object_new_object();
+ json_object_object_add(resp, "uuid", json_object_new_string(uuid.c_str()));
+ afb_req_success(req, resp, nullptr);
+ }
+ }
+ free(appid);
+ }
+ else
+ {
+ afb_req_fail(req, "failed", nullptr);
+ }
+}
+
+void windowmanager_get_area_list(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
json_object* ret = g_afb_instance->wmgr.api_get_area_list();
afb_req_success(req, ret, nullptr);
}
-void windowmanager_change_area_size(afb_req_t req) noexcept
+void windowmanager_change_area_size(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
if (g_afb_instance == nullptr)
@@ -480,7 +691,7 @@ void windowmanager_change_area_size(afb_req_t req) noexcept
}
}
-void windowmanager_wm_subscribe(afb_req_t req) noexcept
+void windowmanager_wm_subscribe(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
if (g_afb_instance == nullptr)
@@ -498,15 +709,20 @@ void windowmanager_wm_subscribe(afb_req_t req) noexcept
afb_req_fail(req, "failed", "Need char const* argument event");
return;
}
- wm::WindowManager::EventType event_id = (wm::WindowManager::EventType)json_object_get_int(j);
- bool ret = g_afb_instance->wmgr.api_subscribe(req, event_id);
+ int event_id = json_object_get_int(j);
+ int ret = g_afb_instance->wmgr.api_subscribe(req, event_id);
- if (!ret)
+ if (ret)
{
afb_req_fail(req, "failed", "Error: afb_req_subscribe()");
return;
}
afb_req_success(req, NULL, "success");
+
+ if (event_id == g_afb_instance->wmgr.Event_Handshake)
+ {
+ g_afb_instance->wmgr.api_handshake();
+ }
}
catch (std::exception &e)
{
@@ -515,7 +731,24 @@ void windowmanager_wm_subscribe(afb_req_t req) noexcept
}
}
-void windowmanager_ping(afb_req_t req) noexcept
+void windowmanager_connect(afb_req req) noexcept
+{
+ std::lock_guard<std::mutex> guard(binding_m);
+
+ HMI_DEBUG("WM - HS Connect");
+
+ if (g_afb_instance == nullptr)
+ {
+ afb_req_fail(req, "Failed", "Not Start WindowManager");
+ return;
+ }
+ else
+ {
+ afb_req_success(req, NULL, "success");
+ }
+}
+
+void windowmanager_ping(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
@@ -530,7 +763,7 @@ void windowmanager_ping(afb_req_t req) noexcept
}
}
-void windowmanager_debug_terminate(afb_req_t req) noexcept
+void windowmanager_debug_terminate(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
if (g_afb_instance == nullptr)
@@ -557,32 +790,30 @@ void windowmanager_debug_terminate(afb_req_t req) noexcept
}
}
-const afb_verb_t windowmanager_verbs[] = {
- { .verb = "requestSurface", .callback = windowmanager_requestsurface },
- { .verb = "requestSurfaceXDG", .callback = windowmanager_requestsurfacexdg },
- { .verb = "activateWindow", .callback = windowmanager_activatewindow },
- { .verb = "deactivateWindow", .callback = windowmanager_deactivatewindow },
- { .verb = "endDraw", .callback = windowmanager_enddraw },
- { .verb = "getDisplayInfo", .callback = windowmanager_getdisplayinfo_thunk },
- { .verb = "getAreaInfo", .callback = windowmanager_getareainfo_thunk },
- { .verb = "changeAreaSize", .callback = windowmanager_change_area_size },
- { .verb = "getAreaList", .callback = windowmanager_get_area_list },
- { .verb = "wm_subscribe", .callback = windowmanager_wm_subscribe },
- { .verb = "ping", .callback = windowmanager_ping },
- { .verb = "debug_terminate", .callback = windowmanager_debug_terminate },
- {} };
-
-extern "C" const afb_binding_t afbBindingExport = {
- .api = "windowmanager",
- .specification = "windowmanager",
- .info = "windowmanager",
- .verbs = windowmanager_verbs,
- .preinit = nullptr,
- .init = binding_init,
- .onevent = nullptr,
- .userdata = nullptr,
- .provide_class = nullptr,
- .require_class = nullptr,
- .require_api = nullptr,
- .noconcurrency = 0
-};
+void on_event(const char *event, struct json_object *object)
+{
+ g_afb_instance->wmgr.analyzeReceivedEvent(event, object);
+}
+
+const struct afb_verb_v2 windowmanager_verbs[] = {
+ {"requestSurface", windowmanager_requestsurface, nullptr, nullptr, AFB_SESSION_NONE},
+ {"requestSurfaceXdg", windowmanager_requestsurfacexdg, nullptr, nullptr, AFB_SESSION_NONE},
+ {"setRole", windowmanager_setrole, nullptr, nullptr, AFB_SESSION_NONE},
+ {"activateWindow", windowmanager_activatewindow, nullptr, nullptr, AFB_SESSION_NONE},
+ {"deactivateWindow", windowmanager_deactivatewindow, nullptr, nullptr, AFB_SESSION_NONE},
+ {"endDraw", windowmanager_enddraw, nullptr, nullptr, AFB_SESSION_NONE},
+ {"getDisplayInfo", windowmanager_getdisplayinfo_thunk, nullptr, nullptr, AFB_SESSION_NONE},
+ {"getAreaInfo", windowmanager_getareainfo_thunk, nullptr, nullptr, AFB_SESSION_NONE},
+ {"getCarInfo", windowmanager_getcarinfo_thunk, nullptr, nullptr, AFB_SESSION_NONE },
+ {"setRenderOrder", windowmanager_set_render_order, nullptr, nullptr, AFB_SESSION_NONE},
+ {"changeAreaSize", windowmanager_change_area_size, nullptr, nullptr, AFB_SESSION_NONE},
+ {"getAreaList", windowmanager_get_area_list, nullptr, nullptr, AFB_SESSION_NONE},
+ {"attachApp", windowmanager_attach_app, nullptr, nullptr, AFB_SESSION_NONE},
+ {"wm_subscribe", windowmanager_wm_subscribe, nullptr, nullptr, AFB_SESSION_NONE},
+ {"wm_connect", windowmanager_connect, nullptr, nullptr, AFB_SESSION_NONE},
+ {"ping", windowmanager_ping, nullptr, nullptr, AFB_SESSION_NONE},
+ {"debug_terminate", windowmanager_debug_terminate, nullptr, nullptr, AFB_SESSION_NONE},
+ {}};
+
+extern "C" const struct afb_binding_v2 afbBindingV2 = {
+ "windowmanager", nullptr, nullptr, windowmanager_verbs, nullptr, binding_init, on_event, 0};