/*
* 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
*/
/**
* Bluetooth implementaion which uses bluez over dbus
*/
public class Bluez: Bluetooth
{
private org.bluez.Manager manager;
private org.bluez.Adapter default_adapter;
private HashTable devices;
public Bluez (KillSwitch killswitch)
{
base (killswitch);
string default_adapter_object_path = null;
this.devices = new HashTable(str_hash, str_equal);
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);
default_adapter = Bus.get_proxy_sync (BusType.SYSTEM, "org.bluez", object_path);
default_adapter.property_changed.connect(() => on_default_adapter_properties_changed());
default_adapter.device_created.connect((adapter, path) => add_device (path));
default_adapter.device_removed.connect((adapter, path) => devices.remove (path));
foreach (string device_path in default_adapter.list_devices())
add_device (device_path);
}
catch (Error e)
{
critical ("%s", e.message);
}
this.on_default_adapter_properties_changed ();
}
private void add_device (string object_path)
{
try
{
org.bluez.Device device = Bus.get_proxy_sync (BusType.SYSTEM, "org.bluez", object_path);
message ("got device proxy for %s", object_path);
var properties = device.get_properties ();
Variant v = properties.lookup ("Alias");
if (v == null)
v = properties.lookup ("Name");
string name = v == null ? _("Unknown") : v.get_string();
bool supports_browsing = false;
v = properties.lookup ("UUIDs");
message ("%s", v.print(true));
bool supports_file_transfer = false;
//protected static bool uuid_supports_file_transfer (string uuid)
//protected static bool uuid_supports_browsing (string uuid)
var dev = new Bluetooth.Device (name,
supports_browsing,
supports_file_transfer);
devices.insert (object_path, dev);
message ("devices.size() is %u", devices.size());
}
catch (Error e)
{
critical ("%s", e.message);
}
}
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);
}
}
}