Add chage remote app
[apps/agl-service-windowmanager.git] / src / wm_client.cpp
index 4bccb8c..3acf09e 100644 (file)
 
 #include <json-c/json.h>
 #include "wm_client.hpp"
+#include "util.hpp"
 #include <ilm/ilm_control.h>
+#include <uuid/uuid.h>
+
 
 #define INVALID_SURFACE_ID 0
 
@@ -26,34 +29,19 @@ using std::vector;
 namespace wm
 {
 
-static const char kActive[] = "active";
-static const char kInactive[] = "inactive";
-static const char kVisible[] = "visible";
-static const char kInvisible[] = "invisible";
-static const char kSyncDraw[] = "syncDraw";
-static const char kFlushDraw[] = "flushDraw";
+static const vector<string> kWMEvents = {
+    // Private event for applications
+    "syncDraw", "flushDraw", "visible", "invisible", "active", "inactive", "error"};
+static const vector<string> kErrorDescription = {
+    "unknown-error"};
+
 static const char kKeyDrawingName[] = "drawing_name";
-static const char kKeyDrawingArea[] = "drawing_area";
-static const char kKeyRole[] = "role";
-static const char kKeyArea[] = "area";
 static const char kKeyrole[] = "role";
 static const char kKeyError[] = "error";
-static const char kKeyErrorDesc[] = "errorDescription";
-static const char kKeyX[] = "x";
-static const char kKeyY[] = "y";
-static const char kKeyWidth[] = "width";
-static const char kKeyHeight[] = "height";
-static const char kKeyDrawingRect[] = "drawing-rect";
-
-static const vector<string> kWMEvents = {
-    // Private event for applications
-    kActive, kInactive,
-    kVisible, kInvisible,
-    kSyncDraw, kFlushDraw,
-    kKeyError};
+static const char kKeyErrorDesc[] = "kErrorDescription";
 
 WMClient::WMClient(const string &appid, unsigned layer, unsigned surface, const string &role)
-    : id(appid), layer(layer), is_source_set(false),
+    : id(appid), layer(layer),
       role2surface(0)
 {
     role2surface[role] = surface;
@@ -62,7 +50,7 @@ WMClient::WMClient(const string &appid, unsigned layer, unsigned surface, const
 #if GTEST_ENABLED
         string ev = x;
 #else
-        afb_event_t ev = afb_api_make_event(afbBindingV3root, x.c_str());
+        afb_event ev = afb_daemon_make_event(x.c_str());
 #endif
         evname2afb_event[x] = ev;
     }
@@ -71,9 +59,6 @@ WMClient::WMClient(const string &appid, unsigned layer, unsigned surface, const
 WMClient::WMClient(const string &appid, const string &role)
     : id(appid),
       layer(0),
-      is_source_set(false),
-      is_active(false),
-      main_role(role),
       role2surface(0),
       evname2afb_event(0)
 {
@@ -83,7 +68,7 @@ WMClient::WMClient(const string &appid, const string &role)
 #if GTEST_ENABLED
         string ev = x;
 #else
-        afb_event_t ev = afb_api_make_event(afbBindingV3root, x.c_str());
+        afb_event ev = afb_daemon_make_event(x.c_str());
 #endif
         evname2afb_event[x] = ev;
     }
@@ -92,8 +77,6 @@ WMClient::WMClient(const string &appid, const string &role)
 WMClient::WMClient(const string &appid, unsigned layer, const string &role)
     : id(appid),
       layer(layer),
-      is_source_set(false),
-      is_active(false),
       main_role(role),
       role2surface(0),
       evname2afb_event(0)
@@ -104,7 +87,7 @@ WMClient::WMClient(const string &appid, unsigned layer, const string &role)
 #if GTEST_ENABLED
         string ev = x;
 #else
-        afb_event_t ev = afb_api_make_event(afbBindingV3root, x.c_str());
+        afb_event ev = afb_daemon_make_event(x.c_str());
 #endif
         evname2afb_event[x] = ev;
     }
@@ -120,45 +103,16 @@ string WMClient::role() const
     return this->main_role;
 }
 
-void WMClient::setRole(const string& role)
-{
-    this->main_role = role;
-}
-
 unsigned WMClient::layerID() const
 {
     return this->layer;
 }
 
-void WMClient::setLayerID(unsigned id)
-{
-    this->layer = id;
-}
-
 unsigned WMClient::surfaceID() const
 {
     return this->surface;
 }
 
-void WMClient::registerSurface(unsigned surface)
-{
-    this->surface = surface;
-}
-
-void WMClient::activate()
-{
-    if(!this->isActive())
-        this->emitActive(true); // emit when state is changed
-    this->is_active = true;
-}
-
-void WMClient::deactivate()
-{
-    if(this->isActive())
-        this->emitActive(false); // emit when state is changed
-    this->is_active = false;
-}
-
 /**
  * Add surface to the client
  *
@@ -179,16 +133,6 @@ WMError WMClient::addSurface(unsigned surface)
     return (err == ILM_SUCCESS) ? WMError::SUCCESS : WMError::FAIL;
 }
 
-void WMClient::setSurfaceSizeCorrectly()
-{
-    this->is_source_set = true;
-}
-
-bool WMClient::isSourceSizeSet()
-{
-    return this->is_source_set;
-}
-
 bool WMClient::removeSurfaceIfExist(unsigned surface)
 {
     bool ret = false;
@@ -197,152 +141,131 @@ bool WMClient::removeSurfaceIfExist(unsigned surface)
         this->surface = INVALID_SURFACE_ID;
         ret = true;
     }
-    return ret;
-}
-
-bool WMClient::subscribe(afb_req_t req, const string &evname)
-{
-    int ret = afb_req_subscribe(req, this->evname2afb_event[evname]);
-    if (ret)
+    else
     {
-        HMI_DEBUG("Failed to subscribe %s", evname.c_str());
-        return false;
+        for(auto &x : this->service2surfaces)
+        {
+            if(x.second == surface)
+            {
+                ret = true;
+                string key = x.first;
+                this->service2surfaces.erase(key);
+                this->service2supplier.erase(key);
+            }
+        }
     }
-    return true;
+    return ret;
 }
 
-void WMClient::emitVisible(bool visible)
+WMError WMClient::setRenderOrder(const vector<string> &order)
 {
-    // error check
-    bool allow_send = false;
-    if(visible)
+    WMError ret = WMError::SUCCESS;
+    this->surface_render_order.clear();
+    for(const auto& x : order)
     {
-        allow_send = afb_event_is_valid(this->evname2afb_event[kVisible]);
-    }
-    else
-    {
-        allow_send = afb_event_is_valid(this->evname2afb_event[kInvisible]);
-    }
-    if(allow_send)
-    {
-        json_object* j = json_object_new_object();
-        json_object_object_add(j, kKeyRole, json_object_new_string(this->role().c_str()));
-        json_object_object_add(j, kKeyDrawingName, json_object_new_string(this->role().c_str()));
-
-        if(visible)
+        unsigned s; // surface
+        if(x == this->role())
         {
-            afb_event_push(this->evname2afb_event[kVisible], j);
+            s = this->surfaceID();
+        }
+        else if(this->service2surfaces.count(x) != 0)
+        {
+            s = this->service2surfaces[x];
         }
         else
         {
-            afb_event_push(this->evname2afb_event[kInvisible], j);
+            ret = WMError::NOT_REGISTERED;
+            break;
         }
+        this->surface_render_order.push_back(s);
     }
-    else
-    {
-        HMI_ERROR("Failed to send %s", __func__);
-    }
-}
-
-void WMClient::emitActive(bool active)
-{
-    // error check
-    bool allow_send = false;
-    if(active)
-    {
-        allow_send = afb_event_is_valid(this->evname2afb_event[kActive]);
-    }
-    else
+    if(ret == WMError::SUCCESS)
     {
-        allow_send = afb_event_is_valid(this->evname2afb_event[kInactive]);
-    }
-    if(allow_send)
-    {
-        json_object* j = json_object_new_object();
-        json_object_object_add(j, kKeyRole, json_object_new_string(this->role().c_str()));
-        json_object_object_add(j, kKeyDrawingName, json_object_new_string(this->role().c_str()));
-
-        if(active)
+        int count = 0;
+        t_ilm_layer* id_array = new t_ilm_surface[this->surface_render_order.size()];
+        if(id_array == nullptr)
         {
-            afb_event_push(this->evname2afb_event[kActive], j);
+            HMI_WARNING("short memory");
+            ret = WMError::FAIL;
         }
         else
         {
-            afb_event_push(this->evname2afb_event[kInactive], j);
+            for(const auto& i : this->surface_render_order)
+            {
+                id_array[count] = i;
+                ++count;
+            }
+            ilm_layerSetRenderOrder(this->layerID(),
+                id_array, this->surface_render_order.size());
+            delete id_array;
         }
     }
-    else
-    {
-        HMI_ERROR("Failed to send %s", __func__);
-    }
+    return ret;
 }
 
-void WMClient::emitSyncDraw(const string& area, struct rect& r)
+string WMClient::attachTmpServiceSurface(const string& supplier, const string& service_surface)
 {
-    HMI_NOTICE("trace");
-    if(afb_event_is_valid(this->evname2afb_event[kSyncDraw]))
-    {
-        json_object *j_rect = json_object_new_object();
-        json_object_object_add(j_rect, kKeyX, json_object_new_int(r.x));
-        json_object_object_add(j_rect, kKeyY, json_object_new_int(r.y));
-        json_object_object_add(j_rect, kKeyWidth, json_object_new_int(r.w));
-        json_object_object_add(j_rect, kKeyHeight, json_object_new_int(r.h));
-
-        json_object* j = json_object_new_object();
-        json_object_object_add(j, kKeyRole, json_object_new_string(this->role().c_str()));
-        json_object_object_add(j, kKeyDrawingName, json_object_new_string(this->role().c_str()));
-        json_object_object_add(j, kKeyDrawingArea, json_object_new_string(area.c_str()));
-        json_object_object_add(j, kKeyArea, json_object_new_string(this->role().c_str()));
+    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;
+}
 
-        json_object_object_add(j, kKeyDrawingRect, j_rect);
-        afb_event_push(this->evname2afb_event[kSyncDraw], j);
-    }
-    else
+WMError WMClient::attachServiceSurface(const string& service_surface, unsigned surface)
+{
+    WMError ret = WMError::NOT_REGISTERED;
+    if(this->service2supplier.count(service_surface) != 0)
     {
-        HMI_ERROR("Failed to send %s", __func__);
+        this->service2surfaces.emplace(service_surface, surface);
+        ret = WMError::SUCCESS;
     }
+    return ret;
 }
 
-void WMClient::emitFlushDraw()
+#if GTEST_ENABLED
+bool WMClient::subscribe(afb_req req, const string &evname)
 {
-    if(afb_event_is_valid(this->evname2afb_event[kFlushDraw]))
-    {
-        json_object* j = json_object_new_object();
-        json_object_object_add(j, kKeyRole, json_object_new_string(this->role().c_str()));
-        json_object_object_add(j, kKeyDrawingName, json_object_new_string(this->role().c_str()));
-        afb_event_push(this->evname2afb_event[kFlushDraw], nullptr);
+    if(evname != kKeyError){
+        HMI_DEBUG("error is only enabeled for now");
+        return false;
     }
-    else
+    int ret = afb_req_subscribe(req, this->evname2afb_event[evname]);
+    if (ret)
     {
-        HMI_ERROR("Failed to send %s", __func__);
+        HMI_DEBUG("Failed to subscribe %s", evname.c_str());
+        return false;
     }
+    return true;
 }
 
-void WMClient::emitError(WMError error)
+void WMClient::emitError(WM_CLIENT_ERROR_EVENT ev)
 {
     if (!afb_event_is_valid(this->evname2afb_event[kKeyError])){
         HMI_ERROR("event err is not valid");
         return;
     }
     json_object *j = json_object_new_object();
-    json_object_object_add(j, kKeyError, json_object_new_int(error));
-    json_object_object_add(j, kKeyErrorDesc, json_object_new_string(errorDescription(error)));
-    HMI_DEBUG("error: %d, description:%s", error, errorDescription(error));
+    json_object_object_add(j, kKeyError, json_object_new_int(ev));
+    json_object_object_add(j, kKeyErrorDesc, json_object_new_string(kErrorDescription[ev].c_str()));
+    HMI_DEBUG("error: %d, description:%s", ev, kErrorDescription[ev].c_str());
+
     int ret = afb_event_push(this->evname2afb_event[kKeyError], j);
     if (ret != 0)
     {
         HMI_DEBUG("afb_event_push failed: %m");
     }
 }
+#endif
 
 void WMClient::dumpInfo()
 {
     DUMP("APPID : %s", id.c_str());
     DUMP("  LAYER : %d", layer);
-    for (const auto &x : this->role2surface)
-    {
-        DUMP("  ROLE  : %s , SURFACE : %d", x.first.c_str(), x.second);
-    }
+    DUMP("  ROLE  : %s , SURFACE : %d", main_role.c_str(), surface);
 }
 
 } // namespace wm
\ No newline at end of file