From 7224d1c9e1972595ed5d2563468ede5f3451f4bc Mon Sep 17 00:00:00 2001 From: Somin Kim Date: Mon, 11 Jan 2016 18:34:49 +0900 Subject: [PATCH] Remove uninstalled creator's rule after event received Change-Id: I1e0d31045f394806cd8747aa84dcd84f78be3bce Signed-off-by: Somin Kim --- src/context_trigger/rule.cpp | 28 +++++++++++++++++++++++++++- src/context_trigger/rule.h | 6 +++++- src/context_trigger/rule_manager.cpp | 4 +++- src/context_trigger/rule_manager.h | 3 ++- 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/context_trigger/rule.cpp b/src/context_trigger/rule.cpp index 803a4fb..f7b5ce8 100644 --- a/src/context_trigger/rule.cpp +++ b/src/context_trigger/rule.cpp @@ -21,17 +21,25 @@ #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::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(data); + rule_mgr->disable_rule(*rule_id); + rule_mgr->remove_rule(*rule_id); + + return FALSE; +} diff --git a/src/context_trigger/rule.h b/src/context_trigger/rule.h index 4e3490e..62ab80a 100644 --- a/src/context_trigger/rule.h +++ b/src/context_trigger/rule.h @@ -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); diff --git a/src/context_trigger/rule_manager.cpp b/src/context_trigger/rule_manager.cpp index d11994a..1689064 100644 --- a/src/context_trigger/rule_manager.cpp +++ b/src/context_trigger/rule_manager.cpp @@ -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 diff --git a/src/context_trigger/rule_manager.h b/src/context_trigger/rule_manager.h index dc200cc..446b505 100644 --- a/src/context_trigger/rule_manager.h +++ b/src/context_trigger/rule_manager.h @@ -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 uninstalled_apps; -- 2.7.4