#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();
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
// 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();
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;
+}
namespace ctx {
class context_monitor;
+ class rule_manager;
class trigger_rule : public context_listener_iface {
private:
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);
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;
}
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
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;
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;