Merge "Return errors to caller" into tizen_5.5
[platform/core/connectivity/stc-manager.git] / src / stc-restriction.c
index d49eb42..7e0e847 100755 (executable)
@@ -77,7 +77,7 @@ gboolean __validate_rstn_rule(table_restrictions_info *rule)
                return FALSE; //LCOV_EXCL_LINE
        }
 
-       if (rule->roaming > STC_ROAMING_ENABLE) {
+       if (rule->roaming > STC_ROAMING_DISABLE) {
                __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
                return FALSE; //LCOV_EXCL_LINE
        }
@@ -259,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,
@@ -269,6 +277,8 @@ gboolean handle_restriction_set(StcRestriction *object,
        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);
 
@@ -283,6 +293,7 @@ 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;
        }
@@ -291,12 +302,29 @@ gboolean handle_restriction_set(StcRestriction *object,
        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;
        }
 
-       stc_plugin_monitor_add_rstn(&rule);
+       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;
 }
@@ -311,6 +339,8 @@ gboolean handle_restriction_unset(StcRestriction *object,
        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);
 
@@ -325,6 +355,7 @@ 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;
        }
@@ -334,12 +365,29 @@ gboolean handle_restriction_unset(StcRestriction *object,
        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_plugin_monitor_remove_rstn(&rule);
        STC_DBUS_REPLY_ERROR_NONE(invocation);
+       __stc_free_restriction_rule_members(&rule);
        __STC_LOG_FUNC_EXIT__;
        return TRUE;
 }
@@ -354,6 +402,8 @@ gboolean handle_restriction_set_list(StcRestriction *object,
        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;
@@ -370,6 +420,7 @@ gboolean handle_restriction_set_list(StcRestriction *object,
                                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;
                        }
@@ -379,11 +430,13 @@ gboolean handle_restriction_set_list(StcRestriction *object,
                                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);
@@ -403,6 +456,8 @@ gboolean handle_restriction_unset_list(StcRestriction *object,
        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;
@@ -420,6 +475,7 @@ gboolean handle_restriction_unset_list(StcRestriction *object,
                                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;
                        }
@@ -429,11 +485,13 @@ gboolean handle_restriction_unset_list(StcRestriction *object,
                                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);
@@ -453,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,
@@ -483,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,
@@ -514,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