From: Seungyoun Ju Date: Mon, 19 Nov 2012 13:05:46 +0000 (+0900) Subject: USB Mode change is checked while USB Tethering is enabled X-Git-Tag: 2.1b_release~1^2~21 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b03ee0b80b7c6bf856ad8c6f5a95745fbabd10ad;p=platform%2Fcore%2Fconnectivity%2Fmobileap-agent.git USB Mode change is checked while USB Tethering is enabled - Issues Because USB Mode can be changed (eg. set_usb_debug.sh --sshon), USB Mode change should be handled while USB tethering is enabled. - Fix description 1. Vconf check routine is modified. Notify -> Get -> Check value -> Ignore notify or do something. So that, regression case can be handled 2. USB Mode change is notified by disconnection callback after USB Tethering is enabled. Change-Id: I263c34f2ceb8177246e0aac7ba17aaa8463ffaae --- diff --git a/include/mobileap_common.h b/include/mobileap_common.h index 06be4dc..04aecc4 100644 --- a/include/mobileap_common.h +++ b/include/mobileap_common.h @@ -30,7 +30,7 @@ /* Need translation */ #define MH_NOTI_STR "Connected device (%d)" -#define MH_NOTI_TITLE "Tethering is available" +#define MH_NOTI_TITLE "Tethering" gint _slist_find_station_by_interface(gconstpointer a, gconstpointer b); gint _slist_find_station_by_mac(gconstpointer a, gconstpointer b); diff --git a/src/mobileap_usb.c b/src/mobileap_usb.c index 0aca455..7e55f9e 100644 --- a/src/mobileap_usb.c +++ b/src/mobileap_usb.c @@ -43,7 +43,8 @@ static void __handle_usb_disconnect_cb(keynode_t *key, void *data) return; } - int vconf_key = 0; + char *vconf_name; + int vconf_key; MobileAPObject *obj = (MobileAPObject *)data; if (!_mobileap_is_enabled(MOBILE_AP_STATE_USB)) { @@ -56,37 +57,34 @@ static void __handle_usb_disconnect_cb(keynode_t *key, void *data) return; } + vconf_name = vconf_keynode_get_name(key); vconf_key = vconf_keynode_get_int(key); - DBG("key = %s, value = %d(int)\n", - vconf_keynode_get_name(key), vconf_key); - - if (vconf_key != VCONFKEY_SYSMAN_USB_DISCONNECTED) { + DBG("key = %s, value = %d(int)\n", vconf_name, vconf_key); + + if (!strcmp(vconf_name, VCONFKEY_SYSMAN_USB_STATUS) && + vconf_key == VCONFKEY_SYSMAN_USB_DISCONNECTED) + DBG("USB is disconnected\n"); + else if (!strcmp(vconf_name, VCONFKEY_SETAPPL_USB_MODE_INT) && + vconf_key != SETTING_USB_TETHERING_MODE) + DBG("USB Mode is changed [%d]\n", vconf_key); + else return; - } - - DBG("USB tethering will be disabled\n"); _disable_usb_tethering(obj); - _emit_mobileap_dbus_signal(obj, E_SIGNAL_USB_TETHER_OFF, SIGNAL_MSG_NOT_AVAIL_INTERFACE); - - return; } - - static void __handle_usb_mode_change(keynode_t *key, void *data) { - if (key == NULL) { + if (key == NULL || data == NULL) { ERR("Parameter is NULL\n"); return; } MobileAPObject *obj = (MobileAPObject *)data; - int vconf_key = 0; - int is_usb_enabled = FALSE; - unsigned int cfm = 0; + int ret; + int vconf_key; if (vconf_keynode_get_type(key) != VCONF_TYPE_INT) { ERR("Invalid vconf key\n"); @@ -97,36 +95,52 @@ static void __handle_usb_mode_change(keynode_t *key, void *data) DBG("key = %s, value = %d(int)\n", vconf_keynode_get_name(key), vconf_key); - is_usb_enabled = _mobileap_is_enabled(MOBILE_AP_STATE_USB); - DBG("is_usb_enabled : %d\n", is_usb_enabled); - - if (is_usb_enabled) { + if (_mobileap_is_enabled(MOBILE_AP_STATE_USB)) { if (vconf_key != SETTING_USB_TETHERING_MODE) { DBG("Is progressing for usb mode change\n"); return; } + DBG("USB tethering is enabled\n"); - cfm = MOBILE_AP_ENABLE_USB_TETHERING_CFM; + vconf_ignore_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT, + __handle_usb_mode_change); _emit_mobileap_dbus_signal(obj, E_SIGNAL_USB_TETHER_ON, NULL); + dbus_g_method_return(obj->usb_context, + MOBILE_AP_ENABLE_USB_TETHERING_CFM, + MOBILE_AP_ERROR_NONE); + obj->usb_context = NULL; + + /* USB Mode change is handled while USB tethering is enabled */ + vconf_notify_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT, + __handle_usb_disconnect_cb, (void *)obj); + ret = vconf_get_int(VCONFKEY_SETAPPL_USB_MODE_INT, &vconf_key); + if (ret != 0) { + ERR("vconf_get_int is failed. but ignored [%d]\n", ret); + return; + } + if (vconf_key != SETTING_USB_TETHERING_MODE) { + ERR("USB Mode is changed suddenly\n"); + _disable_usb_tethering(obj); + _emit_mobileap_dbus_signal(obj, E_SIGNAL_USB_TETHER_OFF, + SIGNAL_MSG_NOT_AVAIL_INTERFACE); + } } else { if (vconf_key == SETTING_USB_TETHERING_MODE) { DBG("Is progressing for usb mode change\n"); return; } + DBG("USB tethering is disabled\n"); - cfm = MOBILE_AP_DISABLE_USB_TETHERING_CFM; + vconf_ignore_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT, + __handle_usb_mode_change); _emit_mobileap_dbus_signal(obj, E_SIGNAL_USB_TETHER_OFF, NULL); + dbus_g_method_return(obj->usb_context, + MOBILE_AP_DISABLE_USB_TETHERING_CFM, + MOBILE_AP_ERROR_NONE); + obj->usb_context = NULL; } - - vconf_ignore_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT, - __handle_usb_mode_change); - - DBG("cfm : %d\n", cfm); - dbus_g_method_return(obj->usb_context, cfm, MOBILE_AP_ERROR_NONE); - obj->usb_context = NULL; } - mobile_ap_error_code_e _disable_usb_tethering(MobileAPObject *obj) { mobile_ap_error_code_e ret = MOBILE_AP_ERROR_NONE; @@ -143,6 +157,8 @@ mobile_ap_error_code_e _disable_usb_tethering(MobileAPObject *obj) ERR("_remove_station_info_all is failed. Ignore it\n"); } + vconf_ignore_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT, + __handle_usb_disconnect_cb); vconf_ignore_key_changed(VCONFKEY_SYSMAN_USB_STATUS, __handle_usb_disconnect_cb); @@ -153,13 +169,10 @@ mobile_ap_error_code_e _disable_usb_tethering(MobileAPObject *obj) return ret; } - - gboolean mobileap_enable_usb_tethering(MobileAPObject *obj, DBusGMethodInvocation *context) { int vconf_ret; - int usb_conn = VCONFKEY_SYSMAN_USB_DISCONNECTED; int usb_mode = SETTING_USB_NONE_MODE; int ret = MOBILE_AP_ERROR_NONE; @@ -177,23 +190,6 @@ gboolean mobileap_enable_usb_tethering(MobileAPObject *obj, return FALSE; } - vconf_ret = vconf_get_int(VCONFKEY_SYSMAN_USB_STATUS, &usb_conn); - if (vconf_ret != 0) { - ERR("Error getting vconf\n"); - ret = MOBILE_AP_ERROR_RESOURCE; - dbus_g_method_return(context, - MOBILE_AP_ENABLE_USB_TETHERING_CFM, ret); - return FALSE; - } - - if (usb_conn != VCONFKEY_SYSMAN_USB_AVAILABLE) { - ERR("USB is not connected\n"); - ret = MOBILE_AP_ERROR_RESOURCE; - dbus_g_method_return(context, - MOBILE_AP_ENABLE_USB_TETHERING_CFM, ret); - return FALSE; - } - if (obj->usb_context) { ERR("USB request is progressing\n"); ret = MOBILE_AP_ERROR_IN_PROGRESS; @@ -202,6 +198,15 @@ gboolean mobileap_enable_usb_tethering(MobileAPObject *obj, return FALSE; } + vconf_notify_key_changed(VCONFKEY_SYSMAN_USB_STATUS, + __handle_usb_disconnect_cb, obj); + vconf_ret = vconf_get_int(VCONFKEY_SYSMAN_USB_STATUS, &usb_mode); + if (vconf_ret != 0 || usb_mode == VCONFKEY_SYSMAN_USB_DISCONNECTED) { + ERR("Error getting vconf\n"); + ret = MOBILE_AP_ERROR_RESOURCE; + goto FAIL; + } + if (!_mobileap_set_state(MOBILE_AP_STATE_USB)) { ret = MOBILE_AP_ERROR_RESOURCE; goto FAIL; @@ -212,42 +217,46 @@ gboolean mobileap_enable_usb_tethering(MobileAPObject *obj, goto FAIL; } + obj->usb_context = context; + vconf_notify_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT, + __handle_usb_mode_change, (void *)obj); + vconf_ret = vconf_get_int(VCONFKEY_SETAPPL_USB_MODE_INT, &usb_mode); if (vconf_ret != 0) { ERR("Error getting vconf\n"); + obj->usb_context = NULL; + vconf_ignore_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT, + __handle_usb_mode_change); _deinit_tethering(obj); ret = MOBILE_AP_ERROR_RESOURCE; goto FAIL; } - vconf_notify_key_changed(VCONFKEY_SYSMAN_USB_STATUS, - __handle_usb_disconnect_cb, obj); - if (usb_mode == SETTING_USB_TETHERING_MODE) { DBG("Don't need to wait for usb-setting\n"); + obj->usb_context = NULL; + vconf_ignore_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT, + __handle_usb_mode_change); + _emit_mobileap_dbus_signal(obj, E_SIGNAL_USB_TETHER_ON, NULL); dbus_g_method_return(context, MOBILE_AP_ENABLE_USB_TETHERING_CFM, ret); - } else { - obj->usb_context = context; - vconf_notify_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT, - __handle_usb_mode_change, (void *)obj); + return TRUE; } DBG("-\n"); - return TRUE; FAIL: + vconf_ignore_key_changed(VCONFKEY_SYSMAN_USB_STATUS, + __handle_usb_disconnect_cb); _mobileap_clear_state(MOBILE_AP_STATE_USB); dbus_g_method_return(context, MOBILE_AP_ENABLE_USB_TETHERING_CFM, ret); return FALSE; } - - gboolean mobileap_disable_usb_tethering(MobileAPObject *obj, - DBusGMethodInvocation *context) + DBusGMethodInvocation *context) { mobile_ap_error_code_e ret = MOBILE_AP_ERROR_NONE; int usb_mode = SETTING_USB_NONE_MODE; @@ -262,37 +271,40 @@ gboolean mobileap_disable_usb_tethering(MobileAPObject *obj, ERR("USB request is progressing\n"); ret = MOBILE_AP_ERROR_IN_PROGRESS; dbus_g_method_return(context, - MOBILE_AP_ENABLE_USB_TETHERING_CFM, ret); + MOBILE_AP_DISABLE_USB_TETHERING_CFM, ret); return FALSE; } ret = _disable_usb_tethering(obj); if (ret != MOBILE_AP_ERROR_NONE) { dbus_g_method_return(context, - MOBILE_AP_DISABLE_USB_TETHERING_CFM, - ret); + MOBILE_AP_DISABLE_USB_TETHERING_CFM, ret); return FALSE; } + obj->usb_context = context; + vconf_notify_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT, + __handle_usb_mode_change, (void *)obj); vconf_ret = vconf_get_int(VCONFKEY_SETAPPL_USB_MODE_INT, &usb_mode); if (vconf_ret != 0) { - ERR("Error getting vconf : %d\n", vconf_ret); + ERR("Error getting vconf : %d. This error is ignored\n", vconf_ret); + goto DONE; } - if (usb_mode != SETTING_USB_TETHERING_MODE) { DBG("Don't need to wait for usb-setting\n"); - _emit_mobileap_dbus_signal(obj, E_SIGNAL_USB_TETHER_ON, NULL); - dbus_g_method_return(context, - MOBILE_AP_DISABLE_USB_TETHERING_CFM, - MOBILE_AP_ERROR_NONE); - } else { - obj->usb_context = context; - vconf_notify_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT, - __handle_usb_mode_change, (void *)obj); + goto DONE; } DBG("-\n"); return TRUE; + +DONE: + vconf_ignore_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT, + __handle_usb_mode_change); + _emit_mobileap_dbus_signal(obj, E_SIGNAL_USB_TETHER_OFF, NULL); + dbus_g_method_return(context, + MOBILE_AP_DISABLE_USB_TETHERING_CFM, ret); + return TRUE; } static void __add_usb_station_info_to_array(GPtrArray *array, mobile_ap_station_info_t *node)