Merge "Return errors to caller" into tizen_5.5
[platform/core/connectivity/stc-manager.git] / src / stc-statistics.c
index ec52aeb..feee566 100755 (executable)
@@ -21,9 +21,6 @@
 
 #define STATISTICS_DBUS_ERROR_NAME "net.stc.statistics.Error.Failed"
 
-#define STC_DBUS_REPLY(invocation, parameters) \
-       g_dbus_method_invocation_return_value((invocation), parameters);
-
 #define STC_STATISTICS_DBUS_REPLY_ERROR(invocation, err_num) \
        g_dbus_method_invocation_return_dbus_error((invocation), \
                                                   STATISTICS_DBUS_ERROR_NAME, \
@@ -36,7 +33,9 @@ static const gchar *stc_err_strs[] = {
        "OUT_OF_MEMORY",
        "INVALID_PARAMETER",
        "NO_DATA",
+       "ALREADY_DATA",
        "UNINITIALIZED",
+       "PERMISSION_DENIED",
        "NOTIMPL"
 };
 
@@ -61,15 +60,11 @@ void __stc_extract_select_rule(const char *key, GVariant *value,
        table_statistics_select_rule *rule =
                (table_statistics_select_rule *) user_data;
        if (rule == NULL) {
-               __STC_LOG_FUNC_EXIT__;
-               return;
+               __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
+               return; //LCOV_EXCL_LINE
        }
 
-       if (!g_strcmp0(key, "version")) {
-               rule->version = g_variant_get_byte(value);
-               STC_LOGD("version: [%u]", (unsigned int) rule->version);
-
-       } else if (!g_strcmp0(key, "from")) {
+       if (!g_strcmp0(key, "from")) {
                rule->from = g_variant_get_uint64(value);
                STC_LOGD("from: [%lu]", rule->from);
 
@@ -81,12 +76,17 @@ void __stc_extract_select_rule(const char *key, GVariant *value,
                rule->iftype = g_variant_get_uint16(value);
                STC_LOGD("iftype: [%u]", (unsigned int) rule->iftype);
 
+       } else if (!g_strcmp0(key, "app_id")) {
+               gsize length = 0;
+               rule->app_id = g_variant_dup_string(value, &length);
+               STC_LOGD("app_id: [%s]", rule->app_id);
+
        } else if (!g_strcmp0(key, "granularity")) {
                rule->granularity = g_variant_get_int32(value);
                STC_LOGD("granularity: [%d]", rule->granularity);
 
        } else {
-               STC_LOGD("Unknown select rule");
+               STC_LOGD("Unknown select rule"); //LCOV_EXCL_LINE
        }
 
        __STC_LOG_FUNC_EXIT__;
@@ -100,23 +100,19 @@ void __stc_extract_reset_rule(const char *key, GVariant *value,
        table_statistics_reset_rule *rule =
                (table_statistics_reset_rule *) user_data;
        if (rule == NULL) {
-               __STC_LOG_FUNC_EXIT__;
-               return;
+               __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
+               return; //LCOV_EXCL_LINE
        }
 
-       if (!g_strcmp0(key, "version")) {
-               rule->version = g_variant_get_byte(value);
-               STC_LOGD("version: [%u]", (unsigned int) rule->version);
-
-       } else if (!g_strcmp0(key, "app_id")) {
+       if (!g_strcmp0(key, "app_id")) {
                gsize len = 0;
                rule->app_id = g_variant_dup_string(value, &len);
                STC_LOGD("app_id: [%s]", rule->app_id);
 
-       } else if (!g_strcmp0(key, "imsi")) {
+       } else if (!g_strcmp0(key, "subscriber_id")) {
                gsize len = 0;
-               rule->imsi = g_variant_dup_string(value, &len);
-               STC_LOGD("imsi: [%s]", rule->imsi);
+               rule->subscriber_id = g_variant_dup_string(value, &len);
+               STC_LOGD("subscriber_id: [%s]", rule->subscriber_id);
 
        } else if (!g_strcmp0(key, "iftype")) {
                rule->iftype = g_variant_get_uint16(value);
@@ -124,10 +120,10 @@ void __stc_extract_reset_rule(const char *key, GVariant *value,
 
        } else if (!g_strcmp0(key, "from")) {
                if (!(rule->interval)) {
-                       rule->interval = MALLOC0(stc_db_tm_interval_s, 1);
-                       if (!(rule->interval)) {
-                               __STC_LOG_FUNC_EXIT__;
-                               return;
+                       rule->interval = MALLOC0(stc_db_tm_interval_s, 1); //LCOV_EXCL_LINE
+                       if (!(rule->interval)) { //LCOV_EXCL_LINE
+                               __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
+                               return; //LCOV_EXCL_LINE
                        }
                }
 
@@ -136,22 +132,18 @@ void __stc_extract_reset_rule(const char *key, GVariant *value,
 
        } else if (!g_strcmp0(key, "to")) {
                if (!(rule->interval)) {
-                       rule->interval = MALLOC0(stc_db_tm_interval_s, 1);
-                       if (!(rule->interval)) {
-                               __STC_LOG_FUNC_EXIT__;
-                               return;
+                       rule->interval = MALLOC0(stc_db_tm_interval_s, 1); //LCOV_EXCL_LINE
+                       if (!(rule->interval)) { //LCOV_EXCL_LINE
+                               __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
+                               return; //LCOV_EXCL_LINE
                        }
                }
 
                rule->interval->to = g_variant_get_uint64(value);
                STC_LOGD("to: [%lu]", rule->interval->to);
 
-       } else if (!g_strcmp0(key, "connection_state")) {
-               rule->connection_state = g_variant_get_int32(value);
-               STC_LOGD("connection_state: [%d]", rule->connection_state);
-
        } else {
-               STC_LOGD("Unknown reset rule");
+               STC_LOGD("Unknown reset rule"); //LCOV_EXCL_LINE
        }
 
        __STC_LOG_FUNC_EXIT__;
@@ -163,18 +155,20 @@ void __stc_statistics_app_info_builder_add(GVariantBuilder *builder,
        __STC_LOG_FUNC_ENTER__;
 
        if (!builder || !info) {
-               __STC_LOG_FUNC_EXIT__;
-               return;
+               __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
+               return; //LCOV_EXCL_LINE
        }
 
-       g_variant_builder_add(builder, "{sv}", "app_id",
-                             g_variant_new_string(info->app_id));
+       if (info->app_id)
+               g_variant_builder_add(builder, "{sv}", "app_id",
+                                     g_variant_new_string(info->app_id));
 
-       g_variant_builder_add(builder, "{sv}", "ifname",
-                             g_variant_new_string(info->ifname));
+       if (info->ifname)
+               g_variant_builder_add(builder, "{sv}", "ifname",
+                                     g_variant_new_string(info->ifname));
 
-       g_variant_builder_add(builder, "{sv}", "imsi",
-                             g_variant_new_string(info->imsi));
+       g_variant_builder_add(builder, "{sv}", "subscriber_id",
+                             g_variant_new_string(info->subscriber_id));
 
        g_variant_builder_add(builder, "{sv}", "iftype",
                              g_variant_new_uint16(info->iftype));
@@ -213,8 +207,8 @@ stc_cb_ret_e __table_statistics_foreach_app_cb(const table_statistics_info *info
        GVariantBuilder sub_builder;
 
        if (!info || !builder) {
-               __STC_LOG_FUNC_EXIT__;
-               return STC_CANCEL;
+               __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
+               return STC_CANCEL; //LCOV_EXCL_LINE
        }
 
        g_variant_builder_init(&sub_builder, G_VARIANT_TYPE("a{sv}"));
@@ -232,14 +226,18 @@ stc_cb_ret_e __table_statistics_per_app_cb(const table_statistics_info *info,
 {
        __STC_LOG_FUNC_ENTER__;
        GVariantBuilder *builder = (GVariantBuilder *)user_data;
+       GVariantBuilder sub_builder;
 
        if (!info || !builder) {
-               __STC_LOG_FUNC_EXIT__;
-               return STC_CANCEL;
+               __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
+               return STC_CANCEL; //LCOV_EXCL_LINE
        }
 
-       __stc_statistics_app_info_builder_add(builder, info);
+       g_variant_builder_init(&sub_builder, G_VARIANT_TYPE("a{sv}"));
+       __stc_statistics_app_info_builder_add(&sub_builder, info);
        __stc_statistics_print_app_info(info);
+       g_variant_builder_add_value(builder,
+                                   g_variant_builder_end(&sub_builder));
 
        __STC_LOG_FUNC_EXIT__;
        return STC_CONTINUE;
@@ -258,6 +256,8 @@ gboolean handle_statistics_get_all(StcStatistics *object,
        GVariant *return_parameters = NULL;
        stc_error_e ret;
 
+       stc_set_keep_alive(TRUE);
+
        /* Total statistics since epoch */
        rule.from = epoch;
        rule.to = cur_time;
@@ -275,7 +275,7 @@ gboolean handle_statistics_get_all(StcStatistics *object,
                        g_variant_iter_free(iter);
                }
        } else {
-               STC_LOGD("No selection rule, using default selection rule.");
+               STC_LOGD("No selection rule, using default selection rule."); //LCOV_EXCL_LINE
        }
 
        builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
@@ -284,10 +284,11 @@ gboolean handle_statistics_get_all(StcStatistics *object,
                                           __table_statistics_foreach_app_cb,
                                           builder);
        if (ret < STC_ERROR_NONE) {
-               g_variant_builder_unref(builder);
-               STC_STATISTICS_DBUS_REPLY_ERROR(invocation, ret);
-               __STC_LOG_FUNC_EXIT__;
-               return TRUE;
+               g_variant_builder_unref(builder); //LCOV_EXCL_LINE
+               STC_STATISTICS_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
+               g_free(rule.app_id);
+               __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
+               return TRUE; //LCOV_EXCL_LINE
        }
 
        return_parameters = g_variant_new("(iaa{sv})", STC_ERROR_NONE, builder);
@@ -296,15 +297,18 @@ gboolean handle_statistics_get_all(StcStatistics *object,
        DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
        STC_DBUS_REPLY(invocation, return_parameters);
 
+       g_free(rule.app_id);
        __STC_LOG_FUNC_EXIT__;
        return TRUE;
 }
 
 gboolean handle_statistics_init(StcStatistics *object,
-                              GDBusMethodInvocation *invocation)
+                               GDBusMethodInvocation *invocation)
 {
        __STC_LOG_FUNC_ENTER__;
 
+       stc_set_keep_alive(TRUE);
+
        STC_LOGI("stc statistics initialized");
        stc_statistics_complete_init(object, invocation);
 
@@ -326,6 +330,8 @@ gboolean handle_statistics_get(StcStatistics *object,
        GVariant *return_parameters = NULL;
        stc_error_e ret;
 
+       stc_set_keep_alive(TRUE);
+
        /* Total statistics since epoch */
        rule.from = epoch;
        rule.to = cur_time;
@@ -343,27 +349,29 @@ gboolean handle_statistics_get(StcStatistics *object,
                        g_variant_iter_free(iter);
                }
        } else {
-               STC_LOGD("No selection rule, using default selection rule.");
+               STC_LOGD("No selection rule, using default selection rule."); //LCOV_EXCL_LINE
        }
 
-       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+       builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
 
        ret = table_statistics_per_app(app_id, &rule,
                                       __table_statistics_per_app_cb,
                                       builder);
        if (ret < STC_ERROR_NONE) {
-               g_variant_builder_unref(builder);
-               STC_STATISTICS_DBUS_REPLY_ERROR(invocation, ret);
-               __STC_LOG_FUNC_EXIT__;
-               return TRUE;
+               g_variant_builder_unref(builder); //LCOV_EXCL_LINE
+               STC_STATISTICS_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
+               g_free(rule.app_id);
+               __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
+               return TRUE; //LCOV_EXCL_LINE
        }
 
-       return_parameters = g_variant_new("(ia{sv})", STC_ERROR_NONE, builder);
+       return_parameters = g_variant_new("(iaa{sv})", STC_ERROR_NONE, builder);
        g_variant_builder_unref(builder);
 
        DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
        STC_DBUS_REPLY(invocation, return_parameters);
 
+       g_free(rule.app_id);
        __STC_LOG_FUNC_EXIT__;
        return TRUE;
 }
@@ -378,6 +386,8 @@ gboolean handle_statistics_reset(StcStatistics *object,
        GVariant *return_parameters = NULL;
        stc_error_e ret;
 
+       stc_set_keep_alive(TRUE);
+
        if (reset_rule != NULL) {
                DEBUG_GDBUS_VARIANT("Selection rule: ", reset_rule);
                GVariantIter *iter = NULL;
@@ -390,13 +400,13 @@ gboolean handle_statistics_reset(StcStatistics *object,
                        g_variant_iter_free(iter);
                }
        } else {
-               STC_LOGD("No selection rule, using default selection rule.");
+               STC_LOGD("No selection rule, using default selection rule."); //LCOV_EXCL_LINE
        }
 
        ret = table_statistics_reset(&rule);
        if (ret < STC_ERROR_NONE) {
-               STC_STATISTICS_DBUS_REPLY_ERROR(invocation, ret);
-               goto handle_error;
+               STC_STATISTICS_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
+               goto handle_error; //LCOV_EXCL_LINE
        }
 
        return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
@@ -406,7 +416,7 @@ gboolean handle_statistics_reset(StcStatistics *object,
 
 handle_error:
        FREE(rule.app_id);
-       FREE(rule.imsi);
+       FREE(rule.subscriber_id);
        FREE(rule.interval);
        __STC_LOG_FUNC_EXIT__;
        return TRUE;