From f41c88872c874f70556fbc6e052275033cd6d6b0 Mon Sep 17 00:00:00 2001 From: Lucas Joia Date: Fri, 4 Jan 2013 16:12:50 +0000 Subject: [PATCH] e/bluez4: allow Disconnect when device is connected Patch by: Lucas Joia SVN revision: 82196 --- src/modules/bluez4/e_mod_main.c | 18 ++++++++++++++++-- src/modules/bluez4/ebluez4.c | 28 ++++++++++++++++++++++++++++ src/modules/bluez4/ebluez4.h | 1 + 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/modules/bluez4/e_mod_main.c b/src/modules/bluez4/e_mod_main.c index f43d64ee3..02ae823a8 100644 --- a/src/modules/bluez4/e_mod_main.c +++ b/src/modules/bluez4/e_mod_main.c @@ -81,6 +81,12 @@ _ebluez4_cb_connect(void *data, E_Menu *m, E_Menu_Item *mi) ebluez4_connect_to_device(data); } +static void +_ebluez4_cb_disconnect(void *data, E_Menu *m, E_Menu_Item *mi) +{ + ebluez4_disconnect_device(data); +} + static void _ebluez4_cb_forget(void *data, E_Menu *m, E_Menu_Item *mi) { @@ -130,8 +136,16 @@ _ebluez4_add_devices(Instance *inst) NULL); e_menu_item_submenu_set(mi, subm); mi = e_menu_item_new(subm); - e_menu_item_label_set(mi, "Connect"); - e_menu_item_callback_set(mi, _ebluez4_cb_connect, dev); + if (dev->connected) + { + e_menu_item_label_set(mi, "Disconnect"); + e_menu_item_callback_set(mi, _ebluez4_cb_disconnect, dev); + } + else + { + e_menu_item_label_set(mi, "Connect"); + e_menu_item_callback_set(mi, _ebluez4_cb_connect, dev); + } mi = e_menu_item_new(subm); e_menu_item_label_set(mi, "Forget"); e_menu_item_callback_set(mi, _ebluez4_cb_forget, dev); diff --git a/src/modules/bluez4/ebluez4.c b/src/modules/bluez4/ebluez4.c index 0da7b7906..9386c74bd 100644 --- a/src/modules/bluez4/ebluez4.c +++ b/src/modules/bluez4/ebluez4.c @@ -221,6 +221,26 @@ _try_to_connect(EDBus_Proxy *proxy) edbus_proxy_call(proxy, "Connect", _on_connected, NULL, -1, ""); } +static void +_on_disconnected(void *data, const EDBus_Message *msg, EDBus_Pending *pending) +{ + const char *err_name, *err_msg; + + if (edbus_message_error_get(msg, &err_name, &err_msg)) + { + ERR("%s: %s", err_name, err_msg); + ebluez4_show_error(err_name, err_msg); + return; + } +} + +static void +_try_to_disconnect(EDBus_Proxy *proxy) +{ + if (proxy) + edbus_proxy_call(proxy, "Disconnect", _on_disconnected, NULL, -1, ""); +} + static void _on_paired(void *data, const EDBus_Message *msg, EDBus_Pending *pending) { @@ -491,6 +511,14 @@ ebluez4_connect_to_device(Device *dev) _try_to_connect(dev->proxy.audio_sink); } +void +ebluez4_disconnect_device(Device *dev) +{ + _try_to_disconnect(dev->proxy.input); + _try_to_disconnect(dev->proxy.audio_source); + _try_to_disconnect(dev->proxy.audio_sink); +} + void ebluez4_pair_with_device(const char *addr) { diff --git a/src/modules/bluez4/ebluez4.h b/src/modules/bluez4/ebluez4.h index 79cc7c6aa..726d761a2 100644 --- a/src/modules/bluez4/ebluez4.h +++ b/src/modules/bluez4/ebluez4.h @@ -61,6 +61,7 @@ void ebluez4_edbus_shutdown(); void ebluez4_start_discovery(); void ebluez4_stop_discovery(); void ebluez4_connect_to_device(Device *dev); +void ebluez4_disconnect_device(Device *dev); void ebluez4_pair_with_device(const char *addr); void ebluez4_remove_device(EDBus_Object *obj); int ebluez4_path_cmp(const void *d1, const void *d2);