From cf894302767d5ec483b5f8002bb796a284895bbf Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Thu, 1 Aug 2013 18:21:05 -0500 Subject: add a bluetooth backend to track bluetooth being enabled, being hard/soft blocked, and its devices. --- src/bluez.vala | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/bluez.vala (limited to 'src/bluez.vala') diff --git a/src/bluez.vala b/src/bluez.vala new file mode 100644 index 0000000..178cc57 --- /dev/null +++ b/src/bluez.vala @@ -0,0 +1,97 @@ +/* + * Copyright 2013 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Authors: + * Charles Kerr + */ + +public class Bluez: Bluetooth +{ + private org.bluez.Manager manager; + private org.bluez.Adapter default_adapter; + + public Bluez (KillSwitch kill_switch) + { + string default_adapter_object_path = null; + + base (kill_switch); + + try + { + manager = Bus.get_proxy_sync (BusType.SYSTEM, "org.bluez", "/"); + + manager.default_adapter_changed.connect ((object_path) => on_default_adapter_changed (object_path)); + default_adapter_object_path = manager.default_adapter (); + } + catch (Error e) + { + critical ("%s", e.message); + } + + on_default_adapter_changed (default_adapter_object_path); + } + + private void on_default_adapter_changed (string? object_path) + { + if (object_path != null) try + { + message ("using default adapter at %s", object_path); + this.default_adapter = Bus.get_proxy_sync (BusType.SYSTEM, "org.bluez", object_path); + this.default_adapter.property_changed.connect(() => this.on_default_adapter_properties_changed()); + } + catch (Error e) + { + critical ("%s", e.message); + } + + this.on_default_adapter_properties_changed (); + } + + private void on_default_adapter_properties_changed () + { + bool is_discoverable = false; + bool is_powered = false; + + if (this.default_adapter != null) try + { + var properties = this.default_adapter.get_properties(); + + var v = properties.lookup("Discoverable"); + is_discoverable = (v != null) && v.get_boolean (); + + v = properties.lookup("Powered"); + is_powered = (v != null) && v.get_boolean (); + } + catch (Error e) + { + critical ("%s", e.message); + } + + this.powered = is_powered; + this.discoverable = is_discoverable; + } + + public override void try_set_discoverable (bool b) + { + if (discoverable != b) try + { + this.default_adapter.set_property ("Discoverable", new Variant.boolean(b)); + } + catch (Error e) + { + critical ("%s", e.message); + } + } +} -- cgit v1.2.3