X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fstc-restriction.c;h=7e0e847d03e7ca8d4f58f8d252ad3dc288a2e002;hb=refs%2Fheads%2Ftizen_5.5;hp=f4cd753b788178cf2dfbfbd2c1af1a2a82c434cb;hpb=a72b6122101219d7acd0ab83b7c74a90d3599596;p=platform%2Fcore%2Fconnectivity%2Fstc-manager.git diff --git a/src/stc-restriction.c b/src/stc-restriction.c old mode 100644 new mode 100755 index f4cd753..7e0e847 --- 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" @@ -43,16 +43,23 @@ static const gchar *stc_err_strs[] = { void __initialize_rstn_rule(table_restrictions_info *rule) { rule->app_id = NULL; - rule->ifname = NULL; + rule->iftype = STC_IFACE_ALL; + 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->roaming = STC_ROAMING_DISABLE; - rule->subscriber_id = NULL; + + rule->mac = NULL; } gboolean __validate_rstn_rule(table_restrictions_info *rule) @@ -70,7 +77,7 @@ gboolean __validate_rstn_rule(table_restrictions_info *rule) 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 } @@ -188,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]", 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); @@ -232,7 +239,7 @@ static void __stc_extract_restriction_rule(const char *key, GVariant *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); @@ -242,7 +249,7 @@ static void __stc_extract_restriction_rule(const char *key, GVariant *value, STC_LOGD("type: [%u]", (unsigned int) rule->rstn_type); } else if (!g_strcmp0(key, "mac")) { - guint str_length; + gsize str_length; const gchar *str = g_variant_get_string(value, &str_length); rule->mac = g_strdup(str); STC_LOGD("mac: [%s]", rule->mac); @@ -252,6 +259,14 @@ static void __stc_extract_restriction_rule(const char *key, GVariant *value, } } +static void __stc_free_restriction_rule_members(table_restrictions_info *rule) +{ + FREE(rule->app_id); + FREE(rule->ifname); + FREE(rule->subscriber_id); + FREE(rule->mac); +} + gboolean handle_restriction_set(StcRestriction *object, GDBusMethodInvocation *invocation, GVariant *parameters, @@ -260,6 +275,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); @@ -275,15 +293,38 @@ gboolean handle_restriction_set(StcRestriction *object, if (__validate_rstn_rule(&rule) == FALSE) { STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE STC_ERROR_INVALID_PARAMETER); + __stc_free_restriction_rule_members(&rule); __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_free_restriction_rule_members(&rule); + __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE + return TRUE; + } + ret = stc_plugin_monitor_add_rstn(&rule); + if (ret == STC_ERROR_UNINITIALIZED) { + STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE + STC_ERROR_UNINITIALIZED); + table_restrictions_delete(rule.app_id, rule.iftype, rule.ifname, + rule.subscriber_id, rule.roaming); + __stc_free_restriction_rule_members(&rule); + __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE + return TRUE; + } else if (ret == STC_ERROR_NO_DATA || ret == STC_ERROR_OUT_OF_MEMORY) { + STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE + ret); + __stc_free_restriction_rule_members(&rule); + __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE + return TRUE; + } STC_DBUS_REPLY_ERROR_NONE(invocation); + __stc_free_restriction_rule_members(&rule); __STC_LOG_FUNC_EXIT__; return TRUE; } @@ -296,6 +337,9 @@ gboolean handle_restriction_unset(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); @@ -311,13 +355,146 @@ gboolean handle_restriction_unset(StcRestriction *object, if (__validate_rstn_rule(&rule) == FALSE) { STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE STC_ERROR_INVALID_PARAMETER); + __stc_free_restriction_rule_members(&rule); + __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE + return TRUE; + } + + 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_free_restriction_rule_members(&rule); + __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE + return TRUE; + } + + ret = stc_plugin_monitor_remove_rstn(&rule); + if (ret == STC_ERROR_UNINITIALIZED) { + STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE + STC_ERROR_UNINITIALIZED); + __stc_free_restriction_rule_members(&rule); __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE return TRUE; + } else if (ret == STC_ERROR_NO_DATA) { + table_restrictions_update(&rule); + STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE + STC_ERROR_NO_DATA); + __stc_free_restriction_rule_members(&rule); + __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE + return TRUE; + } + + STC_DBUS_REPLY_ERROR_NONE(invocation); + __stc_free_restriction_rule_members(&rule); + __STC_LOG_FUNC_EXIT__; + return TRUE; +} + +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_free_restriction_rule_members(&rule); + __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_free_restriction_rule_members(&rule); + __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE + return TRUE; + } + } + + __stc_free_restriction_rule_members(&rule); + g_variant_iter_free(iter_row); } + g_variant_iter_free(iter); - table_restrictions_delete(rule.app_id, rule.iftype, rule.subscriber_id); - /* remove restriction rule from runtime structure */ - stc_monitor_rstns_tree_remove(&rule); + 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; + 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_free_restriction_rule_members(&rule); + __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_free_restriction_rule_members(&rule); + __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE + return TRUE; + } + } + + __stc_free_restriction_rule_members(&rule); + g_variant_iter_free(iter_row); + } + g_variant_iter_free(iter); STC_DBUS_REPLY_ERROR_NONE(invocation); __STC_LOG_FUNC_EXIT__; @@ -334,6 +511,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, @@ -364,6 +543,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, @@ -395,6 +576,8 @@ gboolean handle_restriction_get_type(StcRestriction *object, stc_rstn_type_e type = STC_RSTN_TYPE_UNKNOWN; stc_error_e ret; + 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