Modify API of PolicyManager
[apps/agl-service-windowmanager.git] / src / app.cpp
index a117848..47f18aa 100644 (file)
@@ -94,6 +94,178 @@ struct result<layer_map> load_layer_map(char const *filename) {
 }  // namespace
 
 
+namespace rm {
+App *context;
+const char *g_new_role; // TODO: workaround
+static void eventHandler(json_object* json_out) {
+    context->updateWindowResource(json_out);
+}
+}  // namespace rm
+
+
+void App::updateWindowResource(json_object* json_out) {
+    HMI_DEBUG("wm", "role:%s", rm::g_new_role);
+
+    // Check parking brake state
+    json_object* json_parking_brake;
+    if (!json_object_object_get_ex(json_out, "parking_brake", &json_parking_brake)) {
+        HMI_DEBUG("wm", "Not found key \"parking_brake\"");
+        return;
+    }
+
+    json_bool is_changed;
+    is_changed = jh::getBoolFromJson(json_parking_brake, "is_changed");
+    if (is_changed) {
+        std::string parking_brake_state = jh::getStringFromJson(json_parking_brake, "state");
+        HMI_DEBUG("wm", "parking_brake_state: %s", parking_brake_state.c_str());
+
+        // Update state and emit event
+        if ("parking_brake_off" == parking_brake_state) {
+            this->crr_car_info_.parking_brake_stt = false;
+#if 0 // FOR ALS: using lightstatus brake, so do not emit parking brake event
+            this->emitParkingBrakeOff();
+#endif
+        }
+        else if ("parking_brake_on" == parking_brake_state) {
+            this->crr_car_info_.parking_brake_stt = true;
+#if 0 // FOR ALS: using lightstatus brake, so do not emit parking brake event
+            this->emitParkingBrakeOn();
+#endif
+        }
+        else {
+            HMI_DEBUG("wm", "Unknown parking brake state");
+            return;
+        }
+    }
+
+    // Check accelerator pedal state
+    json_object* json_accel_pedal;
+    if (!json_object_object_get_ex(json_out, "accel_pedal", &json_accel_pedal)) {
+        HMI_DEBUG("wm", "Not found key \"accel_pedal\"");
+        return;
+    }
+
+    is_changed = jh::getBoolFromJson(json_accel_pedal, "is_changed");
+    if (is_changed) {
+        std::string accel_pedal_state = jh::getStringFromJson(json_accel_pedal, "state");
+        HMI_DEBUG("wm", "accel_pedal_state: %s", accel_pedal_state.c_str());
+
+        // Update state
+        if ("accel_pedal_off" == accel_pedal_state) {
+            this->crr_car_info_.accel_pedal_stt = false;
+        }
+        else if ("accel_pedal_on" == accel_pedal_state) {
+            this->crr_car_info_.accel_pedal_stt = true;
+        }
+        else {
+            HMI_DEBUG("wm", "Unknown accel pedal state");
+            return;
+        }
+    }
+
+    // Check lightstatus brake state
+    json_object* json_lightstatus_brake;
+    if (!json_object_object_get_ex(json_out, "lightstatus_brake", &json_lightstatus_brake)) {
+        HMI_DEBUG("wm", "Not found key \"lightstatus_brake\"");
+        return;
+    }
+
+    is_changed = jh::getBoolFromJson(json_lightstatus_brake, "is_changed");
+    if (is_changed) {
+        std::string lightstatus_brake_state = jh::getStringFromJson(json_lightstatus_brake, "state");
+        HMI_DEBUG("wm", "lightstatus_brake_state: %s", lightstatus_brake_state.c_str());
+
+        // Update state and emit event
+        if ("lightstatus_brake_off" == lightstatus_brake_state) {
+            this->crr_car_info_.lightstatus_brake_stt = false;
+            this->emitLightstatusBrakeOff();
+        }
+        else if ("lightstatus_brake_on" == lightstatus_brake_state) {
+            this->crr_car_info_.lightstatus_brake_stt = true;
+            this->emitLightstatusBrakeOn();
+        }
+        else {
+            HMI_DEBUG("wm", "Unknown lightstatus brake state");
+            return;
+        }
+    }
+
+    // Check car state
+    json_object* json_car;
+    if (!json_object_object_get_ex(json_out, "car", &json_car)) {
+        HMI_DEBUG("wm", "Not found key \"car\"");
+        return;
+    }
+
+    is_changed = jh::getBoolFromJson(json_car, "is_changed");
+    if (is_changed) {
+        std::string car_state = jh::getStringFromJson(json_car, "state");
+        HMI_DEBUG("wm", "car_state: %s", car_state.c_str());
+
+        // Emit car event
+        if ("car_stop" == car_state) {
+            this->crr_car_info_.car_stt = "stop";
+            this->emitCarStop();
+        }
+        else if ("car_run" == car_state) {
+            this->crr_car_info_.car_stt = "run";
+            this->emitCarRun();
+        }
+        else {
+            HMI_DEBUG("wm", "Unknown car state");
+            return;
+        }
+    }
+
+    // Check lamp state
+    json_object* json_lamp;
+    if (!json_object_object_get_ex(json_out, "lamp", &json_lamp)) {
+        HMI_DEBUG("wm", "Not found key \"lamp\"");
+        return;
+    }
+
+    is_changed = jh::getBoolFromJson(json_lamp, "is_changed");
+    if (is_changed) {
+        std::string lamp_state = jh::getStringFromJson(json_lamp, "state");
+        HMI_DEBUG("wm", "lamp_state: %s", lamp_state.c_str());
+
+        // Update state and emit event
+        if ("lamp_off" == lamp_state) {
+            this->crr_car_info_.headlamp_stt = false;
+            this->emitHeadlampOff();
+        }
+        else if ("lamp_on" == lamp_state) {
+            this->crr_car_info_.headlamp_stt = true;
+            this->emitHeadlampOn();
+        }
+        else {
+            HMI_DEBUG("wm", "Unknown lamp state");
+            return;
+        }
+    }
+
+    // Get category
+    const char* category = nullptr;
+    std::string str_category;
+    if (nullptr != rm::g_new_role) {
+        str_category = this->pm_.roleToCategory(rm::g_new_role);
+        category = str_category.c_str();
+        HMI_DEBUG("wm", "role:%s category:%s", rm::g_new_role, category);
+    }
+
+    // Update layout
+    if (this->lm_.updateLayout(json_out, rm::g_new_role, category)) {
+        HMI_DEBUG("wm", "Layer is changed!!");
+
+        // Allocate surface
+        this->allocateSurface();
+    }
+    else {
+        HMI_DEBUG("wm", "All layer is NOT changed!!");
+    }
+}
+
+
 /**
  * App Impl
  */
