typedef void *stc_stats_info_h;
/**
+ * @brief All statistics information handle.
+ * @since_tizen 5.5
+ */
+typedef void *stc_all_stats_info_h;
+
+/**
* @}
*/
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);
+
+/**
* @}
*/
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
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
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,
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,
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;
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);
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) {
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) {
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:
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)
{
_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
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)
{
static void __stc_stats_deinit_rule(stc_stats_rule_h rule)
{
- g_free(rule);
+ FREE(rule);
}
static void __stc_stats_get_make_params(
_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)
{
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;
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;
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,
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,