X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fstc-restriction.c;h=d47aaf0e0c683731f630b037247d4b6dd8aadf7a;hb=ebd33f27cfb111480f25b2cd08d1d5518cd5131c;hp=cb3a382028dc7c1f2229f3c51f4998f10010fedc;hpb=3c752514e81dd233f64ecaf84137b94fc7231c98;p=platform%2Fcore%2Fconnectivity%2Fstc-manager.git diff --git a/src/stc-restriction.c b/src/stc-restriction.c index cb3a382..d47aaf0 100755 --- a/src/stc-restriction.c +++ b/src/stc-restriction.c @@ -18,7 +18,7 @@ #include "table-restrictions.h" #include "stc-restriction.h" #include "stc-manager-gdbus.h" -#include "stc-monitor.h" +#include "stc-manager-plugin-monitor.h" #define RESTRICTION_DBUS_ERROR_NAME "net.stc.restriction.Error.Failed" @@ -34,24 +34,35 @@ static const gchar *stc_err_strs[] = { "OUT_OF_MEMORY", "INVALID_PARAMETER", "NO_DATA", + "ALREADY_DATA", "UNINITIALIZED", + "PERMISSION_DENIED", "NOTIMPL" }; void __initialize_rstn_rule(table_restrictions_info *rule) { rule->app_id = NULL; - rule->ifname = NULL; + rule->iftype = STC_IFACE_ALL; - rule->rst_type = STC_RSTN_TYPE_UNKNOWN; - rule->data_limit = 0; - rule->data_warn_limit = 0; - rule->roaming = STC_ROAMING_DISABLE; + rule->ifname = NULL; + rule->subscriber_id = NULL; + rule->roaming = STC_ROAMING_DISABLE; + + rule->rstn_type = STC_RSTN_TYPE_UNKNOWN; + rule->data_limit = -1; + rule->data_warn_limit = -1; + + rule->month_start_date = 1; + rule->monthly_limit = -1; + rule->weekly_limit = -1; + rule->daily_limit = -1; + + rule->mac = NULL; } -gboolean __validate_rstn_rule(table_restrictions_info *rule, - enum traffic_restriction_type rst_type) +gboolean __validate_rstn_rule(table_restrictions_info *rule) { __STC_LOG_FUNC_ENTER__; @@ -60,18 +71,13 @@ gboolean __validate_rstn_rule(table_restrictions_info *rule, return FALSE; //LCOV_EXCL_LINE } - if (rst_type <= RST_UNDEFINDED || rst_type >= RST_MAX_VALUE) { - __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE - return FALSE; //LCOV_EXCL_LINE - } - if (rule->iftype <= STC_IFACE_UNKNOWN || rule->iftype >= STC_IFACE_LAST_ELEM) { __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE return FALSE; //LCOV_EXCL_LINE } - if (rule->roaming >= STC_ROAMING_LAST_ELEM) { + if (rule->roaming > STC_ROAMING_DISABLE) { __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE return FALSE; //LCOV_EXCL_LINE } @@ -109,8 +115,8 @@ void __stc_restriction_app_info_builder_add(GVariantBuilder *builder, g_variant_builder_add(builder, "{sv}", "iftype", g_variant_new_uint16(info->iftype)); - g_variant_builder_add(builder, "{sv}", "rst_type", - g_variant_new_uint16(info->rst_type)); + g_variant_builder_add(builder, "{sv}", "rstn_type", + g_variant_new_uint16(info->rstn_type)); g_variant_builder_add(builder, "{sv}", "data_limit", g_variant_new_int64(info->data_limit)); @@ -118,6 +124,18 @@ void __stc_restriction_app_info_builder_add(GVariantBuilder *builder, g_variant_builder_add(builder, "{sv}", "data_warn_limit", g_variant_new_int64(info->data_warn_limit)); + g_variant_builder_add(builder, "{sv}", "month_start_date", + g_variant_new_int32(info->month_start_date)); + + g_variant_builder_add(builder, "{sv}", "monthly_limit", + g_variant_new_int64(info->monthly_limit)); + + g_variant_builder_add(builder, "{sv}", "weekly_limit", + g_variant_new_int64(info->weekly_limit)); + + g_variant_builder_add(builder, "{sv}", "daily_limit", + g_variant_new_int64(info->daily_limit)); + g_variant_builder_add(builder, "{sv}", "roaming", g_variant_new_uint16(info->roaming)); @@ -169,8 +187,6 @@ stc_cb_ret_e __table_restrictions_per_app_cb(const table_restrictions_info *info static void __stc_extract_restriction_rule(const char *key, GVariant *value, void *user_data) { - __STC_LOG_FUNC_ENTER__; - table_restrictions_info *rule = (table_restrictions_info *) user_data; if (rule == NULL) { @@ -179,13 +195,13 @@ static void __stc_extract_restriction_rule(const char *key, GVariant *value, } if (!g_strcmp0(key, "app_id")) { - guint str_length; + gsize str_length; const gchar *str = g_variant_get_string(value, &str_length); rule->app_id = g_strdup(str); - STC_LOGD("app_id: [%s]", (unsigned int) rule->app_id); + STC_LOGD("app_id: [%s]", rule->app_id); } else if (!g_strcmp0(key, "ifname")) { - guint str_length; + gsize str_length; const gchar *str = g_variant_get_string(value, &str_length); rule->ifname = g_strdup(str); STC_LOGD("ifname: [%s]", rule->ifname); @@ -202,21 +218,45 @@ static void __stc_extract_restriction_rule(const char *key, GVariant *value, rule->data_warn_limit = g_variant_get_int64(value); STC_LOGD("data_warn_limit: [%lld]", rule->data_warn_limit); + } else if (!g_strcmp0(key, "month_start_date")) { + rule->month_start_date = g_variant_get_int32(value); + STC_LOGD("month_start_date: [%d]", rule->month_start_date); + + } else if (!g_strcmp0(key, "monthly_limit")) { + rule->monthly_limit = g_variant_get_int64(value); + STC_LOGD("monthly_limit: [%lld]", rule->monthly_limit); + + } else if (!g_strcmp0(key, "weekly_limit")) { + rule->weekly_limit = g_variant_get_int64(value); + STC_LOGD("weekly_limit: [%lld]", rule->weekly_limit); + + } else if (!g_strcmp0(key, "daily_limit")) { + rule->daily_limit = g_variant_get_int64(value); + STC_LOGD("daily_limit: [%lld]", rule->daily_limit); + } else if (!g_strcmp0(key, "roaming")) { rule->roaming = g_variant_get_uint16(value); STC_LOGD("roaming: [%u]", rule->roaming); } else if (!g_strcmp0(key, "subscriber_id")) { - guint str_length; + gsize str_length; const gchar *str = g_variant_get_string(value, &str_length); rule->subscriber_id = g_strdup(str); STC_LOGD("subscriber_id: [%s]", rule->subscriber_id); + } else if (!g_strcmp0(key, "rstn_type")) { + rule->rstn_type = g_variant_get_uint16(value); + STC_LOGD("type: [%u]", (unsigned int) rule->rstn_type); + + } else if (!g_strcmp0(key, "mac")) { + gsize str_length; + const gchar *str = g_variant_get_string(value, &str_length); + rule->mac = g_strdup(str); + STC_LOGD("mac: [%s]", rule->mac); + } else { STC_LOGD("Unknown select rule"); //LCOV_EXCL_LINE } - - __STC_LOG_FUNC_EXIT__; } gboolean handle_restriction_set(StcRestriction *object, @@ -227,6 +267,9 @@ gboolean handle_restriction_set(StcRestriction *object, __STC_LOG_FUNC_ENTER__; GVariantIter *iter = NULL; table_restrictions_info rule; + stc_error_e ret = STC_ERROR_NONE; + + stc_set_keep_alive(TRUE); memset(&rule, 0, sizeof(table_restrictions_info)); __initialize_rstn_rule(&rule); @@ -239,32 +282,38 @@ gboolean handle_restriction_set(StcRestriction *object, g_variant_iter_free(iter); } - rule.rst_type = STC_RSTN_TYPE_BLOCKED; - - if (__validate_rstn_rule(&rule, RST_SET) == FALSE) { + if (__validate_rstn_rule(&rule) == FALSE) { STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE STC_ERROR_INVALID_PARAMETER); __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE return TRUE; } - table_restrictions_update(&rule); - /* update restriction rule in runtime structure */ - stc_monitor_rstns_tree_add(&rule); + ret = table_restrictions_update(&rule); + if (ret != STC_ERROR_NONE) { + STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE + STC_ERROR_DB_FAILED); + __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE + return TRUE; + } + stc_plugin_monitor_add_rstn(&rule); STC_DBUS_REPLY_ERROR_NONE(invocation); __STC_LOG_FUNC_EXIT__; return TRUE; } -gboolean handle_restriction_exclude(StcRestriction *object, - GDBusMethodInvocation *invocation, - GVariant *parameters, - void *user_data) +gboolean handle_restriction_unset(StcRestriction *object, + GDBusMethodInvocation *invocation, + GVariant *parameters, + void *user_data) { __STC_LOG_FUNC_ENTER__; GVariantIter *iter = NULL; table_restrictions_info rule; + stc_error_e ret = STC_ERROR_NONE; + + stc_set_keep_alive(TRUE); memset(&rule, 0, sizeof(table_restrictions_info)); __initialize_rstn_rule(&rule); @@ -277,54 +326,125 @@ gboolean handle_restriction_exclude(StcRestriction *object, g_variant_iter_free(iter); } - rule.rst_type = STC_RSTN_TYPE_EXCLUDED; - - if (__validate_rstn_rule(&rule, RST_EXCLUDE) == FALSE) { + if (__validate_rstn_rule(&rule) == FALSE) { STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE STC_ERROR_INVALID_PARAMETER); __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE return TRUE; } - table_restrictions_update(&rule); - /* update restriction rule in runtime structure */ - stc_monitor_rstns_tree_add(&rule); + ret = table_restrictions_delete(rule.app_id, rule.iftype, rule.ifname, + rule.subscriber_id, rule.roaming); + if (ret != STC_ERROR_NONE) { + STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE + STC_ERROR_DB_FAILED); + __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE + return TRUE; + } + stc_plugin_monitor_remove_rstn(&rule); STC_DBUS_REPLY_ERROR_NONE(invocation); __STC_LOG_FUNC_EXIT__; return TRUE; } -gboolean handle_restriction_unset(StcRestriction *object, +gboolean handle_restriction_set_list(StcRestriction *object, + GDBusMethodInvocation *invocation, + GVariant *parameters, + void *user_data) +{ + __STC_LOG_FUNC_ENTER__; + GVariantIter *iter = NULL; + GVariantIter *iter_row = NULL; + stc_error_e ret = STC_ERROR_NONE; + + stc_set_keep_alive(TRUE); + + g_variant_get(parameters, "aa{sv}", &iter); + while (g_variant_iter_next(iter, "a{sv}", &iter_row)) { + table_restrictions_info rule; + + memset(&rule, 0, sizeof(table_restrictions_info)); + __initialize_rstn_rule(&rule); + + stc_manager_gdbus_dict_foreach(iter_row, + __stc_extract_restriction_rule, &rule); + + if (__validate_rstn_rule(&rule)) { + ret = table_restrictions_update(&rule); + if (ret != STC_ERROR_NONE) { + STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE + g_variant_iter_free(iter_row); + g_variant_iter_free(iter); + __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE + return TRUE; + } + + ret = stc_plugin_monitor_add_rstn(&rule); + if (ret != STC_ERROR_NONE) { + STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE + g_variant_iter_free(iter_row); + g_variant_iter_free(iter); + __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE + return TRUE; + } + } + + g_variant_iter_free(iter_row); + } + g_variant_iter_free(iter); + + STC_DBUS_REPLY_ERROR_NONE(invocation); + __STC_LOG_FUNC_EXIT__; + return TRUE; +} + +gboolean handle_restriction_unset_list(StcRestriction *object, GDBusMethodInvocation *invocation, GVariant *parameters, void *user_data) { __STC_LOG_FUNC_ENTER__; GVariantIter *iter = NULL; - table_restrictions_info rule; - - memset(&rule, 0, sizeof(table_restrictions_info)); - __initialize_rstn_rule(&rule); - - g_variant_get(parameters, "a{sv}", &iter); - if (iter != NULL) { - stc_manager_gdbus_dict_foreach(iter, - __stc_extract_restriction_rule, - &rule); - g_variant_iter_free(iter); + GVariantIter *iter_row = NULL; + stc_error_e ret = STC_ERROR_NONE; + + stc_set_keep_alive(TRUE); + + g_variant_get(parameters, "aa{sv}", &iter); + while (g_variant_iter_next(iter, "a{sv}", &iter_row)) { + table_restrictions_info rule; + + memset(&rule, 0, sizeof(table_restrictions_info)); + __initialize_rstn_rule(&rule); + + stc_manager_gdbus_dict_foreach(iter_row, + __stc_extract_restriction_rule, &rule); + + if (__validate_rstn_rule(&rule)) { + ret = table_restrictions_delete(rule.app_id, rule.iftype, + rule.ifname, rule.subscriber_id, rule.roaming); + if (ret != STC_ERROR_NONE) { + STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE + g_variant_iter_free(iter_row); + g_variant_iter_free(iter); + __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE + return TRUE; + } + + ret = stc_plugin_monitor_remove_rstn(&rule); + if (ret != STC_ERROR_NONE) { + STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE + g_variant_iter_free(iter_row); + g_variant_iter_free(iter); + __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE + return TRUE; + } + } + + g_variant_iter_free(iter_row); } - - if (__validate_rstn_rule(&rule, RST_UNSET) == FALSE) { - STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE - STC_ERROR_INVALID_PARAMETER); - __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE - return TRUE; - } - - table_restrictions_delete(rule.app_id, rule.iftype, rule.subscriber_id); - /* remove restriction rule from runtime structure */ - stc_monitor_rstns_tree_remove(&rule); + g_variant_iter_free(iter); STC_DBUS_REPLY_ERROR_NONE(invocation); __STC_LOG_FUNC_EXIT__; @@ -341,6 +461,8 @@ gboolean handle_restriction_get(StcRestriction *object, GVariant *return_parameters = NULL; stc_error_e ret; + stc_set_keep_alive(TRUE); + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); ret = table_restrictions_per_app(app_id, @@ -371,6 +493,8 @@ gboolean handle_restriction_get_all(StcRestriction *object, GVariant *return_parameters = NULL; stc_error_e ret; + stc_set_keep_alive(TRUE); + builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}")); ret = table_restrictions_foreach(__table_restrictions_foreach_app_cb, @@ -391,7 +515,7 @@ gboolean handle_restriction_get_all(StcRestriction *object, return TRUE; } -gboolean handle_restriction_get_state(StcRestriction *object, +gboolean handle_restriction_get_type(StcRestriction *object, GDBusMethodInvocation *invocation, const gchar *app_id, int iftype, @@ -399,17 +523,19 @@ gboolean handle_restriction_get_state(StcRestriction *object, { __STC_LOG_FUNC_ENTER__; GVariant *return_parameters = NULL; - stc_restriction_state_e state = STC_RESTRICTION_UNKNOWN; + stc_rstn_type_e type = STC_RSTN_TYPE_UNKNOWN; stc_error_e ret; - ret = table_restrictions_get_restriction_state(app_id, iftype, &state); + stc_set_keep_alive(TRUE); + + ret = table_restrictions_get_restriction_type(app_id, iftype, &type); if (ret < STC_ERROR_NONE) { STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE return TRUE; } - return_parameters = g_variant_new("(ii)", STC_ERROR_NONE, state); + return_parameters = g_variant_new("(ii)", STC_ERROR_NONE, type); STC_DBUS_REPLY(invocation, return_parameters); __STC_LOG_FUNC_EXIT__; return TRUE;