@@ -139,6 +311,9 @@ int App::init() {
       return -1;
    }
 
+   // Store my context for calling callback for PolicyManager
+   rm::context = this;
+
 #if 1 // @@@@@
    // Load app.db
    this->loadAppDb();
@@ -147,6 +322,12 @@ int App::init() {
    // Initialize PolicyManager
    this->pm_.initialize();
 
+   // Register callback to PolicyManager
+   PolicyManager::CallbackTable callback;
+   callback.onStateTransitioned = rm::eventHandler;
+   callback.onError = nullptr;
+   this->pm_.registerCallback(callback);
+
    // Initialize LayoutManager
    this->lm_.initialize();
 
@@ -336,180 +517,17 @@ void App::allocateWindowResource(char const *event, char const *drawing_name,
     // If event is "activate" and area is not specifid,
     // get default value by using role
 
-    // Check Policy
+    // Input event to PolicyManager
     json_object* json_in = json_object_new_object();
     json_object_object_add(json_in, "event", json_object_new_string(event));
-
     if (nullptr != new_role) {
         json_object_object_add(json_in, "role", json_object_new_string(new_role));
     }
     if (nullptr != new_area) {
         json_object_object_add(json_in, "area", json_object_new_string(new_area));
     }
-
-    // Input event to PolicyManager
-    this->pm_.inputEvent(json_in,
-        [this, new_role, reply] (json_object* json_out) {
-        HMI_DEBUG("wm", "role:%s", new_role);
-
-    // Check parking brake state
-    json_object* json_parking_brake;
-    if (!json_object_object_get_ex(json_out, "parking_brake", &json_parking_brake)) {
-        reply("Not found key \"parking_brake\"");
-        return;
-    }
-
-    json_bool is_changed;
-    is_changed = jh::getBoolFromJson(json_parking_brake, "is_changed");
-    if (is_changed) {
-        std::string parking_brake_state = jh::getStringFromJson(json_parking_brake, "state");
-        HMI_DEBUG("wm", "parking_brake_state: %s", parking_brake_state.c_str());
-
-        // Update state and emit event
-        if ("parking_brake_off" == parking_brake_state) {
-            this->crr_car_info_.parking_brake_stt = false;
-#if 0 // FOR ALS: using lightstatus brake, so do not emit parking brake event
-            this->emitParkingBrakeOff();
-#endif
-        }
-        else if ("parking_brake_on" == parking_brake_state) {
-            this->crr_car_info_.parking_brake_stt = true;
-#if 0 // FOR ALS: using lightstatus brake, so do not emit parking brake event
-            this->emitParkingBrakeOn();
-#endif
-        }
-        else {
-            reply("Unknown parking brake state");
-            return;
-        }
-    }
-
-    // Check accelerator pedal state
-    json_object* json_accel_pedal;
-    if (!json_object_object_get_ex(json_out, "accel_pedal", &json_accel_pedal)) {
-        reply("Not found key \"accel_pedal\"");
-        return;
-    }
-
-    is_changed = jh::getBoolFromJson(json_accel_pedal, "is_changed");
-    if (is_changed) {
-        std::string accel_pedal_state = jh::getStringFromJson(json_accel_pedal, "state");
-        HMI_DEBUG("wm", "accel_pedal_state: %s", accel_pedal_state.c_str());
-
-        // Update state
-        if ("accel_pedal_off" == accel_pedal_state) {
-            this->crr_car_info_.accel_pedal_stt = false;
-        }
-        else if ("accel_pedal_on" == accel_pedal_state) {
-            this->crr_car_info_.accel_pedal_stt = true;
-        }
-        else {
-            reply("Unknown accel pedal state");
-            return;
-        }
-    }
-
-    // Check lightstatus brake state
-    json_object* json_lightstatus_brake;
-    if (!json_object_object_get_ex(json_out, "lightstatus_brake", &json_lightstatus_brake)) {
-        reply("Not found key \"lightstatus_brake\"");
-        return;
-    }
-
-    is_changed = jh::getBoolFromJson(json_lightstatus_brake, "is_changed");
-    if (is_changed) {
-        std::string lightstatus_brake_state = jh::getStringFromJson(json_lightstatus_brake, "state");
-        HMI_DEBUG("wm", "lightstatus_brake_state: %s", lightstatus_brake_state.c_str());
-
-        // Update state and emit event
-        if ("lightstatus_brake_off" == lightstatus_brake_state) {
-            this->crr_car_info_.lightstatus_brake_stt = false;
-            this->emitLightstatusBrakeOff();
-        }
-        else if ("lightstatus_brake_on" == lightstatus_brake_state) {
-            this->crr_car_info_.lightstatus_brake_stt = true;
-            this->emitLightstatusBrakeOn();
-        }
-        else {
-            reply("Unknown lightstatus brake state");
-            return;
-        }
-    }
-
-    // Check car state
-    json_object* json_car;
-    if (!json_object_object_get_ex(json_out, "car", &json_car)) {
-        reply("Not found key \"car\"");
-        return;
-    }
-
-    is_changed = jh::getBoolFromJson(json_car, "is_changed");
-    if (is_changed) {
-        std::string car_state = jh::getStringFromJson(json_car, "state");
-        HMI_DEBUG("wm", "car_state: %s", car_state.c_str());
-
-        // Emit car event
-        if ("car_stop" == car_state) {
-            this->crr_car_info_.car_stt = "stop";
-            this->emitCarStop();
-        }
-        else if ("car_run" == car_state) {
-            this->crr_car_info_.car_stt = "run";
-            this->emitCarRun();
-        }
-        else {
-            reply("Unknown car state");
-            return;
-        }
-    }
-
-    // Check lamp state
-    json_object* json_lamp;
-    if (!json_object_object_get_ex(json_out, "lamp", &json_lamp)) {
-        reply("Not found key \"lamp\"");
-        return;
-    }
-
-    is_changed = jh::getBoolFromJson(json_lamp, "is_changed");
-    if (is_changed) {
-        std::string lamp_state = jh::getStringFromJson(json_lamp, "state");
-        HMI_DEBUG("wm", "lamp_state: %s", lamp_state.c_str());
-
-        // Update state and emit event
-        if ("lamp_off" == lamp_state) {
-            this->crr_car_info_.headlamp_stt = false;
-            this->emitHeadlampOff();
-        }
-        else if ("lamp_on" == lamp_state) {
-            this->crr_car_info_.headlamp_stt = true;
-            this->emitHeadlampOn();
-        }
-        else {
-            reply("Unknown lamp state");
-            return;
-        }
-    }
-
-    // Get category
-    const char* category = nullptr;
-    std::string str_category;
-    if (nullptr != new_role) {
-        str_category = this->pm_.roleToCategory(new_role);
-        category = str_category.c_str();
-        HMI_DEBUG("wm", "role:%s category:%s", new_role, category);
-    }
-
-    // Update layout
-    if (this->lm_.updateLayout(json_out, new_role, category)) {
-        HMI_DEBUG("wm", "Layer is changed!!");
-
-        // Allocate surface
-        this->allocateSurface();
-    }
-    else {
-        HMI_DEBUG("wm", "All layer is NOT changed!!");
-    }
-});
+    rm::g_new_role = new_role;  // TODO: workaround
+    this->pm_.inputEvent(json_in);
 
     // Release json_object
     json_object_put(json_in);