Add support for Tethering data monitoring and data restriction rules
[platform/core/connectivity/stc-manager.git] / src / stc-statistics.c
index a2a72fd..f2ff8e9 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"
 };
 
@@ -48,8 +47,8 @@ void __stc_statistics_print_app_info(const table_statistics_info *info)
        STC_LOGD("========== App data (Statistics) ==========");
        STC_LOGD("app_id   : [%s]", info->app_id ? info->app_id : "NULL");
        STC_LOGD("ifname   : [%s]", info->ifname ? info->ifname : "NULL");
-       STC_LOGD("Sent     : [%llu] bytes", info->cnt.out_bytes);
-       STC_LOGD("Received : [%llu] bytes", info->cnt.in_bytes);
+       STC_LOGD("Sent     : [%lld] bytes", info->cnt.out_bytes);
+       STC_LOGD("Received : [%lld] bytes", info->cnt.in_bytes);
        STC_LOGD("===========================================");
 }
 
@@ -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,8 @@ 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, "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 +91,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 +111,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 +123,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 +146,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));
@@ -188,10 +173,10 @@ void __stc_statistics_app_info_builder_add(GVariantBuilder *builder,
        }
 
        g_variant_builder_add(builder, "{sv}", "cnt_out_bytes",
-                             g_variant_new_uint64(info->cnt.out_bytes));
+                             g_variant_new_int64(info->cnt.out_bytes));
 
        g_variant_builder_add(builder, "{sv}", "cnt_in_bytes",
-                             g_variant_new_uint64(info->cnt.in_bytes));
+                             g_variant_new_int64(info->cnt.in_bytes));
 
        g_variant_builder_add(builder, "{sv}", "roaming",
                              g_variant_new_uint16(info->roaming));
@@ -213,8 +198,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 +217,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;
@@ -275,7 +264,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 +273,10 @@ 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
+               __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
+               return TRUE; //LCOV_EXCL_LINE
        }
 
        return_parameters = g_variant_new("(iaa{sv})", STC_ERROR_NONE, builder);
@@ -300,6 +289,18 @@ gboolean handle_statistics_get_all(StcStatistics *object,
        return TRUE;
 }
 
+gboolean handle_statistics_init(StcStatistics *object,
+                              GDBusMethodInvocation *invocation)
+{
+       __STC_LOG_FUNC_ENTER__;
+
+       STC_LOGI("stc statistics initialized");
+       stc_statistics_complete_init(object, invocation);
+
+       __STC_LOG_FUNC_EXIT__;
+       return TRUE;
+}
+
 gboolean handle_statistics_get(StcStatistics *object,
                               GDBusMethodInvocation *invocation,
                               const gchar *app_id,
@@ -331,22 +332,22 @@ 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
+               __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);
@@ -378,13 +379,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);
@@ -394,7 +395,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;