Remove uninstalled creator's rule after event received 96/56596/1
authorSomin Kim <somin926.kim@samsung.com>
Mon, 11 Jan 2016 09:34:49 +0000 (18:34 +0900)
committerSomin Kim <somin926.kim@samsung.com>
Mon, 11 Jan 2016 09:34:49 +0000 (18:34 +0900)
Change-Id: I1e0d31045f394806cd8747aa84dcd84f78be3bce
Signed-off-by: Somin Kim <somin926.kim@samsung.com>
src/context_trigger/rule.cpp
src/context_trigger/rule.h
src/context_trigger/rule_manager.cpp
src/context_trigger/rule_manager.h

index 803a4fb..f7b5ce8 100644 (file)
 #include "context_monitor.h"
 #include "timer_types.h"
 #include "context_fact_types.h"
+#include "rule_manager.h"
+
+ctx::rule_manager *ctx::trigger_rule::rule_mgr = NULL;
 
 ctx::trigger_rule::trigger_rule()
 {
 }
 
-ctx::trigger_rule::trigger_rule(int i, ctx::json& d, const char* cr, context_monitor* cm)
+ctx::trigger_rule::trigger_rule(int i, ctx::json& d, const char* cr, context_monitor* cm, rule_manager* rm)
        : result(EMPTY_JSON_OBJECT)
        , ctx_monitor(cm)
        , id(i)
        , creator(cr)
 {
+       // Rule manager
+       if (!rule_mgr) {
+               rule_mgr = rm;
+       }
+
        // Statement
        statement = d.str();
 
@@ -129,6 +137,14 @@ void ctx::trigger_rule::on_event_received(std::string name, ctx::json option, ct
        if (result != EMPTY_JSON_OBJECT) {
                clear_result();
        }
+
+       // Check if creator is uninstalled
+       if (ctx::rule_manager::is_uninstalled_package(creator)) {
+               _D("Creator(%s) of rule%d is uninstalled.", creator.c_str(), id);
+               g_idle_add(handle_uninstalled_rule, &id);
+               return;
+       }
+
        _D("Rule%d received event data", id);
 
        // Set event data
@@ -143,6 +159,7 @@ void ctx::trigger_rule::on_event_received(std::string name, ctx::json option, ct
 
        // TODO check if event matched first
 
+
        // Request read conditions
        for (std::list<context_item_t>::iterator it = condition.begin(); it != condition.end(); ++it) {
                ctx::json cond_option = (*it)->option.str();
@@ -188,3 +205,12 @@ void ctx::trigger_rule::on_context_data_prepared(void)
 
        clear_result();
 }
+
+gboolean ctx::trigger_rule::handle_uninstalled_rule(gpointer data)
+{
+       int* rule_id = static_cast<int*>(data);
+       rule_mgr->disable_rule(*rule_id);
+       rule_mgr->remove_rule(*rule_id);
+
+       return FALSE;
+}
index 4e3490e..62ab80a 100644 (file)
@@ -24,6 +24,7 @@
 namespace ctx {
 
        class context_monitor;
+       class rule_manager;
 
        class trigger_rule : public context_listener_iface {
                private:
@@ -49,17 +50,20 @@ namespace ctx {
                        ctx::json result;
 
                        context_monitor* ctx_monitor;
+                       static rule_manager* rule_mgr;
 
                        void clear_result(void);
                        bool set_condition_option_based_on_event(ctx::json& option);
                        void on_context_data_prepared(void);
 
+                       static gboolean handle_uninstalled_rule(gpointer data);
+
                public:
                        int id;
                        std::string creator;
 
                        trigger_rule();
-                       trigger_rule(int i, ctx::json& d, const char* c, context_monitor* cm);
+                       trigger_rule(int i, ctx::json& d, const char* c, context_monitor* cm, rule_manager* rm);
                        ~trigger_rule();
 
                        int start(void);
index d11994a..1689064 100644 (file)
@@ -528,6 +528,8 @@ int ctx::rule_manager::remove_rule(int rule_id)
        ret = db_manager::execute_sync(query.c_str(), &record);
        IF_FAIL_RETURN_TAG(ret, ERR_OPERATION_FAILED, _E, "Remove rule from db failed");
 
+       _D("Remove rule%d succeeded", rule_id);
+
        return ERR_NONE;
 }
 
@@ -555,7 +557,7 @@ int ctx::rule_manager::enable_rule(int rule_id)
        rule_record[0].get(NULL, "creator_app_id", &creator_app_id);
 
        // Create a rule instance
-       rule = new(std::nothrow) trigger_rule(rule_id, jrule, creator_app_id.c_str(), &ctx_monitor);
+       rule = new(std::nothrow) trigger_rule(rule_id, jrule, creator_app_id.c_str(), &ctx_monitor, this);
        IF_FAIL_RETURN_TAG(rule, ERR_OUT_OF_MEMORY, _E, "Failed to create rule instance");
 
        // Start the rule
index dc200cc..446b505 100644 (file)
@@ -43,6 +43,8 @@ namespace ctx {
                        int check_rule(std::string creator, int rule_id);
                        bool is_rule_enabled(int rule_id);
 
+                       static bool is_uninstalled_package(std::string app_id);
+
                private:
                        ctx::context_monitor ctx_monitor;
 
@@ -54,7 +56,6 @@ namespace ctx {
                        bool rule_item_equals(ctx::json& litem, ctx::json& ritem);
                        bool rule_equals(ctx::json& lrule, ctx::json& rrule);
                        int get_uninstalled_app(void);
-                       bool is_uninstalled_package(std::string app_id);
                        int clear_rule_of_uninstalled_app(bool is_init = false);
 
                        std::set<std::string> uninstalled_apps;