Add some APIs to get all statistics info 55/200255/10
authorhyunuktak <hyunuk.tak@samsung.com>
Thu, 21 Feb 2019 01:07:11 +0000 (10:07 +0900)
committerhyunuktak <hyunuk.tak@samsung.com>
Mon, 4 Mar 2019 06:50:08 +0000 (15:50 +0900)
Change-Id: I8cfd7f901c56a769630baa1364ea9e09fe884cb7
Signed-off-by: hyunuktak <hyunuk.tak@samsung.com>
include/stc.h
src/include/stc-statistics.h
src/internal/include/stc-event.h
src/internal/include/stc-private.h
src/internal/stc-private.c
src/stc-manager.c
src/stc-statistics.c

index 7cd58c5..80a599e 100755 (executable)
@@ -72,6 +72,12 @@ typedef void *stc_stats_rule_h;
 typedef void *stc_stats_info_h;
 
 /**
+ * @brief All statistics information handle.
+ * @since_tizen 5.5
+ */
+typedef void *stc_all_stats_info_h;
+
+/**
  * @}
  */
 
@@ -246,6 +252,24 @@ typedef stc_callback_ret_e (*stc_stats_info_cb)(
                stc_error_e result, stc_stats_info_h info, void *user_data);
 
 /**
+ * @brief Called when statistics getting is finished.
+ * @since_tizen 5.5
+ *
+ * @param[in] result        The result, one of:\n
+ *   #STC_ERROR_NONE                Successful \n
+ *   #STC_ERROR_INVALID_OPERATION   No reply \n
+ *   #STC_ERROR_OPERATION_FAILED    Operation failed \n
+ *   #STC_ERROR_PERMISSION_DENIED   Access or permission denied
+ * @param[in] info          All statistics information handle
+ * @param[in] user_data     The user data passed from the statistics provider function
+ *
+ * @pre stc_get_all_stats() will invoke this callback.
+ * @see stc_get_all_stats()
+ */
+typedef void (*stc_get_stats_finished_cb)(stc_error_e result,
+               stc_all_stats_info_h info, void *user_data);
+
+/**
  * @}
  */
 
