From: hyunuktak Date: Thu, 21 Feb 2019 01:07:11 +0000 (+0900) Subject: Add some APIs to get all statistics info X-Git-Tag: submit/tizen/20190311.084912~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F55%2F200255%2F10;p=platform%2Fcore%2Fapi%2Fsmart-traffic-control.git Add some APIs to get all statistics info Change-Id: I8cfd7f901c56a769630baa1364ea9e09fe884cb7 Signed-off-by: hyunuktak --- diff --git a/include/stc.h b/include/stc.h index 7cd58c5..80a599e 100755 --- a/include/stc.h +++ b/include/stc.h @@ -71,6 +71,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; + /** * @} */ @@ -245,6 +251,24 @@ typedef enum { 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); + /** * @} */ @@ -402,6 +426,70 @@ int stc_get_stats(stc_h stc, stc_stats_rule_h rule, 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 diff --git a/src/include/stc-statistics.h b/src/include/stc-statistics.h index 88cdb2b..94c0275 100755 --- a/src/include/stc-statistics.h +++ b/src/include/stc-statistics.h @@ -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 diff --git a/src/internal/include/stc-event.h b/src/internal/include/stc-event.h index 15c6eed..beb9f7a 100755 --- a/src/internal/include/stc-event.h +++ b/src/internal/include/stc-event.h @@ -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, diff --git a/src/internal/include/stc-private.h b/src/internal/include/stc-private.h index 7ac0a39..7c35e27 100755 --- a/src/internal/include/stc-private.h +++ b/src/internal/include/stc-private.h @@ -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); diff --git a/src/internal/stc-private.c b/src/internal/stc-private.c index eeeffa3..49a326f 100755 --- a/src/internal/stc-private.c +++ b/src/internal/stc-private.c @@ -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) { diff --git a/src/stc-manager.c b/src/stc-manager.c index b9c88fc..3995b15 100755 --- a/src/stc-manager.c +++ b/src/stc-manager.c @@ -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) { diff --git a/src/stc-statistics.c b/src/stc-statistics.c index d4476ed..5cdac07 100755 --- a/src/stc-statistics.c +++ b/src/stc-statistics.c @@ -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, ¶ms); + + 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,