Add restriction and software keyboard layers
[apps/agl-service-windowmanager.git] / src / main.cpp
index fd96d33..067a006 100644 (file)
@@ -24,6 +24,7 @@
 #include "json_helper.hpp"
 #include "util.hpp"
 #include "wayland_ivi_wm.hpp"
+#include "low_can_client.hpp"
 
 extern "C" {
 #include <afb/afb-binding.h>
@@ -39,9 +40,10 @@ typedef struct wmClientCtxt{
 
 struct afb_instance {
    std::unique_ptr<wl::display> display;
+   wm::LowCanClient lcc_;
    wm::App app;
 
-   afb_instance() : display{new wl::display}, app{this->display.get()} {}
+   afb_instance() : display{new wl::display}, lcc_{}, app{this->display.get()} {}
 
    int init();
 };
@@ -50,6 +52,10 @@ struct afb_instance *g_afb_instance;
 std::mutex binding_m;
 
 int afb_instance::init() {
+   // Initialize LowCanClient class
+   this->lcc_.initialize();
+
+   // Initialize App class
    return this->app.init();
 }
 
@@ -298,15 +304,24 @@ void windowmanager_activatesurface(afb_req req) noexcept {
        return;
    }
 
-   auto ret = g_afb_instance->app.api_activate_surface(a_drawing_name, a_drawing_area);
-   if (ret != nullptr) {
-      afb_req_fail(req, "failed", ret);
-      return;
+   const char* a_role = afb_req_value(req, "role");
+   if(!a_role){
+       a_role = "";
    }
 
-   afb_req_success(req, NULL, "success");
+   g_afb_instance->app.allocateWindowResource("activate", a_drawing_name,
+                                              a_drawing_area, a_role,
+                                              [&req](const char* errmsg){
+      if (errmsg != nullptr) {
+         HMI_ERROR("wm", errmsg);
+         afb_req_fail(req, "failed", errmsg);
+         return;
+      }
+      afb_req_success(req, NULL, "success");
+   });
+
    } catch (std::exception &e) {
-      afb_req_fail_f(req, "failed", "Uncaught exception while calling activatesurface: %s", e.what());
+      HMI_WARNING("wm", "failed", "Uncaught exception while calling activatesurface: %s", e.what());
       return;
    }
 
@@ -329,15 +344,24 @@ void windowmanager_deactivatesurface(afb_req req) noexcept {
        return;
    }
 
-   auto ret = g_afb_instance->app.api_deactivate_surface(a_drawing_name);
-   if (ret != nullptr) {
-      afb_req_fail(req, "failed", ret);
-      return;
+   const char* a_role = afb_req_value(req, "role");
+   if(!a_role){
+       a_role = "";
    }
 
-   afb_req_success(req, NULL, "success");
+   g_afb_instance->app.allocateWindowResource("deactivate", a_drawing_name,
+                                              nullptr, a_role,
+                                              [&req](const char* errmsg){
+      if (errmsg != nullptr) {
+         HMI_ERROR("wm", errmsg);
+         afb_req_fail(req, "failed", errmsg);
+         return;
+      }
+      afb_req_success(req, NULL, "success");
+   });
+
    } catch (std::exception &e) {
-      afb_req_fail_f(req, "failed", "Uncaught exception while calling deactivatesurface: %s", e.what());
+      HMI_WARNING("wm", "Uncaught exception while calling deactivatesurface: %s", e.what());
       return;
    }
 }
@@ -358,16 +382,12 @@ void windowmanager_enddraw(afb_req req) noexcept {
        afb_req_fail(req, "failed", "Need char const* argument drawing_name");
        return;
    }
+   afb_req_success(req, NULL, "success");
 
-   auto ret = g_afb_instance->app.api_enddraw(a_drawing_name);
-   if (ret != nullptr) {
-      afb_req_fail(req, "failed", ret);
-      return;
-   }
+   g_afb_instance->app.api_enddraw(a_drawing_name);
 
-   afb_req_success(req, NULL, "success");
    } catch (std::exception &e) {
-      afb_req_fail_f(req, "failed", "Uncaught exception while calling enddraw: %s", e.what());
+      HMI_WARNING("wm", "failed", "Uncaught exception while calling enddraw: %s", e.what());
       return;
    }
 
@@ -450,6 +470,12 @@ void windowmanager_wm_subscribe(afb_req req) noexcept {
       return;
    }
    int event_type = json_object_get_int(j);
+   if ((wm::App::Event_Val_Min > event_type)
+       || (wm::App::Event_Val_Max < event_type)) {
+      afb_req_fail(req, "failed", "Invalid EventType");
+      return;
+   }
+
    const char *event_name = g_afb_instance->app.kListEventName[event_type];
    struct afb_event event = g_afb_instance->app.map_afb_event[event_name];
    int ret = afb_req_subscribe(req, event);
@@ -633,5 +659,48 @@ const struct afb_verb_v2 windowmanager_verbs[] = {
    {}
 };
 
+void on_event(const char *event, struct json_object *object){
+    HMI_DEBUG("wm", "event:%s", event);
+
+    // If receive low can signal
+    if (strstr(event, "low-can")) {
+        // Analyze low can signal
+        g_afb_instance->lcc_.analyzeCanSignal(object);
+
+        if (g_afb_instance->lcc_.isChangedCarState()) {
+            // If car state is changed
+            HMI_DEBUG("wm", "Car state is changed");
+
+            // Get car state
+            const char* car_state = g_afb_instance->lcc_.getCurrentCarState();
+
+            // Allocate window resource
+            g_afb_instance->app.allocateWindowResource(car_state, nullptr,
+                                                       nullptr, nullptr,
+                                                       [](const char* errmsg){
+                if (errmsg != nullptr) {
+                    HMI_ERROR("wm", errmsg);
+                }
+            });
+        }
+        else if (g_afb_instance->lcc_.isChangedLampState()) {
+            // If lamp state is changed
+            HMI_DEBUG("wm", "Lamp state is changed");
+
+            // Get lamp state
+            const char* lamp_state = g_afb_instance->lcc_.getCurrentLampState();
+
+            // Allocate window resource
+            g_afb_instance->app.allocateWindowResource(lamp_state, nullptr,
+                                                       nullptr, nullptr,
+                                                       [](const char* errmsg){
+                if (errmsg != nullptr) {
+                    HMI_ERROR("wm", errmsg);
+                }
+            });
+        }
+    }
+}
+
 extern "C" const struct afb_binding_v2 afbBindingV2 = {
-   "windowmanager", nullptr, nullptr, windowmanager_verbs, nullptr, binding_init, nullptr, 0};
+   "windowmanager", nullptr, nullptr, windowmanager_verbs, nullptr, binding_init, on_event, 0};