@@ -403,6 +427,70 @@ int stc_foreach_stats(stc_h stc, stc_stats_rule_h rule,
                stc_stats_info_cb info_cb, void *user_data);
 
 /**
+ * @brief Starts to get all statistics information from rule asynchronously.
+ *
+ * @since_tizen 5.5
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/network.get
+ *
+ * @param[in] stc           The STC handle
+ * @param[in] rule          The statistics rule handle
+ * @param[in] finished_cb   The callback is called when getting is finished
+ * @param[in] user_data     The user data passed to the callback function
+ *
+ * @return 0 on success, otherwise a negative error value
+ * @retval #STC_ERROR_NONE                    Successful
+ * @retval #STC_ERROR_OPERATION_FAILED        General error
+ * @retval #STC_ERROR_INVALID_PARAMETER       Invalid parameter
+ * @retval #STC_ERROR_INVALID_OPERATION       Invalid operation
+ * @retval #STC_ERROR_NOT_INITIALIZED         Not initialized
+ * @retval #STC_ERROR_NOT_SUPPORTED           Not supported
+ * @retval #STC_ERROR_PERMISSION_DENIED       Permission denied
+ *
+ * @see stc_h
+ * @see stc_stats_rule_h
+ * @see stc_initialize()
+ * @see stc_stats_rule_create()
+ * @see stc_stats_rule_destroy()
+ * @see stc_stats_rule_set_app_id()
+ * @see stc_stats_rule_set_time_interval()
+ * @see stc_stats_rule_set_iface_type()
+ * @see stc_stats_rule_set_time_period()
+ * @see stc_stats_rule_get_app_id()
+ * @see stc_stats_rule_get_time_interval()
+ * @see stc_stats_rule_get_iface_type()
+ * @see stc_stats_rule_get_time_period()
+ * @see stc_get_stats_finished_cb()
+ * @post This function invokes stc_get_stats_finished_cb().
+ */
+int stc_get_all_stats(stc_h stc, stc_stats_rule_h rule,
+               stc_get_stats_finished_cb finished_cb, void *user_data);
+
+/**
+ * @brief Gets the results of all getting statistics information.
+ *
+ * @since_tizen 5.5
+ *
+ * @param[in] info          All statistics information handle
+ * @param[in] info_cb       The callback is called for each application
+ * @param[in] user_data     The user data passed to the callback function
+ *
+ * @return 0 on success, otherwise a negative error value
+ * @retval #STC_ERROR_NONE                    Successful
+ * @retval #STC_ERROR_OPERATION_FAILED        General error
+ * @retval #STC_ERROR_INVALID_PARAMETER       Invalid parameter
+ * @retval #STC_ERROR_NOT_INITIALIZED         Not initialized
+ * @retval #STC_ERROR_NOT_SUPPORTED           Not supported
+ *
+ * @see stc_get_all_stats()
+ * @see stc_stats_info_cb()
+ * @pre This function needs stc_get_all_stats() before use.
+ * @post This function invokes stc_stats_info_cb().
+ */
+int stc_foreach_all_stats(stc_all_stats_info_h info,
+               stc_stats_info_cb info_cb, void *user_data);
+
+/**
  * @brief Gets the total statistics information by interface type asynchronously.
  * @since_tizen 4.0
  * @privlevel public
index 88cdb2b..94c0275 100755 (executable)
@@ -79,7 +79,10 @@ stc_error_e _stc_stats_check_get_total_rule(
                        stc_stats_rule_h rule);
 
 stc_error_e _stc_stats_get(stc_stats_rule_h rule);
+stc_error_e _stc_stats_foreach(stc_stats_rule_h rule);
 stc_error_e _stc_stats_get_all(stc_stats_rule_h rule);
+stc_error_e _stc_stats_foreach_all(stc_all_stats_info_h info,
+               stc_stats_info_cb info_cb, void *user_data);
 stc_error_e _stc_stats_get_total(stc_stats_rule_h rule);
 
 #ifdef __cplusplus
index 15c6eed..beb9f7a 100755 (executable)
@@ -53,6 +53,7 @@ extern "C" {
 typedef enum {
        STC_EVENT_UNKNOWN,
        STC_EVENT_STATS_GET_RSP,
+       STC_EVENT_STATS_FOREACH_RSP,
        STC_EVENT_STATS_GET_ALL_RSP,
        STC_EVENT_STATS_GET_TOTAL_RSP,
        STC_EVENT_RESTRICTION_GET_RSP,
@@ -66,6 +67,7 @@ typedef enum {
 typedef enum {
        STC_REQUEST_TABLE_UNKNOWN,
        STC_REQUEST_TABLE_STATS_GET,
+       STC_REQUEST_TABLE_STATS_FOREACH,
        STC_REQUEST_TABLE_STATS_GET_ALL,
        STC_REQUEST_TABLE_STATS_GET_TOTAL,
        STC_REQUEST_TABLE_RESTRICTION_GET,
index 7ac0a39..7c35e27 100755 (executable)
@@ -65,6 +65,9 @@ typedef struct {
        stc_stats_info_cb stats_total_cb;
        void *stats_total_user_data;
 
+       stc_get_stats_finished_cb get_stats_finished_cb;
+       void *get_stats_finished_user_data;
+
        stc_restriction_rule_cb restriction_cb;
        void *restriction_user_data;
        stc_restriction_rule_cb restriction_all_cb;
@@ -135,6 +138,8 @@ void _stc_callback_set_stats_info(stc_h stc,
                        stc_stats_info_cb user_cb,      void *user_data);
 void _stc_callback_set_stats_all_info(stc_h stc,
                        stc_stats_info_cb user_cb,      void *user_data);
+void _stc_callback_set_stats_get_all_info(stc_h stc,
+                       stc_get_stats_finished_cb user_cb,      void *user_data);
 void _stc_callback_set_stats_total_info(stc_h stc,
                        stc_stats_info_cb user_cb,      void *user_data);
 
index eeeffa3..49a326f 100755 (executable)
@@ -413,7 +413,7 @@ static void __stc_callback_foreach(stc_event_e e,
                                handle->stats_user_data = NULL;
                        }
                        break;
-               case STC_EVENT_STATS_GET_ALL_RSP:
+               case STC_EVENT_STATS_FOREACH_RSP:
                        if (handle->stats_all_cb) {
                                if (err == STC_ERROR_NONE) {
                                        if (info_data != NULL) {
@@ -436,6 +436,24 @@ static void __stc_callback_foreach(stc_event_e e,
                                handle->stats_all_user_data = NULL;
                        }
                        break;
+               case STC_EVENT_STATS_GET_ALL_RSP:
+                       if (handle->get_stats_finished_cb) {
+                               if (err == STC_ERROR_NONE) {
+                                       if (info_data != NULL) {
+                                               handle->get_stats_finished_cb(err,
+                                                       (stc_all_stats_info_h)info_data,
+                                                       handle->get_stats_finished_user_data);
+                                       } else {
+                                               handle->get_stats_finished_cb(err, NULL, NULL); //LCOV_EXCL_LINE
+                                       }
+                               } else {
+                                       handle->get_stats_finished_cb(err, NULL, NULL); //LCOV_EXCL_LINE
+                               }
+
+                               handle->get_stats_finished_cb = NULL;
+                               handle->get_stats_finished_user_data = NULL;
+                       }
+                       break;
                case STC_EVENT_STATS_GET_TOTAL_RSP:
                        if (handle->stats_total_cb) {
                                if (err == STC_ERROR_NONE) {
@@ -577,6 +595,7 @@ static void __stc_event_cb(stc_event_info_s *event_info, void *user_data)
 
        switch (event_info->event) {
        case STC_EVENT_STATS_GET_RSP:
+       case STC_EVENT_STATS_FOREACH_RSP:
        case STC_EVENT_STATS_GET_ALL_RSP:
        case STC_EVENT_STATS_GET_TOTAL_RSP:
        case STC_EVENT_RESTRICTION_GET_RSP:
@@ -692,6 +711,15 @@ void _stc_callback_set_stats_all_info(stc_h stc,
        handle->stats_all_user_data = user_data;
 }
 
+void _stc_callback_set_stats_get_all_info(stc_h stc,
+                       stc_get_stats_finished_cb user_cb, void *user_data)
+{
+       stc_handle_s *handle = (stc_handle_s *)stc;
+
+       handle->get_stats_finished_cb = user_cb;
+       handle->get_stats_finished_user_data = user_data;
+}
+
 void _stc_callback_set_stats_total_info(stc_h stc,
                        stc_stats_info_cb user_cb,      void *user_data)
 {
index b9c88fc..3995b15 100755 (executable)
@@ -236,6 +236,42 @@ EXPORT_API int stc_foreach_stats(stc_h stc, stc_stats_rule_h rule,
        _stc_callback_set_stats_all_info(stc,
                info_cb, user_data);
 
+       ret = _stc_stats_foreach(rule);
+       if (ret != STC_ERROR_NONE) {
+               STC_LOGE("Failed to request stats all info [%s]", //LCOV_EXCL_LINE
+                       _stc_convert_error_type_to_string(ret));
+               return ret; //LCOV_EXCL_LINE
+       }
+
+       return STC_ERROR_NONE;
+}
+
+int stc_get_all_stats(stc_h stc, stc_stats_rule_h rule,
+               stc_get_stats_finished_cb finished_cb, void *user_data)
+{
+       int ret = STC_ERROR_NONE;
+
+       CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_STC);
+
+       if (!(_stc_handle_check_validity(stc))) {
+               STC_LOGE("Invalid parameter"); //LCOV_EXCL_LINE
+               return STC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
+       }
+
+       if (finished_cb == NULL) {
+               STC_LOGE("Invalid parameter"); //LCOV_EXCL_LINE
+               return STC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
+       }
+
+       ret = _stc_stats_check_get_all_rule(rule);
+       if (ret != STC_ERROR_NONE) {
+               STC_LOGE("Invalid stats rule [%s]", //LCOV_EXCL_LINE
+                       _stc_convert_error_type_to_string(ret));
+               return ret; //LCOV_EXCL_LINE
+       }
+
+       _stc_callback_set_stats_get_all_info(stc, finished_cb, user_data);
+
        ret = _stc_stats_get_all(rule);
        if (ret != STC_ERROR_NONE) {
                STC_LOGE("Failed to request stats all info [%s]", //LCOV_EXCL_LINE
@@ -246,6 +282,24 @@ EXPORT_API int stc_foreach_stats(stc_h stc, stc_stats_rule_h rule,
        return STC_ERROR_NONE;
 }
 
+int stc_foreach_all_stats(stc_all_stats_info_h info,
+               stc_stats_info_cb info_cb, void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_STC);
+
+       if (info == NULL) {
+               STC_LOGE("Invalid parameter"); //LCOV_EXCL_LINE
+               return STC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
+       }
+
+       if (info_cb == NULL) {
+               STC_LOGE("Invalid parameter"); //LCOV_EXCL_LINE
+               return STC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
+       }
+
+       return _stc_stats_foreach_all(info, info_cb, user_data);
+}
+
 EXPORT_API int stc_get_total_stats(stc_h stc, stc_stats_rule_h rule,
                stc_stats_info_cb info_cb, void *user_data)
 {
index d4476ed..5cdac07 100755 (executable)
@@ -72,7 +72,7 @@ static void __stc_stats_init_rule(stc_stats_rule_s *rule)
 
 static void __stc_stats_deinit_rule(stc_stats_rule_h rule)
 {
-       g_free(rule);
+       FREE(rule);
 }
 
 static void __stc_stats_get_make_params(
@@ -328,6 +328,68 @@ static void __stc_stats_get_per_app_id_reply(
        _stc_event_add_client_idle_cb(&event_data, user_data);
 }
 
+static void __stc_stats_foreach_reply(
+                       GObject *source_object, GAsyncResult *res, gpointer user_data)
+{
+       GDBusConnection *conn = NULL;
+       GError *dbus_error = NULL;
+       GVariant *dbus_data = NULL;
+       GVariantIter *iter = NULL;
+       GVariantIter *iter_row = NULL;
+       stc_error_e dbus_result = STC_ERROR_NONE;
+       stc_error_e error = STC_ERROR_NONE;
+       stc_stats_info_s *stats_info = NULL;
+       GSList *stats_list = NULL;
+       stc_event_info_s event_data = { 0, };
+
+       conn = G_DBUS_CONNECTION(source_object);
+       dbus_data = g_dbus_connection_call_finish(conn, res, &dbus_error);
+       if (dbus_error != NULL) {
+               error = _stc_convert_error_string_to_enum(dbus_error->message);
+               g_error_free(dbus_error);
+       }
+
+       if (_stc_event_get_request_table_state(STC_REQUEST_TABLE_STATS_FOREACH))
+               _stc_event_set_request_table_state(STC_REQUEST_TABLE_STATS_FOREACH, false);
+
+       if (error == STC_ERROR_NONE) {
+               g_variant_get(dbus_data, "(iaa{sv})", &dbus_result, &iter);
+
+               while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
+                       stats_info = g_try_malloc0(sizeof(stc_stats_info_s));
+                       if (stats_info != NULL) {
+                               _stc_dbus_dictionary_foreach(iter_row,
+                                       __stc_stats_extract_info_cb, stats_info);
+
+                               __stc_stats_print_info(stats_info);
+
+                               stats_list = g_slist_append(stats_list,
+                                       (stc_stats_info_s *)stats_info);
+
+                               g_variant_iter_free(iter_row);
+                       }
+               }
+               g_variant_iter_free(iter);
+
+               event_data.event = STC_EVENT_STATS_FOREACH_RSP;
+               event_data.info_data = (GSList *)stats_list;
+               event_data.datalength = g_slist_length(stats_list);
+               event_data.error = dbus_result;
+       } else {
+               //LCOV_EXCL_START
+               STC_LOGE("Get stats all response error [%s]",
+                       _stc_convert_error_type_to_string(error));
+
+               event_data.event = STC_EVENT_STATS_FOREACH_RSP;
+               event_data.info_data = NULL;
+               event_data.datalength = 0;
+               event_data.error = error;
+               //LCOV_EXCL_STOP
+       }
+
+       _stc_event_add_client_idle_cb(&event_data, user_data);
+}
+
 static void __stc_stats_get_all_reply(
                        GObject *source_object, GAsyncResult *res, gpointer user_data)
 {
@@ -490,8 +552,44 @@ stc_error_e __stc_stats_get_per_app_id(
        return STC_ERROR_NONE;
 }
 
-stc_error_e __stc_stats_get_all(
-                       stc_stats_rule_h rule)
+stc_error_e __stc_stats_foreach(stc_stats_rule_h rule)
+{
+       GVariant *params = NULL;
+       stc_error_e error = STC_ERROR_NONE;
+
+       STC_RETURN_VAL_IF(
+               _stc_event_get_request_table_state(
+               STC_REQUEST_TABLE_STATS_FOREACH),
+               STC_ERROR_IN_PROGRESS,
+               "Request in progress");
+
+       _stc_event_set_request_table_state(
+               STC_REQUEST_TABLE_STATS_FOREACH, true);
+
+       __stc_stats_get_all_make_params(rule, &params);
+
+       error = _stc_dbus_invoke_method_nonblock(
+               STC_MANAGER_SERVICE,
+               STC_MANAGER_STATS_PATH,
+               STC_MANAGER_STATS_INTERFACE,
+               STC_MANAGER_METHOD_STATS_GET_ALL,
+               params,
+               STC_DBUS_REPLY_TIMEOUT,
+               __stc_stats_foreach_reply,
+               NULL);
+
+       if (error != STC_ERROR_NONE) {
+               STC_LOGE("Failed to invoke dbus method nonblock"); //LCOV_EXCL_LINE
+
+               _stc_event_set_request_table_state( //LCOV_EXCL_LINE
+                       STC_REQUEST_TABLE_STATS_FOREACH, false);
+               return error; //LCOV_EXCL_LINE
+       }
+
+       return STC_ERROR_NONE;
+}
+
+stc_error_e __stc_stats_get_all(stc_stats_rule_h rule)
 {
        GVariant *params = NULL;
        stc_error_e error = STC_ERROR_NONE;
@@ -528,8 +626,7 @@ stc_error_e __stc_stats_get_all(
        return STC_ERROR_NONE;
 }
 
-stc_error_e __stc_stats_get_total(
-                       stc_stats_rule_h rule)
+stc_error_e __stc_stats_get_total(stc_stats_rule_h rule)
 {
        GVariant *params = NULL;
        stc_error_e error = STC_ERROR_NONE;
@@ -639,6 +736,15 @@ stc_error_e _stc_stats_get(stc_stats_rule_h rule)
        return __stc_stats_get_per_app_id(rule);
 }
 
+stc_error_e _stc_stats_foreach(stc_stats_rule_h rule)
+{
+       STC_RETURN_VAL_IF(_stc_event_get_ref_count() < 1,
+               STC_ERROR_NOT_INITIALIZED,
+               "Event callback is not registered");
+
+       return __stc_stats_foreach(rule);
+}
+
 stc_error_e _stc_stats_get_all(stc_stats_rule_h rule)
 {
        STC_RETURN_VAL_IF(_stc_event_get_ref_count() < 1,
@@ -648,6 +754,30 @@ stc_error_e _stc_stats_get_all(stc_stats_rule_h rule)
        return __stc_stats_get_all(rule);
 }
 
+stc_error_e _stc_stats_foreach_all(stc_all_stats_info_h info,
+               stc_stats_info_cb info_cb, void *user_data)
+{
+       GSList *list;
+       stc_callback_ret_e ret = STC_CALLBACK_CANCEL;
+       GSList *stats_list = (GSList *)info;
+
+       if (g_slist_length(stats_list) == 0) {
+               STC_LOGD("There is no stats info");
+               return STC_ERROR_NONE;
+       }
+
+       for (list = stats_list; list; list = list->next) {
+               stc_stats_info_s *stats_info = (stc_stats_info_s *)list->data;
+               STC_LOGD("App id[%s] Ifname[%s] Sub id[%s] Roaming[%u]", stats_info->app_id,
+                       stats_info->iface_name, stats_info->subscriber_id, stats_info->roaming_type);
+               ret = info_cb(STC_ERROR_NONE, (stc_stats_info_h)stats_info, user_data);
+               if (ret == STC_CALLBACK_CANCEL)
+                       break;
+       }
+
+       return STC_ERROR_NONE;
+}
+
 stc_error_e _stc_stats_get_total(stc_stats_rule_h rule)
 {
        STC_RETURN_VAL_IF(_stc_event_get_ref_count() < 1,