On the way to adding attach service surface
[apps/agl-service-windowmanager.git] / src / main.cpp
index 6238ddc..5141def 100644 (file)
@@ -18,6 +18,8 @@
 #include <algorithm>
 #include <mutex>
 #include <json.h>
+#include <stdlib.h>
+#include <vector>
 #include "window_manager.hpp"
 #include "json_helper.hpp"
 
@@ -143,18 +145,26 @@ void windowmanager_requestsurface(afb_req req) noexcept
             return;
         }
 
-        const char *appid = afb_req_get_application_id(req);
-        auto ret = g_afb_instance->wmgr.api_request_surface(
-            appid, a_drawing_name);
-        if (ret.is_err())
+        char *appid = afb_req_get_application_id(req);
+        if(appid)
         {
-            afb_req_fail(req, "failed", ret.unwrap_err());
-            return;
+            auto ret = g_afb_instance->wmgr.api_request_surface(
+                appid, a_drawing_name);
+            if (ret.is_err())
+            {
+                afb_req_fail(req, "failed", ret.unwrap_err());
+            }
+            else
+            {
+                createSecurityContext(req, appid, a_drawing_name);
+                afb_req_success(req, json_object_new_int(ret.unwrap()), "success");
+            }
+            free(appid);
+        }
+        else
+        {
+            afb_req_fail(req, "failed", nullptr);
         }
-
-        createSecurityContext(req, appid, a_drawing_name);
-
-        afb_req_success(req, json_object_new_int(ret.unwrap()), "success");
     }
     catch (std::exception &e)
     {
@@ -192,19 +202,23 @@ void windowmanager_requestsurfacexdg(afb_req req) noexcept
             return;
         }
         char const *a_ivi_id = json_object_get_string(j_ivi_id);
-        char const *appid = afb_req_get_application_id(req);
-        auto ret = g_afb_instance->wmgr.api_request_surface(
-            appid, a_drawing_name, a_ivi_id);
-
-        if (ret != nullptr)
+        char *appid = afb_req_get_application_id(req);
+        if(appid)
         {
-            afb_req_fail(req, "failed", ret);
-            return;
+            auto ret = g_afb_instance->wmgr.api_request_surface(
+                appid, a_drawing_name, a_ivi_id);
+
+            if (ret != nullptr)
+            {
+                afb_req_fail(req, "failed", ret);
+            }
+            else
+            {
+                createSecurityContext(req, appid, a_drawing_name);
+                afb_req_success(req, NULL, "success");
+            }
+            free(appid);
         }
-
-        createSecurityContext(req, appid, a_drawing_name);
-
-        afb_req_success(req, NULL, "success");
     }
     catch (std::exception &e)
     {
@@ -223,8 +237,6 @@ void windowmanager_setrole(afb_req req) noexcept
     }
     try
     {
-        unsigned pid = 0;
-        char const *appid = afb_req_get_application_id(req);
         json_object *jreq = afb_req_json(req);
 
         json_object *j_role = nullptr;
@@ -234,25 +246,22 @@ void windowmanager_setrole(afb_req req) noexcept
             return;
         }
         char const *a_role = json_object_get_string(j_role);
+        char *appid = afb_req_get_application_id(req);
 
-        json_object *j_pid = nullptr;
-        if (json_object_object_get_ex(jreq, "pid", &j_pid))
+        if(appid)
         {
-            HMI_DEBUG("PID is set");
-            char const *a_pid = json_object_get_string(j_pid);
-            pid = std::stol(a_pid);
-        }
-
-        auto ret = g_afb_instance->wmgr.api_set_role(appid, a_role, pid);
-        if (!ret)
-        {
-            afb_req_fail(req, "failed", "Couldn't register");
-            return;
+            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);
         }
-
-        createSecurityContext(req, appid, a_role);
-
-        afb_req_success(req, NULL, "success");
     }
     catch (std::exception &e)
     {
@@ -287,18 +296,22 @@ void windowmanager_activatewindow(afb_req req) noexcept
             return;
         }
 
-        g_afb_instance->wmgr.api_activate_surface(
-            afb_req_get_application_id(req),
-            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");
-            });
+        char* appid = afb_req_get_application_id(req);
+        if(appid)
+        {
+            g_afb_instance->wmgr.api_activate_surface(
+                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");
+                });
+            free(appid);
+        }
     }
     catch (std::exception &e)
     {
@@ -327,17 +340,22 @@ void windowmanager_deactivatewindow(afb_req req) noexcept
             return;
         }
 
-        g_afb_instance->wmgr.api_deactivate_surface(
-            afb_req_get_application_id(req), 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");
-            });
+        char* appid = afb_req_get_application_id(req);
+        if(appid)
+        {
+            g_afb_instance->wmgr.api_deactivate_surface(
+                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");
+                });
+            free(appid);
+        }
     }
     catch (std::exception &e)
     {
@@ -367,8 +385,12 @@ void windowmanager_enddraw(afb_req req) noexcept
         }
         afb_req_success(req, NULL, "success");
 
-        g_afb_instance->wmgr.api_enddraw(
-            afb_req_get_application_id(req), a_drawing_name);
+        char* appid = afb_req_get_application_id(req);
+        if(appid)
+        {
+            g_afb_instance->wmgr.api_enddraw(appid, a_drawing_name);
+            free(appid);
+        }
     }
     catch (std::exception &e)
     {
@@ -444,6 +466,87 @@ void windowmanager_getareainfo_thunk(afb_req req) noexcept
     }
 }
 
+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_wm_subscribe(afb_req req) noexcept
 {
     std::lock_guard<std::mutex> guard(binding_m);
@@ -634,14 +737,16 @@ void windowmanager_debug_terminate(afb_req req) noexcept
 }
 
 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},
+    {"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},
+    {"setRenderOrder", windowmanager_set_render_order, nullptr, nullptr, AFB_SESSION_NONE},
+    {"attachApp", windowmanager_attach_app, nullptr, nullptr, AFB_SESSION_NONE},
     {"wm_subscribe", windowmanager_wm_subscribe, nullptr, nullptr, AFB_SESSION_NONE},
     {"list_drawing_names", windowmanager_list_drawing_names, nullptr, nullptr, AFB_SESSION_NONE},
     {"ping", windowmanager_ping, nullptr, nullptr, AFB_SESSION_NONE},