Implement attachApp
authorKazumasa Mitsunari <knimitz@witz-inc.co.jp>
Tue, 25 Sep 2018 03:19:14 +0000 (12:19 +0900)
committerKazumasa Mitsunari <knimitz@witz-inc.co.jp>
Tue, 25 Sep 2018 03:19:14 +0000 (12:19 +0900)
Change-Id: I4082fd400fd2f82fcb6cbbcc66d584fb0a572827
Signed-off-by: Kazumasa Mitsunari <knimitz@witz-inc.co.jp>
src/window_manager.cpp
src/window_manager.hpp
src/wm_client.cpp
src/wm_client.hpp

index 0eeebcd..f0258f7 100644 (file)
@@ -514,21 +514,21 @@ bool WindowManager::api_client_set_render_order(char const* appid, const vector<
     return ret;
 }
 
-string api_client_attach_service_surface(const char* appid, const char* dest, const char* service_surface)
+string WindowManager::api_client_attach_service_surface
+    (const char* appid, const char* dest, const char* service_surface)
 {
-    string uuid = "", s_dest;
-    s_dest = dest;
-    // uuid = generate_uuid_randam());
+    string uuid, s_dest = dest;
     auto client = g_app_list.lookUpClient(s_dest);
     if(!client)
     {
         HMI_ERROR("Failed to look up destination [%s]", dest);
         return uuid;
     }
-    //string uuid = client->attachServiceSurface(appid);
+    uuid = client->attachTmpServiceSurface(appid, service_surface);
+    this->tmp_services.emplace_back(TmpService{appid, dest, service_surface, uuid});
+    return uuid;
 }
 
-
 result<json_object *> WindowManager::api_get_display_info()
 {
     Screen screen = this->lc->getScreenInfo();
@@ -613,6 +613,7 @@ void WindowManager::send_event(char const *evname, char const *label, char const
  */
 void WindowManager::surface_created(unsigned pid, unsigned surface_id)
 {
+    // requestSurface
     if(this->tmp_surface2app.count(surface_id) != 0)
     {
         string appid = this->tmp_surface2app[surface_id].appid;
@@ -684,19 +685,39 @@ void WindowManager::surface_created(unsigned pid, unsigned surface_id)
             }
         }
         json_object_put(response);
-        auto client = g_app_list.lookUpClient(appid);
-        if(client != nullptr)
+
+        auto elem = std::find_if(this->tmp_services.begin(), this->tmp_services.end(),
+                [&appid](TmpService& ts){
+                    return (ts.dest == appid );
+                    });
+        if(elem == this->tmp_services.end())
         {
-            client->addSurface(surface_id);
-            this->id_alloc.register_name_id(client->role(), surface_id);
+            // attachApp
+            auto client = g_app_list.lookUpClient(elem->dest);
+            if(client == nullptr)
+            {
+                return;
+            }
+            HMI_INFO("Attach surface %d (service %s) to app %s", surface_id, elem->service.c_str(), elem->dest.c_str());
+            client->attachServiceSurface(elem->service, surface_id);
         }
         else
         {
-            /*
-             * Store tmp surface and appid for application
-             * who requests setRole after creating shell surface
-             */
-            this->tmp_surface2app.emplace(surface_id, TmpClient{appid, ppid});
+            // setRole
+            auto client = g_app_list.lookUpClient(appid);
+            if(client != nullptr)
+            {
+                client->addSurface(surface_id);
+                this->id_alloc.register_name_id(client->role(), surface_id);
+            }
+            else
+            {
+                /*
+                * Store tmp surface and appid for application
+                * who requests setRole after creating shell surface
+                */
+                this->tmp_surface2app.emplace(surface_id, TmpClient{appid, ppid});
+            }
         }
     }
 }
index 7bd0802..481d16c 100644 (file)
@@ -135,6 +135,17 @@ struct TmpClient
     unsigned pid;
 };
 
+struct TmpService
+{
+    std::string appid;  // Used to search who create service surface
+    std::string dest;   // Used to attach service to destination application
+    std::string service;// The name of service surface
+    std::string uuid;   // uuid
+    TmpService(const std::string& app, const std::string& dst,
+               const std::string& svc, const std::string& uuid)
+    : appid(app), dest(dst), service(svc), uuid(uuid) {}
+};
+
 class WindowManager
 {
   public:
@@ -249,7 +260,7 @@ class WindowManager
     rect_map area_info;
     // FOR CES DEMO
     std::unordered_map<unsigned, struct TmpClient> tmp_surface2app;
-    std::vector<struct TmpClient> tmp_apps;
+    std::vector<struct TmpService> tmp_services;
     static const char* kDefaultOldRoleDb;
 };
 
index 84f9842..356cd6f 100644 (file)
@@ -18,6 +18,8 @@
 #include "wm_client.hpp"
 #include "util.hpp"
 #include <ilm/ilm_control.h>
+#include <uuid/uuid.h>
+
 
 #define INVALID_SURFACE_ID 0
 
@@ -188,6 +190,29 @@ WMError WMClient::setRenderOrder(const vector<string> &order)
     return ret;
 }
 
+string WMClient::attachTmpServiceSurface(const string& supplier, const string& service_surface)
+{
+    string uuid;
+    uuid_t u;
+    char out[37]; // uuid is 36 characters
+    uuid_generate_random(u);
+    uuid_unparse(u, out);
+    uuid = out;
+    this->service2supplier.emplace(service_surface, supplier);
+    return uuid;
+}
+
+WMError WMClient::attachServiceSurface(const string& service_surface, unsigned surface)
+{
+    WMError ret = WMError::NOT_REGISTERED;
+    if(this->service2supplier.count(service_surface) != 0)
+    {
+        this->service2surfaces.emplace(service_surface, surface);
+        ret = WMError::SUCCESS;
+    }
+    return ret;
+}
+
 #if GTEST_ENABLED
 bool WMClient::subscribe(afb_req req, const string &evname)
 {
index 65c68b9..fc171f4 100644 (file)
@@ -59,6 +59,8 @@ class WMClient
     // bool removeRole(const std::string& role);
     std::vector<unsigned> renderOrder() const;
     WMError setRenderOrder(const std::vector<std::string>& order);
+    std::string attachTmpServiceSurface(const std::string& from, const std::string& service_surface);
+    WMError attachServiceSurface(const std::string& service_surface, unsigned surface);
 
 #if GTEST_ENABLED
     bool subscribe(afb_req req, const std::string &event_name);
@@ -77,6 +79,7 @@ class WMClient
     std::vector<unsigned> surface_render_order;
     std::unordered_map<std::string, unsigned> service2surfaces;
     std::unordered_map<std::string, unsigned> role2surface;
+    std::unordered_map<std::string, std::string> service2supplier;
 #if GTEST_ENABLED
     // This is for unit test. afb_make_event occurs sig11 if call not in afb-binding
     std::unordered_map<std::string, std::string> evname2afb_event;