//& set: Stc
+static stc_h g_hSTC;
+static bool g_bFeatureSTC;
+static stc_stats_info_e g_eStatsInfo;
+static stc_error_e g_nCallbackRet;
+static stc_stats_rule_h g_hRule;
+
+static GMainLoop *g_pMainLoop;
+static guint g_nTimeoutId;
+
+#define RUN_GMAIN_LOOP {\
+ g_pMainLoop = g_main_loop_new(NULL, false);\
+ g_nTimeoutId = g_timeout_add(GMAINTIMEOUT, stc_callback_timeout, g_pMainLoop);\
+ if (COMMON_DEBUG) {\
+ PRINT_LOG(DLOG_INFO, "NativeTCT", "[Line:%5d][%s] Run mainloop [%p]",\
+ __LINE__, __FUNCTION__, g_pMainLoop);\
+ }\
+ g_main_loop_run(g_pMainLoop);\
+ g_source_remove(g_nTimeoutId);\
+ g_pMainLoop = NULL;\
+}
+
+#define QUIT_GMAIN_LOOP {\
+ if (COMMON_DEBUG) {\
+ PRINT_LOG(DLOG_INFO, "NativeTCT", "[Line:%5d][%s] Quit mainloop [%p]",\
+ __LINE__, __FUNCTION__, g_pMainLoop);\
+ }\
+ g_main_loop_quit(g_pMainLoop);\
+}
+
+gboolean stc_callback_timeout(gpointer data)
+{
+ g_nCallbackRet = STC_ERROR_INVALID_OPERATION;
+ PRINT_RETURN("stc_callback_timeout", g_nCallbackRet);
+ QUIT_GMAIN_LOOP;
+ return false;
+}
+
+stc_callback_ret_e stc_stats_info_callback(stc_error_e result,
+ stc_stats_info_h info, void *user_data)
+{
+ g_nCallbackRet = STC_ERROR_NONE;
+
+ int ret = STC_ERROR_NONE;
+
+ switch(g_eStatsInfo) {
+ case STATS_INFO_APPID:
+ {
+ char *app_id;
+ ret = stc_stats_info_get_app_id(info, &app_id);
+ PRINT_RETURN("stc_stats_info_get_app_id", ret);
+ }
+ break;
+ case STATS_INFO_IFACE_NAME:
+ {
+ char *iface_name;
+ ret = stc_stats_info_get_iface_name(info, &iface_name);
+ PRINT_RETURN("stc_stats_info_get_iface_name", ret);
+ }
+ break;
+ case STATS_INFO_TIME_INTERVAL:
+ {
+ time_t from;
+ time_t to;
+ ret = stc_stats_info_get_time_interval(info, &from, &to);
+ PRINT_RETURN("stc_stats_info_get_time_interval", ret);
+ }
+ break;
+ case STATS_INFO_IFACE_TYPE:
+ {
+ stc_iface_type_e iface_type;
+ ret = stc_stats_info_get_iface_type(info, &iface_type);
+ PRINT_RETURN("stc_stats_info_get_iface_type", ret);
+ }
+ break;
+ case STATS_INFO_COUNTER:
+ {
+ int64_t incoming;
+ int64_t outgoing;
+ ret = stc_stats_info_get_counter(info, &incoming, &outgoing);
+ PRINT_RETURN("stc_stats_info_get_counter", ret);
+ }
+ break;
+ case STATS_INFO_ROAMING_TYPE:
+ {
+ stc_roaming_type_e roaming;
+ ret = stc_stats_info_get_roaming_type(info, &roaming);
+ PRINT_RETURN("stc_stats_info_get_roaming_type", ret);
+ }
+ break;
+ case STATS_INFO_PROTOCOL_TYPE:
+ {
+ stc_protocol_type_e prototype;
+ ret = stc_stats_info_get_protocol_type(info, &prototype);
+ PRINT_RETURN("stc_stats_info_get_protocol_type", ret);
+ }
+ break;
+ case STATS_INFO_PROCESS_STATE:
+ {
+ stc_process_state_e procstate;
+ ret = stc_stats_info_get_process_state(info, &procstate);
+ PRINT_RETURN("stc_stats_info_get_process_state", ret);
+ }
+ break;
+ case STATS_INFO_CLONE:
+ case STATS_INFO_DESTROY:
+ {
+ stc_stats_info_h cloned = NULL;
+ ret = stc_stats_info_clone(info, &cloned);
+ PRINT_RETURN("stc_stats_info_clone", ret);
+ if (ret == STC_ERROR_NONE) {
+ ret = stc_stats_info_destroy(cloned);
+ PRINT_RETURN("stc_stats_info_destroy", ret);
+ }
+ }
+ break;
+ case STATS_INFO_FOREACH_ALL:
+ {
+ PRINT_RETURN("stc_foreach_all_stats", ret);
+ }
+ break;
+ default:
+ PRINT_RETURN("stc_stats_info_callback", ret);
+ break;
+ }
+
+ QUIT_GMAIN_LOOP;
+
+ return STC_CALLBACK_CANCEL;
+}
+
+void stc_get_stats_finished_cb(stc_error_e result,
+ stc_all_stats_info_h info, void *user_data)
+{
+ g_nCallbackRet = STC_ERROR_NONE;
+
+ int ret = STC_ERROR_NONE;
+
+ switch (g_eStatsInfo) {
+ case STATS_INFO_GET_ALL:
+ {
+ PRINT_RETURN("stc_get_all_stats", result);
+ }
+ break;
+ case STATS_INFO_FOREACH_ALL:
+ {
+ ret = stc_foreach_all_stats(info, stc_stats_info_callback, user_data);
+ PRINT_RETURN("stc_foreach_all_stats", ret);
+ }
+ break;
+ default:
+ PRINT_RETURN("stc_get_stats_finished_cb", ret);
+ break;
+ }
+
+ QUIT_GMAIN_LOOP;
+}
+
+stc_error_e stc_get_all_stats_info(stc_stats_info_e e)
+{
+ int ret = STC_ERROR_NONE;
+ time_t from, to;
+
+ ret = stc_stats_rule_set_app_id(g_hRule, STC_ALL_APP);
+ CHECK_RETURN("stc_stats_rule_set_app_id", ret, STC_ERROR_NONE);
+
+ from = stc_make_time(2000, 1, 1, 1, 1);
+ time(&to);
+ ret = stc_stats_rule_set_time_interval(g_hRule, from, to);
+ CHECK_RETURN("stc_stats_rule_set_time_interval", ret, STC_ERROR_NONE);
+
+ g_nCallbackRet = STC_ERROR_OPERATION_FAILED;
+ g_eStatsInfo = e;
+ ret = stc_get_all_stats(g_hSTC, g_hRule, stc_get_stats_finished_cb, NULL);
+ CHECK_RETURN("stc_get_all_stats", ret, STC_ERROR_NONE);
+ RUN_GMAIN_LOOP;
+ CHECK_RETURN(CALLBACK_RETURN, g_nCallbackRet, STC_ERROR_NONE);
+
+ return STC_ERROR_NONE;
+}
+
+stc_error_e stc_get_stats_info(stc_stats_info_e e)
+{
+ int ret = STC_ERROR_NONE;
+ time_t from, to;
+
+ ret = stc_stats_rule_set_app_id(g_hRule, STC_ALL_APP);
+ CHECK_RETURN("stc_stats_rule_set_app_id", ret, STC_ERROR_NONE);
+
+ from = stc_make_time(2000, 1, 1, 1, 1);
+ time(&to);
+ ret = stc_stats_rule_set_time_interval(g_hRule, from, to);
+ CHECK_RETURN("stc_stats_rule_set_time_interval", ret, STC_ERROR_NONE);
+
+ g_nCallbackRet = STC_ERROR_NONE;
+ g_eStatsInfo = e;
+ ret = stc_get_stats(g_hSTC, g_hRule, stc_stats_info_callback, NULL);
+ CHECK_RETURN("stc_get_stats", ret, STC_ERROR_NONE);
+ RUN_GMAIN_LOOP;
+ CHECK_RETURN(CALLBACK_RETURN, g_nCallbackRet, STC_ERROR_NONE);
+
+ return STC_ERROR_NONE;
+}
+
+stc_error_e stc_foreach_stats_info(stc_stats_info_e e)
+{
+ int ret = STC_ERROR_NONE;
+ time_t from, to;
+
+ ret = stc_stats_rule_set_app_id(g_hRule, STC_ALL_APP);
+ CHECK_RETURN("stc_stats_rule_set_app_id", ret, STC_ERROR_NONE);
+
+ from = stc_make_time(2000, 1, 1, 1, 1);
+ time(&to);
+ ret = stc_stats_rule_set_time_interval(g_hRule, from, to);
+ CHECK_RETURN("stc_stats_rule_set_time_interval", ret, STC_ERROR_NONE);
+
+ g_nCallbackRet = STC_ERROR_NONE;
+ g_eStatsInfo = e;
+ ret = stc_foreach_stats(g_hSTC, g_hRule, stc_stats_info_callback, NULL);
+ CHECK_RETURN("stc_foreach_stats", ret, STC_ERROR_NONE);
+ RUN_GMAIN_LOOP;
+ CHECK_RETURN(CALLBACK_RETURN, g_nCallbackRet, STC_ERROR_NONE);
+
+ return STC_ERROR_NONE;
+}
+
void utc_stc_startup(void)
{
int ret = STC_ERROR_NONE;