From 072e04865a83f46449b3f8b9f766c54294b0474d Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Thu, 11 Oct 2012 18:20:47 +1300 Subject: Abstract out bluez more --- src/bluez.vala | 139 +++++++++++++++++++++++++++++++++++++++++-- src/indicator-bluetooth.vala | 72 +++++++--------------- 2 files changed, 156 insertions(+), 55 deletions(-) diff --git a/src/bluez.vala b/src/bluez.vala index 14984bf..0a5a393 100644 --- a/src/bluez.vala +++ b/src/bluez.vala @@ -9,34 +9,163 @@ * license. */ +public class BluezManager : Object +{ + public BluezAdapter default_adapter; + + public BluezManager () + { + } + + public void start () throws IOError + { + proxy = Bus.get_proxy_sync (BusType.SYSTEM, "org.bluez", "/"); + proxy.default_adapter_changed.connect (default_adapter_changed_cb); + default_adapter_changed_cb (proxy.default_adapter ()); + } + + private BluezManagerInterface proxy; + + private void default_adapter_changed_cb (string path) + { + default_adapter = new BluezAdapter (path); + } +} + +public class BluezAdapter : Object +{ + public List get_devices () + { + var devices = new List (); + foreach (var device in _devices) + devices.append (device); + return devices; + } + + private bool _discoverable = false; + public bool discoverable + { + get { return _discoverable; } + set + { + proxy.set_property ("Discoverable", new Variant.boolean (value)); + } + } + + internal string path; + private List _devices; + private BluezAdapterInterface proxy; + + internal BluezAdapter (string path) + { + this.path = path; + _devices = new List (); + proxy = Bus.get_proxy_sync (BusType.SYSTEM, "org.bluez", path); + + proxy.property_changed.connect (property_changed_cb); + var properties = proxy.get_properties (); + var iter = HashTableIter (properties); + string name; + Variant value; + while (iter.next (out name, out value)) + property_changed_cb (name, value); + + proxy.device_created.connect (device_created_cb); + foreach (var device_path in proxy.list_devices ()) + device_created_cb (device_path); + } + + private void property_changed_cb (string name, Variant value) + { + stderr.printf ("%s %s=%s\n", path, name, value.print (false)); + if (name == "Discoverable" && value.is_of_type (VariantType.BOOLEAN)) + _discoverable = value.get_boolean (); + } + + private void device_created_cb (string path) + { + foreach (var device in _devices) + if (device.path == path) + return; + + var device = new BluezDevice (path); + _devices.append (device); + } +} + +public class BluezDevice : Object +{ + private string _name = null; + public string name { get { return _name; } } + + internal string path; + private BluezDeviceInterface proxy; + + internal BluezDevice (string path) + { + this.path = path; + proxy = Bus.get_proxy_sync (BusType.SYSTEM, "org.bluez", path); + + proxy.property_changed.connect (property_changed_cb); + var properties = proxy.get_properties (); + var iter = HashTableIter (properties); + string name; + Variant value; + while (iter.next (out name, out value)) + property_changed_cb (name, value); + + //var input_device = Bus.get_proxy_sync (BusType.SYSTEM, "org.bluez", path); + //input_device.property_changed.connect (input_property_changed_cb); + } + + private void property_changed_cb (string name, Variant value) + { + stderr.printf ("%s %s=%s\n", path, name, value.print (false)); + if (name == "Name" && value.is_of_type (VariantType.STRING)) + _name = value.get_string (); + } + + private void input_property_changed_cb (string name, Variant value) + { + stderr.printf ("%s i %s=%s\n", path, name, value.print (false)); + } +} + [DBus (name = "org.bluez.Manager")] -public interface BluezManager : Object +private interface BluezManagerInterface : Object { public abstract string default_adapter () throws IOError; + public signal void default_adapter_changed (string path); } [DBus (name = "org.bluez.Adapter")] -public interface BluezAdapter : Object +private interface BluezAdapterInterface : Object { public abstract string[] list_devices () throws IOError; public abstract HashTable get_properties () throws IOError; public abstract void set_property (string name, Variant value) throws IOError; + public signal void property_changed (string name, Variant value); + public signal void device_created (string path); } [DBus (name = "org.bluez.Device")] -public interface BluezDevice : Object +private interface BluezDeviceInterface : Object { public abstract HashTable get_properties () throws IOError; + public signal void property_changed (string name, Variant value); } [DBus (name = "org.bluez.Audio")] -public interface BluezAudio : Object +private interface BluezAudioInterface : Object { public abstract void connect () throws IOError; } [DBus (name = "org.bluez.Input")] -public interface BluezInput : Object +private interface BluezInputInterface : Object { public abstract void connect () throws IOError; + public abstract void disconnect () throws IOError; + public abstract HashTable get_properties () throws IOError; + public signal void property_changed (string name, Variant value); } diff --git a/src/indicator-bluetooth.vala b/src/indicator-bluetooth.vala index a157ab1..952613e 100644 --- a/src/indicator-bluetooth.vala +++ b/src/indicator-bluetooth.vala @@ -33,17 +33,8 @@ public class BluetoothIndicator : AppIndicator.Indicator rfkill.device_deleted.connect (update_rfkill); /* Get/control bluetooth status from Bluez */ - BluezAdapter adapter = null; - try - { - var manager = Bus.get_proxy_sync (BusType.SYSTEM, "org.bluez", "/"); - var path = manager.default_adapter (); - adapter = Bus.get_proxy_sync (BusType.SYSTEM, "org.bluez", path); - } - catch (IOError e) - { - stderr.printf ("Failed to connect to Bluez: %s", e.message); - } + var bluez = new BluezManager (); + bluez.start (); set_status (AppIndicator.IndicatorStatus.ACTIVE); @@ -60,7 +51,7 @@ public class BluetoothIndicator : AppIndicator.Indicator menu.append (enable_item); visible_item = new Gtk.CheckMenuItem.with_label (_("Visible")); - visible_item.activate.connect (() => { adapter.set_property ("Discoverable", new Variant.boolean (true)); }); // FIXME: Make rw + visible_item.activate.connect (() => { bluez.default_adapter.discoverable = true; }); // FIXME: Make rw menu.append (visible_item); devices_separator = new Gtk.SeparatorMenuItem (); @@ -73,45 +64,26 @@ public class BluetoothIndicator : AppIndicator.Indicator device_items = new List (); - try - { - var devices = adapter.list_devices (); - foreach (var path in devices) - { - var device = Bus.get_proxy_sync (BusType.SYSTEM, "org.bluez", path); - var properties = device.get_properties (); - var iter = HashTableIter (properties); - string name; - Variant value; - //stderr.printf ("%s\n", path); - while (iter.next (out name, out value)) - { - //stderr.printf (" %s=%s\n", name, value.print (false)); - if (name == "Name" && value.is_of_type (VariantType.STRING)) - { - var item = new Gtk.MenuItem.with_label (value.get_string ()); - device_items.append (item); - menu.append (item); - - item.submenu = new Gtk.Menu (); - var i = new Gtk.MenuItem.with_label (_("Send files...")); - i.visible = true; - i.activate.connect (() => { Process.spawn_command_line_async ("bluetooth-sendto --device=DEVICE --name=NAME"); }); - item.submenu.append (i); - - //var i = new Gtk.MenuItem.with_label (_("Keyboard Settings...")); - //i.activate.connect (() => { Process.spawn_command_line_async ("gnome-control-center keyboard"); }); - //var i = new Gtk.MenuItem.with_label (_("Mouse and Touchpad Settings...")); - //i.activate.connect (() => { Process.spawn_command_line_async ("gnome-control-center mouse"); }); - //var i = new Gtk.MenuItem.with_label (_("Sound Settings...")); - //i.activate.connect (() => { Process.spawn_command_line_async ("gnome-control-center sound"); }); - } - } - } - } - catch (IOError e) + var devices = bluez.default_adapter.get_devices (); + foreach (var device in devices) { - stderr.printf ("%s\n", e.message); + var item = new Gtk.MenuItem.with_label (device.name); + device_items.append (item); + menu.append (item); + + item.submenu = new Gtk.Menu (); + var i = new Gtk.MenuItem.with_label (_("Send files...")); + i.visible = true; + i.activate.connect (() => { Process.spawn_command_line_async ("bluetooth-sendto --device=DEVICE --name=NAME"); }); // FIXME + item.submenu.append (i); + + //FIXME + //var i = new Gtk.MenuItem.with_label (_("Keyboard Settings...")); + //i.activate.connect (() => { Process.spawn_command_line_async ("gnome-control-center keyboard"); }); + //var i = new Gtk.MenuItem.with_label (_("Mouse and Touchpad Settings...")); + //i.activate.connect (() => { Process.spawn_command_line_async ("gnome-control-center mouse"); }); + //var i = new Gtk.MenuItem.with_label (_("Sound Settings...")); + //i.activate.connect (() => { Process.spawn_command_line_async ("gnome-control-center sound"); }); } var sep = new Gtk.SeparatorMenuItem (); -- cgit v1.2.3