#include <glib.h>
#include <glib-object.h>
+#include <gio/gio.h>
#include <stc.h>
#include <stc_internal.h>
#include "stc_test.h"
#include "stc_menu.h"
+#define NETCONFIG_SERVICE "net.netconfig"
+#define NETCONFIG_NETWORK_PATH "/net/netconfig/network"
+#define NETCONFIG_BATTERY_INTERFACE NETCONFIG_SERVICE ".battery"
+#define NETCONFIG_BATTERY_GET_DN "GetBatteryDnList"
+#define NETCONFIG_BATTERY_GET_WIFI "GetBatteryWifiList"
+
+#define BATTERY_DBUS_REPLY_TIMEOUT (15 * 1000)
+
+#define BATTERY_ATM_LIST "atm_list"
+#define BATTERY_ATM_APP_ID "atm_app_id"
+#define BATTERY_ATM_RX "atm_rx"
+#define BATTERY_ATM_TX "atm_tx"
+
+#define BATTERY_DN_TIME_LEVEL_0 "time_level_0"
+#define BATTERY_DN_TIME_LEVEL_1 "time_level_1"
+#define BATTERY_DN_TIME_LEVEL_2 "time_level_2"
+#define BATTERY_DN_TIME_LEVEL_3 "time_level_3"
+#define BATTERY_DN_TIME_LEVEL_4 "time_level_4"
+#define BATTERY_DN_TIME_LEVEL_5 "time_level_5"
+#define BATTERY_DN_TIME_LEVEL_6 "time_level_6"
+
+#define BATTERY_WIFI_TIME_LEVEL_0 "time_level_0"
+#define BATTERY_WIFI_TIME_LEVEL_1 "time_level_1"
+#define BATTERY_WIFI_TIME_LEVEL_2 "time_level_2"
+#define BATTERY_WIFI_TIME_LEVEL_3 "time_level_3"
+#define BATTERY_WIFI_TIME_LEVEL_4 "time_level_4"
+#define BATTERY_WIFI_START_TIME "start_time"
+#define BATTERY_WIFI_END_TIME "end_time"
+#define BATTERY_WIFI_SCAN_TIME "scan_time"
+
typedef struct {
char *app_id;
uint time;
uint scan_time;
GSList *atm_list;
GSList *data_list;
-\r} battery_wifi_data_s;
-
-typedef void *bm_data_h;
-typedef enum {
- BM_DATA_TYPE_BLE,
- BM_DATA_TYPE_WIFI,
- BM_DATA_TYPE_CPU,
- BM_DATA_TYPE_DISPLAY,
- BM_DATA_TYPE_DEVICE_NETWORK,
- BM_DATA_TYPE_GPS_SENSOR,
- BM_DATA_TYPE_HRM_SENSOR,
- BM_DATA_TYPE_BATTERY,
- BM_DATA_TYPE_MAX,
-} bm_plugin_data_type_e;
+} battery_wifi_data_s;
-typedef struct {
- int (*init) (void);
- int (*deinit) (void);
- int (*get_feature_data) (bm_data_h *, bm_plugin_data_type_e);
-} netconfig_bm_plugin_s;
+typedef void (*dbus_dict_cb) (const char *key, GVariant *value, void *user_data);
+
+static void __dbus_dictionary_foreach(GVariantIter *iter,
+ dbus_dict_cb cb, void *user_data)
+{
+ char *key = NULL;
+ GVariant *value = NULL;
+
+ if (!cb)
+ return;
-#define NETCONFIG_PLUGIN_DN_FILEPATH "/usr/lib/net-config-plugin-bm-dn.so"
-#define NETCONFIG_PLUGIN_WIFI_FILEPATH "/usr/lib/net-config-plugin-bm-wifi.so"
+ while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
+ if (key)
+ cb(key, value, user_data);
+ }
+}
-static void *handle_plugin_dn;
-static void *handle_plugin_wifi;
+static GVariant *__dbus_invoke_method(const char *dest, const char *path,
+ const char *interface_name, const char *method, GVariant *params)
+{
-static netconfig_bm_plugin_s *netconfig_plugin_dn;
-static netconfig_bm_plugin_s *netconfig_plugin_wifi;
+ GError *error = NULL;
+ GVariant *reply = NULL;
+ GDBusConnection *connection;
-static gboolean netconfig_plugin_dn_enabled = FALSE;
-static gboolean netconfig_plugin_wifi_enabled = FALSE;
+ connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+ if (connection == NULL) {
+ msg("failed to get dbus connection");
+ return reply;
+ }
-static int __test_stc_battery_dn_get_data(MManager *mm, struct menu_data *menu)
+ reply = g_dbus_connection_call_sync(
+ connection,
+ dest,
+ path,
+ interface_name,
+ method,
+ params,
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ BATTERY_DBUS_REPLY_TIMEOUT,
+ NULL,
+ &error);
+
+ g_object_unref(connection);
+
+ if (reply == NULL) {
+ if (error != NULL) {
+ msg("failed to call dbus method, error [%d: %s]", error->code, error->message);
+ g_error_free(error);
+ } else {
+ msg("failed to call dbus method");
+ }
+
+ return NULL;
+ }
+
+ return reply;
+}
+
+static void __extract_app_data(const char *key, GVariant *value, void *user_data)
{
- bm_data_h data;
+ battery_app_data_s *app_data = (battery_app_data_s *)user_data;
+
+ if (app_data == NULL)
+ return;
+
+ if (!g_strcmp0(key, BATTERY_ATM_APP_ID)) {
+ const char *app_id = g_variant_get_string(value, NULL);
+ app_data->app_id = g_strdup(app_id);
+ } else if (!g_strcmp0(key, BATTERY_ATM_RX)) {
+ app_data->rx = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_ATM_TX)) {
+ app_data->tx = g_variant_get_uint32(value);
+ }
+}
- if (!netconfig_plugin_dn_enabled)
- return STC_ERROR_NOT_INITIALIZED;
+static void __extract_dn_data(const char *key, GVariant *value, void *user_data)
+{
+ battery_dn_data_s *dn_data = (battery_dn_data_s *)user_data;
+
+ if (dn_data == NULL)
+ return;
+
+ if (!g_strcmp0(key, BATTERY_DN_TIME_LEVEL_0)) {
+ dn_data->time_level_0 = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_DN_TIME_LEVEL_1)) {
+ dn_data->time_level_1 = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_DN_TIME_LEVEL_2)) {
+ dn_data->time_level_2 = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_DN_TIME_LEVEL_3)) {
+ dn_data->time_level_3 = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_DN_TIME_LEVEL_4)) {
+ dn_data->time_level_4 = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_DN_TIME_LEVEL_5)) {
+ dn_data->time_level_5 = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_DN_TIME_LEVEL_6)) {
+ dn_data->time_level_6 = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_ATM_LIST)) {
+ GVariant *list_value = NULL;
+ GVariantIter *iter = NULL;
+ GVariantIter *iter_row = NULL;
+
+ g_variant_get(value, "v", &list_value);
+ g_variant_get(list_value, "aa{sv}", &iter);
+
+ while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
+ battery_app_data_s *app_data = g_try_malloc0(sizeof(battery_app_data_s));
+ if (app_data != NULL) {
+ __dbus_dictionary_foreach(iter_row, __extract_app_data, app_data);
+ dn_data->atm_list = g_slist_append(dn_data->atm_list, app_data);
+ }
+
+ g_variant_iter_free(iter_row);
+ }
- netconfig_plugin_dn->get_feature_data(&data, 0);
+ g_variant_iter_free(iter);
+ }
+}
+
+static void __extract_wifi_data(const char *key, GVariant *value, void *user_data)
+{
+ battery_wifi_data_s *wifi_data = (battery_wifi_data_s *)user_data;
+
+ if (wifi_data == NULL)
+ return;
+
+ if (!g_strcmp0(key, BATTERY_WIFI_TIME_LEVEL_0)) {
+ wifi_data->time_level_0 = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_WIFI_TIME_LEVEL_1)) {
+ wifi_data->time_level_1 = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_WIFI_TIME_LEVEL_2)) {
+ wifi_data->time_level_2 = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_WIFI_TIME_LEVEL_3)) {
+ wifi_data->time_level_3 = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_WIFI_TIME_LEVEL_4)) {
+ wifi_data->time_level_4 = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_WIFI_START_TIME)) {
+ wifi_data->start_time = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_WIFI_END_TIME)) {
+ wifi_data->end_time = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_WIFI_SCAN_TIME)) {
+ wifi_data->scan_time = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, BATTERY_ATM_LIST)) {
+ GVariant *list_value = NULL;
+ GVariantIter *iter = NULL;
+ GVariantIter *iter_row = NULL;
+
+ g_variant_get(value, "v", &list_value);
+ g_variant_get(list_value, "aa{sv}", &iter);
+
+ while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
+ battery_app_data_s *app_data = g_try_malloc0(sizeof(battery_app_data_s));
+ if (app_data != NULL) {
+ __dbus_dictionary_foreach(iter_row, __extract_app_data, app_data);
+ wifi_data->atm_list = g_slist_append(wifi_data->atm_list, app_data);
+ }
+
+ g_variant_iter_free(iter_row);
+ }
+
+ g_variant_iter_free(iter);
+ }
+}
+
+stc_error_e __battery_get_dn_data(battery_dn_data_s **handle)
+{
+ GVariant *message = NULL;
+ GVariantIter *iter = NULL;
+ GVariantIter *iter_row = NULL;
+ battery_dn_data_s *dn_list = NULL;
+ battery_dn_data_s *curr_dn_data = NULL;
+
+ message = __dbus_invoke_method(NETCONFIG_SERVICE,
+ NETCONFIG_NETWORK_PATH, NETCONFIG_BATTERY_INTERFACE,
+ NETCONFIG_BATTERY_GET_DN, NULL);
+
+ if (message == NULL)
+ return STC_ERROR_OPERATION_FAILED;
+
+ g_variant_get(message, "(aa{sv})", &iter);
+
+ while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
+ battery_dn_data_s *dn_data = g_try_malloc0(sizeof(battery_dn_data_s));
+ if (dn_data != NULL) {
+ __dbus_dictionary_foreach(iter_row, __extract_dn_data, dn_data);
+
+ if (dn_list == NULL) {
+ dn_list = dn_data;
+ curr_dn_data = dn_data;
+ } else {
+ curr_dn_data->data_list = g_slist_append(curr_dn_data->data_list, dn_data);
+ curr_dn_data = dn_data;
+ }
+ }
+ g_variant_iter_free(iter_row);
+ }
- battery_dn_data_s *dn_data = (battery_dn_data_s *)data;
+ g_variant_iter_free(iter);
+ g_variant_unref(message);
- msg(HR_SINGLE);
+ *handle = dn_list;
+
+ return STC_ERROR_NONE;
+}
+
+stc_error_e __battery_get_wifi_data(battery_wifi_data_s **handle)
+{
+ GVariant *message = NULL;
+ GVariantIter *iter = NULL;
+ GVariantIter *iter_row = NULL;
+ battery_wifi_data_s *wifi_list = NULL;
+ battery_wifi_data_s *curr_wifi_data = NULL;
+
+ message = __dbus_invoke_method(NETCONFIG_SERVICE,
+ NETCONFIG_NETWORK_PATH, NETCONFIG_BATTERY_INTERFACE,
+ NETCONFIG_BATTERY_GET_WIFI, NULL);
+
+ if (message == NULL)
+ return STC_ERROR_OPERATION_FAILED;
+
+ g_variant_get(message, "(aa{sv})", &iter);
+
+ while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
+ battery_wifi_data_s *wifi_data = g_try_malloc0(sizeof(battery_wifi_data_s));
+ if (wifi_data != NULL) {
+ __dbus_dictionary_foreach(iter_row, __extract_wifi_data, wifi_data);
+
+ if (wifi_list == NULL) {
+ wifi_list = wifi_data;
+ curr_wifi_data = wifi_data;
+ } else {
+ curr_wifi_data->data_list = g_slist_append(curr_wifi_data->data_list, wifi_data);
+ curr_wifi_data = wifi_data;
+ }
+ }
+ g_variant_iter_free(iter_row);
+ }
+
+ g_variant_iter_free(iter);
+ g_variant_unref(message);
+
+ *handle = wifi_list;
+
+ return STC_ERROR_NONE;
+}
+
+static void __battery_print_dn_data(battery_dn_data_s *dn_data)
+{
+ msg("===============================================================");
while (dn_data != NULL) {
GSList *atm_list = NULL;
GSList *data_list = NULL;
- msg("[DN] rssi[%d/%d/%d/%d/%d/%d/%d]",
+ msg("device network rssi[%d/%d/%d/%d/%d/%d/%d]",
dn_data->time_level_0, dn_data->time_level_1, dn_data->time_level_2,
dn_data->time_level_3, dn_data->time_level_4, dn_data->time_level_5,
dn_data->time_level_6);
for (atm_list = dn_data->atm_list; atm_list != NULL; atm_list = atm_list->next) {
battery_app_data_s *app_data = (battery_app_data_s *)atm_list->data;
- msg("[DN] app_id[%s] rx[%d] tx[%d]", app_data->app_id, app_data->rx, app_data->tx);
+ msg("app_id[%s] rx[%d] tx[%d]", app_data->app_id, app_data->rx, app_data->tx);
}
- msg(HR_SINGLE);
+ msg("===============================================================");
if (dn_data->data_list == NULL)
break;
data_list = dn_data->data_list;
dn_data = (battery_dn_data_s *)data_list->data;
}
-
- return STC_ERROR_NONE;
}
-static int __test_stc_battery_wifi_get_data(MManager *mm, struct menu_data *menu)
+static void __battery_print_wifi_data(battery_wifi_data_s *wifi_data)
{
- bm_data_h data;
-
- if (!netconfig_plugin_wifi_enabled)
- return STC_ERROR_NOT_INITIALIZED;
-
- netconfig_plugin_wifi->get_feature_data(&data, 0);
-
- battery_wifi_data_s *wifi_data = (battery_wifi_data_s *)data;
-
- msg(HR_SINGLE);
+ msg("===============================================================");
while (wifi_data != NULL) {
GSList *atm_list = NULL;
GSList *data_list = NULL;
- msg("[Wi-Fi] start[%ld] end[%ld] scan[%d] rssi[%d/%d/%d/%d/%d]",
+ msg("wifi start[%ld] end[%ld] scan[%d] rssi[%d/%d/%d/%d/%d]",
wifi_data->start_time, wifi_data->end_time, wifi_data->scan_time,
wifi_data->time_level_0, wifi_data->time_level_1, wifi_data->time_level_2,
wifi_data->time_level_3, wifi_data->time_level_4);
for (atm_list = wifi_data->atm_list; atm_list != NULL; atm_list = atm_list->next) {
battery_app_data_s *app_data = (battery_app_data_s *)atm_list->data;
- msg("[Wi-Fi] app_id[%s] rx[%d] tx[%d]", app_data->app_id, app_data->rx, app_data->tx);
+ msg("app_id[%s] rx[%d] tx[%d]", app_data->app_id, app_data->rx, app_data->tx);
}
- msg(HR_SINGLE);
+ msg("===============================================================");
if (wifi_data->data_list == NULL)
break;
data_list = wifi_data->data_list;
wifi_data = (battery_wifi_data_s *)data_list->data;
}
-
- return STC_ERROR_NONE;
-}
-
-int test_stc_battery_dn_init(void)
-{
- handle_plugin_dn = dlopen(NETCONFIG_PLUGIN_DN_FILEPATH, RTLD_NOW);
- if (!handle_plugin_dn) {
- msg("Can't load %s: %s", NETCONFIG_PLUGIN_DN_FILEPATH, dlerror());
- return STC_ERROR_NOT_INITIALIZED;
- }
-
- netconfig_plugin_dn = dlsym(handle_plugin_dn, "netconfig_bm_dn_plugin");
- if (!netconfig_plugin_dn) {
- msg("Can't load symbol: %s", dlerror());
- dlclose(handle_plugin_dn);
- return STC_ERROR_NOT_INITIALIZED;
- }
-
- netconfig_plugin_dn->init();
- netconfig_plugin_dn_enabled = TRUE;
-
- return STC_ERROR_NONE;
-}
-
-int test_stc_battery_dn_deinit(void)
-{
- if (!netconfig_plugin_dn_enabled)
- return STC_ERROR_NOT_INITIALIZED;
-
- netconfig_plugin_dn->deinit();
- netconfig_plugin_dn_enabled = FALSE;
- dlclose(netconfig_plugin_dn);
-
- return STC_ERROR_NONE;
}
-int test_stc_battery_wifi_init(void)
+static int __test_battery_get_dn(MManager *mm, struct menu_data *menu)
{
- handle_plugin_wifi = dlopen(NETCONFIG_PLUGIN_WIFI_FILEPATH, RTLD_NOW);
- if (!handle_plugin_wifi) {
- msg("Can't load %s: %s", NETCONFIG_PLUGIN_WIFI_FILEPATH, dlerror());
- return STC_ERROR_NOT_INITIALIZED;
- }
+ int ret;
+ battery_dn_data_s *dn_data;
- netconfig_plugin_wifi = dlsym(handle_plugin_wifi, "netconfig_bm_wifi_plugin");
- if (!netconfig_plugin_wifi) {
- msg("Can't load symbol: %s", dlerror());
- dlclose(handle_plugin_wifi);
- return STC_ERROR_NOT_INITIALIZED;
- }
-
- netconfig_plugin_wifi->init();
- netconfig_plugin_wifi_enabled = TRUE;
+ ret = __battery_get_dn_data(&dn_data);
+ if (ret == STC_ERROR_NONE)
+ __battery_print_dn_data(dn_data);
- return STC_ERROR_NONE;
+ return ret;
}
-int test_stc_battery_wifi_deinit(void)
+static int __test_battery_get_wifi(MManager *mm, struct menu_data *menu)
{
- if (!netconfig_plugin_wifi_enabled)
- return STC_ERROR_NOT_INITIALIZED;
+ int ret;
+ battery_wifi_data_s *wifi_data;
- netconfig_plugin_wifi->deinit();
- netconfig_plugin_wifi_enabled = FALSE;
- dlclose(netconfig_plugin_wifi);
+ ret = __battery_get_wifi_data(&wifi_data);
+ if (ret == STC_ERROR_NONE)
+ __battery_print_wifi_data(wifi_data);
- return STC_ERROR_NONE;
+ return ret;
}
struct menu_data menu_battery[] = {
- { "1", LOG_LIGHTBLUE "[Get]" LOG_END " DN", NULL, __test_stc_battery_dn_get_data, NULL},
- { "2", LOG_LIGHTBLUE "[Get]" LOG_END " Wi-Fi", NULL, __test_stc_battery_wifi_get_data, NULL},
+ { "1", LOG_LIGHTBLUE "[Get]" LOG_END " Device network", NULL, __test_battery_get_dn, NULL},
+ { "2", LOG_LIGHTBLUE "[Get]" LOG_END " Wi-Fi", NULL, __test_battery_get_wifi, NULL},
{ NULL, NULL, },
};