e/bluez4: allow Disconnect when device is connected
authorLucas Joia <lucasjoia@profusion.mobi>
Fri, 4 Jan 2013 16:12:50 +0000 (16:12 +0000)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Fri, 4 Jan 2013 16:12:50 +0000 (16:12 +0000)
Patch by: Lucas Joia <lucasjoia@profusion.mobi>

SVN revision: 82196

src/modules/bluez4/e_mod_main.c
src/modules/bluez4/ebluez4.c
src/modules/bluez4/ebluez4.h

index f43d64e..02ae823 100644 (file)
@@ -82,6 +82,12 @@ _ebluez4_cb_connect(void *data, E_Menu *m, E_Menu_Item *mi)
 }
 
 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)
 {
    Device *dev = data;
@@ -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);
index 0da7b79..9386c74 100644 (file)
@@ -222,6 +222,26 @@ _try_to_connect(EDBus_Proxy *proxy)
 }
 
 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)
 {
    const char *err_name, *err_msg;
@@ -492,6 +512,14 @@ ebluez4_connect_to_device(Device *dev)
 }
 
 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)
 {
    edbus_proxy_call(ctxt->adap_proxy, "CreatePairedDevice", _on_paired, NULL,
index 79cc7c6..726d761 100644 (file)
@@ -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);