From 5cc540a651f7ca00edcfc0df492ac12cd8585f28 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Tue, 23 Apr 2013 17:05:24 +0900 Subject: [PATCH] Revise signal handler for Wi-Fi powered event from ConnMan Change-Id: I045a1c8a73b0d42e6879bade8e91374d1c33f6e6 --- include/netdbus.h | 3 +- packaging/net-config.spec | 2 +- src/dbus/netdbus.c | 43 +++++++++------------------- src/signal-handler.c | 73 +++++++++++++++-------------------------------- src/wifi-state.c | 18 ++++++++++-- 5 files changed, 55 insertions(+), 84 deletions(-) diff --git a/include/netdbus.h b/include/netdbus.h index af816d9..b6544e0 100644 --- a/include/netdbus.h +++ b/include/netdbus.h @@ -41,6 +41,7 @@ extern "C" { #define CONNMAN_WIFI_SERVICE_PROFILE_PREFIX CONNMAN_PATH "/service/wifi_" #define CONNMAN_ETHERNET_SERVICE_PROFILE_PREFIX CONNMAN_PATH "/service/ethernet_" #define CONNMAN_BLUETOOTH_SERVICE_PROFILE_PREFIX CONNMAN_PATH "/service/bluetooth_" +#define CONNMAN_CELLULAR_TECHNOLOGY_PREFIX CONNMAN_PATH "/technology/cellular" #define CONNMAN_WIFI_TECHNOLOGY_PREFIX CONNMAN_PATH "/technology/wifi" #define NETCONFIG_WIFI_INTERFACE "net.netconfig.wifi" @@ -63,7 +64,7 @@ char *netconfig_wifi_get_connected_service_name(DBusMessage *message); DBusMessage *netconfig_invoke_dbus_method(const char *dest, const char *path, const char *interface_name, const char *method, char *param_array[]); gboolean netconfig_dbus_get_basic_params_string(DBusMessage *message, - char **key, void **value); + char **key, int type, void *value); gboolean netconfig_dbus_get_basic_params_array(DBusMessage *message, char **key, void **value); diff --git a/packaging/net-config.spec b/packaging/net-config.spec index 116d0d1..b2048b8 100644 --- a/packaging/net-config.spec +++ b/packaging/net-config.spec @@ -1,6 +1,6 @@ Name: net-config Summary: TIZEN Network Configuration Module -Version: 0.1.90_18 +Version: 0.1.90_19 Release: 1 Group: System/Network License: Apache License Version 2.0 diff --git a/src/dbus/netdbus.c b/src/dbus/netdbus.c index e0f7be1..9db6c19 100644 --- a/src/dbus/netdbus.c +++ b/src/dbus/netdbus.c @@ -185,49 +185,32 @@ static gboolean __netconfig_dbus_append_param( } gboolean netconfig_dbus_get_basic_params_string(DBusMessage *message, - char **key, void **value) + char **key, int type, void *value) { - DBusMessageIter args, variant; - int type = 0; + DBusMessageIter iter, iter_variant; - if (key == NULL) - return FALSE; - - /* read parameters */ - if (dbus_message_iter_init(message, &args) == FALSE) { - DBG("Message does not have parameters"); - return FALSE; - } - - if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_STRING) { - DBG("Argument type %d", dbus_message_iter_get_arg_type(&args)); + dbus_message_iter_init(message, &iter); + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) { + DBG("Argument type %d", dbus_message_iter_get_arg_type(&iter)); return FALSE; } - dbus_message_iter_get_basic(&args, key); + dbus_message_iter_get_basic(&iter, key); if (value == NULL) return TRUE; - dbus_message_iter_next(&args); - - if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_VARIANT) { - DBG("Argument type %d", dbus_message_iter_get_arg_type(&args)); + dbus_message_iter_next(&iter); + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) { + DBG("Argument type %d", dbus_message_iter_get_arg_type(&iter)); return TRUE; } - dbus_message_iter_recurse(&args, &variant); + dbus_message_iter_recurse(&iter, &iter_variant); + if (dbus_message_iter_get_arg_type(&iter_variant) != type) + return FALSE; - type = dbus_message_iter_get_arg_type(&variant); - if (type == DBUS_TYPE_STRING) - dbus_message_iter_get_basic(&variant, value); - else if (type == DBUS_TYPE_BYTE || type == DBUS_TYPE_BOOLEAN || - type == DBUS_TYPE_INT16 || type == DBUS_TYPE_UINT16 || - type == DBUS_TYPE_INT32 || type == DBUS_TYPE_UINT32 || - type == DBUS_TYPE_DOUBLE) - dbus_message_iter_get_basic(&variant, *value); - else - DBG("Argument type %d", type); + dbus_message_iter_get_basic(&iter_variant, value); return TRUE; } diff --git a/src/signal-handler.c b/src/signal-handler.c index 3c0d781..822a7ba 100644 --- a/src/signal-handler.c +++ b/src/signal-handler.c @@ -83,46 +83,37 @@ static char *__netconfig_get_property(DBusMessage *msg, int *prop_value) return property; } -static void __netconfig_wifi_technology_state_signal_handler( - const char *property, int prop_value) +static void __netconfig_technology_signal_handler(DBusMessage *msg) { - static int previous_technology_state = FALSE; - GError **error = NULL; + char *key = NULL; + const char *tech = NULL; + dbus_bool_t value = FALSE; - if (property == NULL || g_str_equal(property, "Powered") != TRUE) + if (netconfig_dbus_get_basic_params_string(msg, + &key, DBUS_TYPE_BOOLEAN, &value) != TRUE) return; - if (previous_technology_state == prop_value) { - INFO("Same as previous state"); + tech = dbus_message_get_path(msg); + if (key == NULL || tech == NULL) return; - } - - previous_technology_state = prop_value; - - INFO("Technology property - [%s], prop_value - [%d]", - property, prop_value); - if (prop_value == FALSE) { - enum netconfig_wifi_tech_state state = NETCONFIG_WIFI_TECH_OFF; + if (g_str_has_prefix(tech, CONNMAN_WIFI_TECHNOLOGY_PREFIX) == TRUE) { + INFO("Wi-Fi Technology %s, property %d", key, value); - state = netconfig_wifi_get_technology_state(); - INFO("Wi-Fi technology state: %d", state); - - if (NETCONFIG_WIFI_TECH_OFF == state || - NETCONFIG_WIFI_TECH_UNKNOWN == state) { - if (netconfig_wifi_remove_driver() == TRUE) { + if (g_strcmp0(key, "Powered") == 0) { + /* Power state */ + if (value == TRUE) + netconfig_wifi_update_power_state(TRUE); + else netconfig_wifi_update_power_state(FALSE); - - netconfig_wifi_notify_power_completed(FALSE); - } else { - netconfig_error_wifi_driver_failed(error); - } + } else if (g_strcmp0(key, "Connected") == 0) { + /* Connection state */ + } else if (g_strcmp0(key, "Tethering") == 0) { + /* Tethering state */ } - } else { - netconfig_wifi_update_power_state(TRUE); - netconfig_wifi_device_picker_service_start(); - - netconfig_wifi_notify_power_completed(TRUE); + } else if (g_str_has_prefix(tech, + CONNMAN_CELLULAR_TECHNOLOGY_PREFIX) == TRUE) { + /* Cellular technology state */ } } @@ -244,26 +235,8 @@ static DBusHandlerResult __netconfig_signal_filter_handler( return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_signal(msg, CONNMAN_TECHNOLOGY_INTERFACE, CONNMAN_SIGNAL_PROPERTY_CHANGED)) { - int prop_value = FALSE; - char *technology_path = NULL; + __netconfig_technology_signal_handler(msg); - technology_path = (char *)dbus_message_get_path(msg); - INFO("Technology object path: %s", technology_path); - - if (g_str_has_prefix(technology_path, - CONNMAN_WIFI_TECHNOLOGY_PREFIX) == FALSE) { - return DBUS_HANDLER_RESULT_HANDLED; - } - - sigvalue = __netconfig_get_property(msg, &prop_value); - if (sigvalue == NULL) - return DBUS_HANDLER_RESULT_HANDLED; - - INFO("Technology Property - [%s], Value - [%d]", sigvalue, prop_value); - __netconfig_wifi_technology_state_signal_handler( - (const char *)sigvalue, prop_value); - - /* We have handled this message, don't pass it on */ return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_signal(msg, CONNMAN_SERVICE_INTERFACE, CONNMAN_SIGNAL_PROPERTY_CHANGED)) { diff --git a/src/wifi-state.c b/src/wifi-state.c index 6293f13..dc513a6 100644 --- a/src/wifi-state.c +++ b/src/wifi-state.c @@ -309,13 +309,21 @@ void netconfig_wifi_update_power_state(gboolean powered) { int wifi_state = 0; + /* It's automatically updated by signal-handler + * DO NOT update manually + * It includes Wi-Fi state configuration + */ vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state); if (powered == TRUE) { if (wifi_state == VCONFKEY_WIFI_OFF && netconfig_is_wifi_direct_on() != TRUE && netconfig_is_wifi_tethering_on() != TRUE) { - DBG("Wi-Fi successfully turned on"); + DBG("Wi-Fi successfully turned on or waken up from power-save mode"); + + netconfig_wifi_notify_power_completed(TRUE); + + netconfig_wifi_device_picker_service_start(); vconf_set_int(VCONFKEY_NETWORK_WIFI_STATE, VCONFKEY_NETWORK_WIFI_NOT_CONNECTED); @@ -327,7 +335,13 @@ void netconfig_wifi_update_power_state(gboolean powered) } } else { if (wifi_state != VCONFKEY_WIFI_OFF) { - DBG("Wi-Fi successfully turned off"); + DBG("Wi-Fi successfully turned off or in power-save mode"); + + netconfig_wifi_device_picker_service_stop(); + + netconfig_wifi_remove_driver(); + + netconfig_wifi_notify_power_completed(FALSE); netconfig_del_wifi_found_notification(); -- 2.7.4