[gnome-bluetooth] bluetooth-client: Port to BlueZ 5



commit 0b0534924fb5ea781195e116a7dfbf956d16379c
Author: Gustavo Padovan <gustavo padovan collabora co uk>
Date:   Wed May 15 17:46:33 2013 -0300

    bluetooth-client: Port to BlueZ 5
    
    Port the client part of gnome-bluetooth to BlueZ 5. The new API is a way
    more simple than the old one.
    
    One of the things that are gone with the BlueZ API is the Services
    information, now we only rely on UUID to know which profiles are
    supported. This doesn't affect us much since Services was already relying
    UUID information.
    
    The new API uses freedesktop DBus ObjectMananer and Properties, thus we
    don't need to watch on many different interfaces for signals, for
    example.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=685717

 lib/bluetooth-client-private.h |   18 +-
 lib/bluetooth-client.c         | 1383 +++++++++++++---------------------------
 lib/bluetooth-client.h         |    2 +-
 lib/gnome-bluetooth.symbols    |    3 +-
 lib/test-client.c              |   40 --
 5 files changed, 457 insertions(+), 989 deletions(-)
---
diff --git a/lib/bluetooth-client-private.h b/lib/bluetooth-client-private.h
index 3897b6c..a3c1886 100644
--- a/lib/bluetooth-client-private.h
+++ b/lib/bluetooth-client-private.h
@@ -30,18 +30,22 @@
 
 G_BEGIN_DECLS
 
-typedef void (*BluetoothClientCreateDeviceFunc) (BluetoothClient *client,
-                                                const char *path,
-                                                const GError *error,
-                                                gpointer data);
+typedef void (*BluetoothClientSetupFunc) (BluetoothClient *client,
+                                         const GError    *error,
+                                         const char      *device_path);
 
-gboolean bluetooth_client_create_device(BluetoothClient *client,
-                       const char *address, const char *agent,
-                       BluetoothClientCreateDeviceFunc func, gpointer data);
+gboolean bluetooth_client_setup_device (BluetoothClient          *client,
+                                       const char               *device_path,
+                                       const char               *agent,
+                                       BluetoothClientSetupFunc  func,
+                                       gboolean                  pair);
 
 gboolean bluetooth_client_set_trusted(BluetoothClient *client,
                                        const char *device, gboolean trusted);
 
+GDBusProxy *bluetooth_client_get_device (BluetoothClient *client,
+                                        const char      *path);
+
 void bluetooth_client_dump_device (GtkTreeModel *model,
                                   GtkTreeIter *iter);
 
diff --git a/lib/bluetooth-client.c b/lib/bluetooth-client.c
index 8bddb58..ff71b96 100644
--- a/lib/bluetooth-client.c
+++ b/lib/bluetooth-client.c
@@ -4,6 +4,7 @@
  *
  *  Copyright (C) 2005-2008  Marcel Holtmann <marcel holtmann org>
  *  Copyright (C) 2010       Giovanni Campagna <scampa giovanni gmail com>
+ *  Copyright (C) 2013       Intel Corporation.
  *
  *
  *  This library is free software; you can redistribute it and/or
@@ -43,32 +44,15 @@
 #include "bluetooth-client.h"
 #include "bluetooth-client-private.h"
 #include "bluetooth-client-glue.h"
+#include "bluetooth-fdo-glue.h"
 #include "bluetooth-utils.h"
 #include "gnome-bluetooth-enum-types.h"
 
 #define BLUEZ_SERVICE                  "org.bluez"
 #define BLUEZ_MANAGER_PATH             "/"
-#define BLUEZ_MANAGER_INTERFACE                "org.bluez.Manager"
-#define BLUEZ_ADAPTER_INTERFACE                "org.bluez.Adapter"
-#define BLUEZ_DEVICE_INTERFACE         "org.bluez.Device"
-
-static char * detectable_interfaces[] = {
-       "org.bluez.Headset",
-       "org.bluez.AudioSink",
-       "org.bluez.Audio",
-       "org.bluez.Input",
-};
-
-static char * connectable_interfaces[] = {
-       "org.bluez.Audio",
-       "org.bluez.Input"
-};
-
-/* Keep in sync with above */
-#define BLUEZ_INPUT_INTERFACE  (connectable_interfaces[1])
-#define BLUEZ_AUDIO_INTERFACE (connectable_interfaces[0])
-#define BLUEZ_HEADSET_INTERFACE (detectable_interfaces[0])
-#define BLUEZ_AUDIOSINK_INTERFACE (detectable_interfaces[1])
+#define BLUEZ_ADAPTER_INTERFACE                "org.bluez.Adapter1"
+#define BLUEZ_DEVICE_INTERFACE         "org.bluez.Device1"
+#define FDO_PROPERTIES_INTERFACE       "org.freedesktop.DBus.Properties"
 
 #define BLUETOOTH_CLIENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), \
                                BLUETOOTH_TYPE_CLIENT, BluetoothClientPrivate))
@@ -77,7 +61,7 @@ typedef struct _BluetoothClientPrivate BluetoothClientPrivate;
 
 struct _BluetoothClientPrivate {
        guint owner_change_id;
-       Manager *manager;
+       ObjectManager *manager;
        GtkTreeStore *store;
        GtkTreeRowReference *default_adapter;
 };
@@ -194,201 +178,6 @@ get_iter_from_address (GtkTreeStore *store,
        return iter_search (store, iter, &parent_iter, compare_address, (gpointer) address);
 }
 
-static BluetoothStatus
-status_from_variant (const char *property,
-                    GVariant   *variant)
-{
-       BluetoothStatus status;
-
-       status = BLUETOOTH_STATUS_INVALID;
-
-       if (g_str_equal (property, "Connected") != FALSE) {
-               status = g_variant_get_boolean (variant) ?
-                       BLUETOOTH_STATUS_CONNECTED :
-                       BLUETOOTH_STATUS_DISCONNECTED;
-       } else if (g_str_equal (property, "State") != FALSE) {
-               GEnumClass *eclass;
-               GEnumValue *ev;
-               eclass = g_type_class_ref (BLUETOOTH_TYPE_STATUS);
-               ev = g_enum_get_value_by_nick (eclass, g_variant_get_string (variant, NULL));
-               if (ev == NULL) {
-                       g_warning ("Unknown status '%s'", g_variant_get_string (variant, NULL));
-                       status = BLUETOOTH_STATUS_DISCONNECTED;
-               } else {
-                       status = ev->value;
-               }
-               g_type_class_unref (eclass);
-       }
-
-       return status;
-}
-
-static void
-proxy_g_signal (GDBusProxy      *proxy,
-               gchar           *sender_name,
-               gchar           *signal_name,
-               GVariant        *parameters,
-               BluetoothClient *client)
-{
-       BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
-       GtkTreeIter iter;
-       GtkTreePath *tree_path;
-       GHashTable *table;
-       const char *path;
-       char *property;
-       GVariant *variant;
-       BluetoothStatus status;
-
-       if (g_strcmp0 (signal_name, "PropertyChanged") != 0)
-               return;
-
-       g_variant_get (parameters, "(sv)", &property, &variant);
-
-       path = g_dbus_proxy_get_object_path (proxy);
-       if (get_iter_from_path (priv->store, &iter, path) == FALSE)
-               return;
-
-       status = status_from_variant (property, variant);
-       if (status == BLUETOOTH_STATUS_INVALID)
-               goto end;
-
-       gtk_tree_model_get (GTK_TREE_MODEL (priv->store), &iter,
-                           BLUETOOTH_COLUMN_SERVICES, &table,
-                           -1);
-
-       g_hash_table_insert (table,
-                            (gpointer) g_dbus_proxy_get_interface_name (proxy),
-                            GINT_TO_POINTER (status));
-
-       tree_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->store), &iter);
-       gtk_tree_model_row_changed (GTK_TREE_MODEL (priv->store), tree_path, &iter);
-       gtk_tree_path_free (tree_path);
-
-end:
-       g_free (property);
-       g_variant_unref (variant);
-}
-
-static GDBusProxy *
-get_proxy_for_iface (Device          *device,
-                    const char      *interface,
-                    BluetoothClient *client)
-{
-       GDBusProxy *proxy;
-
-       proxy = g_object_get_data (G_OBJECT (device), interface);
-       if (proxy != NULL)
-               return g_object_ref (proxy);
-
-       proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
-                                              G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | 
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
-                                              NULL,
-                                              g_dbus_proxy_get_name (G_DBUS_PROXY (device)),
-                                              g_dbus_proxy_get_object_path (G_DBUS_PROXY (device)),
-                                              interface,
-                                              NULL,
-                                              NULL);
-
-       if (proxy == NULL)
-               return NULL;
-
-       g_object_set_data_full (G_OBJECT (device), interface, proxy, g_object_unref);
-       g_signal_connect (G_OBJECT (proxy), "g-signal",
-                         G_CALLBACK (proxy_g_signal), client);
-
-       return g_object_ref (proxy);
-}
-
-static GVariant *
-get_properties_for_iface (GDBusProxy *proxy)
-{
-       GVariant *ret, *variant;
-
-       variant = g_dbus_proxy_call_sync (proxy,
-                                         "GetProperties",
-                                         g_variant_new ("()"),
-                                         G_DBUS_CALL_FLAGS_NONE,
-                                         -1,
-                                         NULL,
-                                         NULL);
-       if (variant == NULL)
-               return NULL;
-       g_variant_get (variant,
-                      "(@a{sv})",
-                      &ret);
-       g_variant_unref (variant);
-       return ret;
-}
-
-static GHashTable *
-device_list_nodes (Device *device, BluetoothClient *client)
-{
-       GHashTable *table;
-       guint i;
-
-       if (device == NULL)
-               return NULL;
-
-       table = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL);
-
-       for (i = 0; i < G_N_ELEMENTS (detectable_interfaces); i++) {
-               GDBusProxy *iface;
-               GVariant *props;
-
-               /* Don't add the input interface for devices that already have
-                * audio stuff */
-               if (g_str_equal (detectable_interfaces[i], BLUEZ_INPUT_INTERFACE)
-                   && g_hash_table_size (table) > 0)
-                       continue;
-
-               /* Don't add the audio interface if there's no Headset or AudioSink,
-                * that means that it could only receive audio */
-               if (g_str_equal (detectable_interfaces[i], BLUEZ_AUDIO_INTERFACE)) {
-                       if (g_hash_table_lookup (table, BLUEZ_HEADSET_INTERFACE) == NULL &&
-                           g_hash_table_lookup (table, BLUEZ_AUDIOSINK_INTERFACE) == NULL) {
-                               continue;
-                       }
-               }
-
-               /* And skip interface if it's already in the hash table */
-               if (g_hash_table_lookup (table, detectable_interfaces[i]) != NULL)
-                       continue;
-
-               /* No such interface for this device? */
-               iface = get_proxy_for_iface (device, detectable_interfaces[i], client);
-               if (iface == NULL)
-                       continue;
-
-               props = get_properties_for_iface (iface);
-               if (props) {
-                       GVariant *value;
-                       BluetoothStatus status;
-
-                       status = BLUETOOTH_STATUS_INVALID;
-                       value = g_variant_lookup_value (props, "Connected", G_VARIANT_TYPE_BOOLEAN);
-                       if (value != NULL) {
-                               status = status_from_variant ("Connected", value);
-                       } else {
-                               value = g_variant_lookup_value (props, "State", G_VARIANT_TYPE_STRING);
-                               if (value != NULL)
-                                       status = status_from_variant ("State", value);
-                       }
-
-                       if (status != BLUETOOTH_STATUS_INVALID)
-                               g_hash_table_insert (table, (gpointer) detectable_interfaces[i], 
GINT_TO_POINTER (status));
-                       g_variant_unref (props);
-               }
-               g_object_unref (iface);
-       }
-
-       if (g_hash_table_size (table) == 0) {
-               g_hash_table_destroy (table);
-               return NULL;
-       }
-
-       return table;
-}
-
 static char **
 device_list_uuids (GVariant *variant)
 {
@@ -426,156 +215,140 @@ device_list_uuids (GVariant *variant)
 }
 
 static void
-device_changed (Device          *device,
-               const char      *property,
-               GVariant        *variant,
-               BluetoothClient *client)
+device_g_properties_changed (GDBusProxy      *device,
+                            GVariant        *changed_p,
+                            GStrv            invalidated_p,
+                            BluetoothClient *client)
 {
        BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
+       GVariantIter i;
+       const char *property;
        GtkTreeIter iter;
+       GVariant *v;
 
-       if (get_iter_from_proxy(priv->store, &iter, G_DBUS_PROXY (device)) == FALSE)
+       if (get_iter_from_proxy (priv->store, &iter, device) == FALSE)
                return;
 
-       if (g_str_equal(property, "Name") == TRUE) {
-               const gchar *name = g_variant_get_string (variant, NULL);
-
-               gtk_tree_store_set(priv->store, &iter,
-                                       BLUETOOTH_COLUMN_NAME, name, -1);
-       } else if (g_str_equal(property, "Alias") == TRUE) {
-               const gchar *alias = g_variant_get_string(variant, NULL);
-
-               gtk_tree_store_set(priv->store, &iter,
-                                       BLUETOOTH_COLUMN_ALIAS, alias, -1);
-       } else if (g_str_equal(property, "Icon") == TRUE) {
-               const gchar *icon = g_variant_get_string(variant, NULL);
-
-               gtk_tree_store_set(priv->store, &iter,
-                                       BLUETOOTH_COLUMN_ICON, icon, -1);
-       } else if (g_str_equal(property, "Paired") == TRUE) {
-               gboolean paired = g_variant_get_boolean(variant);
-
-               gtk_tree_store_set(priv->store, &iter,
-                               BLUETOOTH_COLUMN_PAIRED, paired, -1);
-       } else if (g_str_equal(property, "Trusted") == TRUE) {
-               gboolean trusted = g_variant_get_boolean(variant);
-
-               gtk_tree_store_set(priv->store, &iter,
-                               BLUETOOTH_COLUMN_TRUSTED, trusted, -1);
-       } else if (g_str_equal(property, "Connected") == TRUE) {
-               gboolean connected = g_variant_get_boolean(variant);
-
-               gtk_tree_store_set(priv->store, &iter,
-                               BLUETOOTH_COLUMN_CONNECTED, connected, -1);
-       } else if (g_str_equal (property, "UUIDs") == TRUE) {
-               GHashTable *services;
-               char **uuids;
-
-               uuids = device_list_uuids (variant);
-               services = device_list_nodes (device, client);
-               gtk_tree_store_set (priv->store, &iter,
-                                   BLUETOOTH_COLUMN_SERVICES, services,
-                                   BLUETOOTH_COLUMN_UUIDS, uuids, -1);
-               g_strfreev (uuids);
-               if (services != NULL)
-                       g_hash_table_unref (services);
-       } else {
-               g_debug ("Unhandled property: %s", property);
-       }
-}
-
-static void
-device_g_signal (GDBusProxy      *proxy,
-                gchar           *sender_name,
-                gchar           *signal_name,
-                GVariant        *parameters,
-                BluetoothClient *client)
-{
-       char *property;
-       GVariant *variant;
-
-       if (g_strcmp0 (signal_name, "PropertyChanged") != 0)
-               return;
+       g_variant_iter_init (&i, changed_p);
+       while (g_variant_iter_next (&i, "{&sv}", &property, &v)) {
+
+               if (g_str_equal (property, "Name") == TRUE) {
+                       const gchar *name = g_variant_get_string (v, NULL);
+
+                       gtk_tree_store_set (priv->store, &iter,
+                                           BLUETOOTH_COLUMN_NAME, name, -1);
+               } else if (g_str_equal (property, "Alias") == TRUE) {
+                       const gchar *alias = g_variant_get_string (v, NULL);
+
+                       gtk_tree_store_set (priv->store, &iter,
+                                           BLUETOOTH_COLUMN_ALIAS, alias, -1);
+               } else if (g_str_equal (property, "Icon") == TRUE) {
+                       const gchar *icon = g_variant_get_string (v, NULL);
+
+                       gtk_tree_store_set (priv->store, &iter,
+                                           BLUETOOTH_COLUMN_ICON, icon, -1);
+               } else if (g_str_equal (property, "Paired") == TRUE) {
+                       gboolean paired = g_variant_get_boolean (v);
+
+                       gtk_tree_store_set (priv->store, &iter,
+                                           BLUETOOTH_COLUMN_PAIRED, paired, -1);
+               } else if (g_str_equal (property, "Trusted") == TRUE) {
+                       gboolean trusted = g_variant_get_boolean (v);
+
+                       gtk_tree_store_set (priv->store, &iter,
+                                           BLUETOOTH_COLUMN_TRUSTED, trusted, -1);
+               } else if (g_str_equal (property, "Connected") == TRUE) {
+                       gboolean connected = g_variant_get_boolean (v);
+
+                       gtk_tree_store_set (priv->store, &iter,
+                                           BLUETOOTH_COLUMN_CONNECTED, connected, -1);
+               } else if (g_str_equal (property, "UUIDs") == TRUE) {
+                       char **uuids;
+
+                       uuids = device_list_uuids (v);
+                       gtk_tree_store_set (priv->store, &iter,
+                                           BLUETOOTH_COLUMN_UUIDS, uuids, -1);
+                       g_strfreev (uuids);
+               } else {
+                       g_debug ("Unhandled property: %s", property);
+               }
 
-       g_variant_get (parameters, "(sv)", &property, &variant);
-       device_changed (DEVICE (proxy), property, variant, client);
-       g_free (property);
-       g_variant_unref (variant);
+               g_variant_unref (v);
+       }
 }
 
 static void
-add_device (Adapter         *adapter,
-           GtkTreeIter     *parent,
-           BluetoothClient *client,
-           const char      *path,
-           GVariant        *dict)
+device_added (ObjectManager   *manager,
+             BluetoothClient *client,
+             const char      *path,
+             GVariant        *variant)
 {
        BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
-       Device *device;
-       GVariant *v;
-       const gchar *address, *alias, *name, *icon;
+       GDBusProxy *adapter;
+       Device1 *device;
+       GVariant *v, *dict;
+       const char *adapter_path, *address, *alias, *name, *icon;
        char **uuids;
        gboolean paired, trusted, connected;
        int legacypairing;
        guint type;
-       GtkTreeIter iter;
-       GVariant *ret;
-
-       if (path == NULL && dict == NULL)
+       GtkTreeIter iter, parent;
+
+       device = device1_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                                G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
+                                                BLUEZ_SERVICE,
+                                                path,
+                                                NULL,
+                                                NULL);
+       if (device == NULL)
                return;
 
-       if (path != NULL) {
-               ret = NULL;
-               device = device_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
-                                                       G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | 
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
-                                                       BLUEZ_SERVICE,
-                                                       path,
-                                                       NULL,
-                                                       NULL);
-               if (device == NULL)
-                       return;
-               device_call_get_properties_sync (DEVICE (device), &ret, NULL, NULL);
-               if (ret == NULL) {
-                       g_object_unref (device);
-                       return;
-               }
-       } else {
-               device = NULL;
-               ret = g_variant_ref (dict);
-       }
+       dict = g_variant_lookup_value (variant, BLUEZ_DEVICE_INTERFACE,
+                                      G_VARIANT_TYPE_DICTIONARY);
+
+       v = g_variant_lookup_value (dict, "Adapter", G_VARIANT_TYPE_OBJECT_PATH);
+       adapter_path = v ? g_variant_get_string (v, NULL) : NULL;
 
-       v = g_variant_lookup_value (ret, "Address", G_VARIANT_TYPE_STRING);
+       v = g_variant_lookup_value (dict, "Address", G_VARIANT_TYPE_STRING);
        address = v ? g_variant_get_string (v, NULL) : NULL;
 
-       v = g_variant_lookup_value (ret, "Alias", G_VARIANT_TYPE_STRING);
+       v = g_variant_lookup_value (dict, "Alias", G_VARIANT_TYPE_STRING);
        alias = v ? g_variant_get_string (v, NULL) : NULL;
 
-       v = g_variant_lookup_value (ret, "Name", G_VARIANT_TYPE_STRING);
+       v = g_variant_lookup_value (dict, "Name", G_VARIANT_TYPE_STRING);
        name = v ? g_variant_get_string (v, NULL) : NULL;
 
-       v = g_variant_lookup_value (ret, "Class", G_VARIANT_TYPE_UINT32);
+       v = g_variant_lookup_value (dict, "Class", G_VARIANT_TYPE_UINT32);
        type = v ? bluetooth_class_to_type (g_variant_get_uint32 (v)) : BLUETOOTH_TYPE_ANY;
 
-       v = g_variant_lookup_value (ret, "Icon", G_VARIANT_TYPE_STRING);
+       v = g_variant_lookup_value (dict, "Icon", G_VARIANT_TYPE_STRING);
        icon = v ? g_variant_get_string (v, NULL) : "bluetooth";
 
-       v = g_variant_lookup_value (ret, "Paired", G_VARIANT_TYPE_BOOLEAN);
+       v = g_variant_lookup_value (dict, "Paired", G_VARIANT_TYPE_BOOLEAN);
        paired = v ? g_variant_get_boolean (v) : FALSE;
 
-       v = g_variant_lookup_value (ret, "Trusted", G_VARIANT_TYPE_BOOLEAN);
+       v = g_variant_lookup_value (dict, "Trusted", G_VARIANT_TYPE_BOOLEAN);
        trusted = v ? g_variant_get_boolean (v) : FALSE;
 
-       v = g_variant_lookup_value (ret, "Connected", G_VARIANT_TYPE_BOOLEAN);
+       v = g_variant_lookup_value (dict, "Connected", G_VARIANT_TYPE_BOOLEAN);
        connected = v ? g_variant_get_boolean (v) : FALSE;
 
-       v = g_variant_lookup_value (ret, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
+       v = g_variant_lookup_value (dict, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
        uuids = device_list_uuids (v);
 
-       v = g_variant_lookup_value (ret, "LegacyPairing", G_VARIANT_TYPE_BOOLEAN);
+       v = g_variant_lookup_value (dict, "LegacyPairing", G_VARIANT_TYPE_BOOLEAN);
        legacypairing = v ? g_variant_get_boolean (v) : -1;
 
-       if (get_iter_from_address (priv->store, &iter, address, G_DBUS_PROXY (adapter)) == FALSE)
-               gtk_tree_store_insert (priv->store, &iter, parent, -1);
+       if (get_iter_from_path (priv->store, &parent, adapter_path) == FALSE) {
+               g_object_unref (device);
+               return;
+       }
+
+       gtk_tree_model_get (GTK_TREE_MODEL(priv->store), &parent,
+                           BLUETOOTH_COLUMN_PROXY, &adapter, -1);
+
+       if (get_iter_from_address (priv->store, &iter, address, adapter) == FALSE)
+               gtk_tree_store_insert (priv->store, &iter, &parent, -1);
 
        gtk_tree_store_set(priv->store, &iter,
                           BLUETOOTH_COLUMN_ADDRESS, address,
@@ -586,61 +359,21 @@ add_device (Adapter         *adapter,
                           BLUETOOTH_COLUMN_LEGACYPAIRING, legacypairing,
                           BLUETOOTH_COLUMN_UUIDS, uuids,
                           BLUETOOTH_COLUMN_PAIRED, paired,
+                          BLUETOOTH_COLUMN_CONNECTED, connected,
+                          BLUETOOTH_COLUMN_TRUSTED, trusted,
+                          BLUETOOTH_COLUMN_PROXY, device,
                           -1);
        g_strfreev (uuids);
 
-       if (device != NULL) {
-               GHashTable *services;
-
-               services = device_list_nodes (device, client);
+       g_signal_connect (G_OBJECT (device), "g-properties-changed",
+                         G_CALLBACK (device_g_properties_changed), client);
 
-               gtk_tree_store_set(priv->store, &iter,
-                                  BLUETOOTH_COLUMN_PROXY, device,
-                                  BLUETOOTH_COLUMN_CONNECTED, connected,
-                                  BLUETOOTH_COLUMN_TRUSTED, trusted,
-                                  BLUETOOTH_COLUMN_SERVICES, services,
-                                  -1);
-
-               if (services != NULL)
-                       g_hash_table_unref (services);
-       }
-       g_variant_unref (ret);
-
-       if (device != NULL) {
-               g_signal_connect (G_OBJECT (device), "g-signal",
-                                 G_CALLBACK (device_g_signal), client);
-               g_object_unref (device);
-       }
-}
-
-static void
-device_found (Adapter         *adapter,
-             const char      *address,
-             GVariant        *dict,
-             BluetoothClient *client)
-{
-       BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
-       GtkTreeIter iter;
-
-       if (get_iter_from_proxy(priv->store, &iter, G_DBUS_PROXY (adapter)) == TRUE)
-               add_device(adapter, &iter, client, NULL, dict);
-}
-
-static void
-device_created (Adapter         *adapter,
-               const char      *path,
-               BluetoothClient *client)
-{
-       BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
-       GtkTreeIter iter;
-
-       if (get_iter_from_proxy(priv->store, &iter, G_DBUS_PROXY (adapter)) == TRUE)
-               add_device(adapter, &iter, client, path, NULL);
+       g_object_unref (device);
+       g_object_unref (adapter);
 }
 
 static void
-device_removed (GDBusProxy      *adapter,
-               const char      *path,
+device_removed (const char      *path,
                BluetoothClient *client)
 {
        BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
@@ -651,155 +384,162 @@ device_removed (GDBusProxy      *adapter,
 }
 
 static void
-adapter_changed (GDBusProxy      *adapter,
-                const char      *property,
-                GVariant        *value,
-                BluetoothClient *client)
+default_adapter_changed (ObjectManager   *manager,
+                        const char      *path,
+                        BluetoothClient *client)
 {
        BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
        GtkTreeIter iter;
-       gboolean notify = FALSE;
+       gboolean cont;
 
-       if (get_iter_from_proxy(priv->store, &iter, adapter) == FALSE)
-               return;
+       if (priv->default_adapter) {
+               gtk_tree_row_reference_free (priv->default_adapter);
+               priv->default_adapter = NULL;
+       }
 
-       if (g_str_equal(property, "Name") == TRUE) {
-               const gchar *name = g_variant_get_string (value, NULL);
-               gboolean is_default;
+       cont = gtk_tree_model_get_iter_first (GTK_TREE_MODEL(priv->store), &iter);
 
-               gtk_tree_store_set(priv->store, &iter,
-                                       BLUETOOTH_COLUMN_NAME, name, -1);
-               gtk_tree_model_get(GTK_TREE_MODEL(priv->store), &iter,
-                                  BLUETOOTH_COLUMN_DEFAULT, &is_default, -1);
-               if (is_default != FALSE)
-                       g_object_notify (G_OBJECT (client), "default-adapter-powered");
-               notify = TRUE;
-       } else if (g_str_equal(property, "Discovering") == TRUE) {
-               gboolean discovering = g_variant_get_boolean(value);
-
-               gtk_tree_store_set(priv->store, &iter,
-                               BLUETOOTH_COLUMN_DISCOVERING, discovering, -1);
-               notify = TRUE;
-       } else if (g_str_equal(property, "Powered") == TRUE) {
-               gboolean powered = g_variant_get_boolean(value);
-               gboolean is_default;
+       while (cont == TRUE) {
+               GDBusProxy *adapter;
+               const char *adapter_path;
+               gboolean found, powered;
 
-               gtk_tree_store_set(priv->store, &iter,
-                                  BLUETOOTH_COLUMN_POWERED, powered, -1);
                gtk_tree_model_get(GTK_TREE_MODEL(priv->store), &iter,
-                                  BLUETOOTH_COLUMN_DEFAULT, &is_default, -1);
-               if (is_default != FALSE)
-                       g_object_notify (G_OBJECT (client), "default-adapter-powered");
-               notify = TRUE;
-       } else if (g_str_equal(property, "Discoverable") == TRUE) {
-               gboolean discoverable = g_variant_get_boolean(value);
-               gboolean is_default;
+                                  BLUETOOTH_COLUMN_PROXY, &adapter,
+                                  BLUETOOTH_COLUMN_POWERED, &powered, -1);
 
-               gtk_tree_store_set(priv->store, &iter,
-                                  BLUETOOTH_COLUMN_DISCOVERABLE, discoverable, -1);
-               gtk_tree_model_get(GTK_TREE_MODEL(priv->store), &iter,
-                                  BLUETOOTH_COLUMN_DEFAULT, &is_default, -1);
-               if (is_default != FALSE)
-                       g_object_notify (G_OBJECT (client), "default-adapter-discoverable");
-               notify = TRUE;
-       }
+               adapter_path = g_dbus_proxy_get_object_path (adapter);
 
-       if (notify != FALSE) {
-               GtkTreePath *path;
+               found = g_str_equal (path, adapter_path);
 
-               /* Tell the world */
-               path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->store), &iter);
-               gtk_tree_model_row_changed (GTK_TREE_MODEL (priv->store), path, &iter);
-               gtk_tree_path_free (path);
+               g_object_unref (adapter);
+
+               if (found != FALSE) {
+                       GtkTreePath *tree_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->store), 
&iter);
+                       priv->default_adapter = gtk_tree_row_reference_new (GTK_TREE_MODEL (priv->store), 
tree_path);
+                       gtk_tree_path_free (tree_path);
+               }
+
+               gtk_tree_store_set (priv->store, &iter,
+                                   BLUETOOTH_COLUMN_DEFAULT, found, -1);
+
+               cont = gtk_tree_model_iter_next (GTK_TREE_MODEL(priv->store), &iter);
        }
+
+       /* Record the new default adapter */
+       g_object_notify (G_OBJECT (client), "default-adapter");
+       g_object_notify (G_OBJECT (client), "default-adapter-powered");
+       g_object_notify (G_OBJECT (client), "default-adapter-discoverable");
 }
 
 static void
-adapter_g_signal (GDBusProxy      *proxy,
-                 gchar           *sender_name,
-                 gchar           *signal_name,
-                 GVariant        *parameters,
-                 BluetoothClient *client)
+adapter_g_properties_changed (GDBusProxy      *adapter,
+                             GVariant        *changed_p,
+                             GStrv            invalidated_p,
+                             BluetoothClient *client)
 {
-       if (g_strcmp0 (signal_name, "PropertyChanged") == 0) {
-               char *property;
-               GVariant *variant;
-
-               g_variant_get (parameters, "(sv)", &property, &variant);
-               adapter_changed (proxy, property, variant, client);
-               g_free (property);
-               g_variant_unref (variant);
-       } else if (g_strcmp0 (signal_name, "DeviceCreated") == 0) {
-               char *object_path;
-               g_variant_get (parameters, "(o)", &object_path);
-               device_created (ADAPTER (proxy), object_path, client);
-               g_free (object_path);
-       } else if (g_strcmp0 (signal_name, "DeviceRemoved") == 0) {
-               char *object_path;
-               g_variant_get (parameters, "(o)", &object_path);
-               device_removed (proxy, object_path, client);
-               g_free (object_path);
-       } else if (g_strcmp0 (signal_name, "DeviceFound") == 0) {
-               char *address;
-               GVariant *dict;
-               g_variant_get (parameters, "(s a{sv})", &address, &dict);
-               device_found (ADAPTER (proxy), address, dict, client);
-               g_free (address);
-               g_variant_unref (dict);
+       BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
+       GVariantIter i;
+       const char *property;
+       GtkTreeIter iter;
+       GVariant *v;
+       gboolean notify = FALSE;
+
+       if (get_iter_from_proxy (priv->store, &iter, adapter) == FALSE)
+               return;
+
+       g_variant_iter_init (&i, changed_p);
+       while (g_variant_iter_next (&i, "{&sv}", &property, &v)) {
+               if (g_str_equal (property, "Name") == TRUE) {
+                       const gchar *name = g_variant_get_string (v, NULL);
+                       gboolean is_default;
+
+                       gtk_tree_store_set (priv->store, &iter,
+                                           BLUETOOTH_COLUMN_NAME, name, -1);
+                       gtk_tree_model_get (GTK_TREE_MODEL(priv->store), &iter,
+                                           BLUETOOTH_COLUMN_DEFAULT, &is_default, -1);
+                       if (is_default != FALSE)
+                               g_object_notify (G_OBJECT (client), "default-adapter-powered");
+                       notify = TRUE;
+               } else if (g_str_equal (property, "Discovering") == TRUE) {
+                       gboolean discovering = g_variant_get_boolean (v);
+
+                       gtk_tree_store_set (priv->store, &iter,
+                                           BLUETOOTH_COLUMN_DISCOVERING, discovering, -1);
+                       notify = TRUE;
+               } else if (g_str_equal (property, "Powered") == TRUE) {
+                       gboolean powered = g_variant_get_boolean (v);
+                       gboolean is_default;
+
+                       gtk_tree_store_set (priv->store, &iter,
+                                           BLUETOOTH_COLUMN_POWERED, powered, -1);
+                       gtk_tree_model_get (GTK_TREE_MODEL(priv->store), &iter,
+                                           BLUETOOTH_COLUMN_DEFAULT, &is_default, -1);
+                       if (is_default != FALSE)
+                               g_object_notify (G_OBJECT (client), "default-adapter-powered");
+                       notify = TRUE;
+               } else if (g_str_equal (property, "Discoverable") == TRUE) {
+                       gboolean discoverable = g_variant_get_boolean (v);
+                       gboolean is_default;
+
+                       gtk_tree_store_set (priv->store, &iter,
+                                           BLUETOOTH_COLUMN_DISCOVERABLE, discoverable, -1);
+                       gtk_tree_model_get (GTK_TREE_MODEL(priv->store), &iter,
+                                           BLUETOOTH_COLUMN_DEFAULT, &is_default, -1);
+                       if (is_default != FALSE)
+                               g_object_notify (G_OBJECT (client), "default-adapter-discoverable");
+                       notify = TRUE;
+               }
+
+               if (notify != FALSE) {
+                       GtkTreePath *path;
+
+                       /* Tell the world */
+                       path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->store), &iter);
+                       gtk_tree_model_row_changed (GTK_TREE_MODEL (priv->store), path, &iter);
+                       gtk_tree_path_free (path);
+               }
+               g_variant_unref (v);
        }
 }
 
 static void
-adapter_added (Manager         *manager,
+adapter_added (ObjectManager   *manager,
               const char      *path,
+              GVariant        *variant,
               BluetoothClient *client)
 {
        BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
        GtkTreeIter iter;
-       Adapter *adapter;
-       const char **devices;
-       GVariant *variant;
+       Adapter1 *adapter;
        const gchar *address, *name;
+       GVariant *v, *dict;
        gboolean discovering, discoverable, powered;
 
-       variant = NULL;
-       adapter = adapter_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
-                                                 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | 
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
-                                                 BLUEZ_SERVICE,
-                                                 path,
-                                                 NULL,
-                                                 NULL);
-
-       if (adapter_call_get_properties_sync (adapter, &variant, NULL, NULL) == TRUE) {
-               GVariant *v;
-
-               v = g_variant_lookup_value (variant, "Address", G_VARIANT_TYPE_STRING);
-               address = v ? g_variant_get_string (v, NULL) : NULL;
+       adapter = adapter1_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                                  G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
+                                                  BLUEZ_SERVICE,
+                                                  path,
+                                                  NULL,
+                                                  NULL);
 
-               v = g_variant_lookup_value (variant, "Name", G_VARIANT_TYPE_STRING);
-               name = v ? g_variant_get_string (v, NULL) : NULL;
+       dict = g_variant_lookup_value (variant, BLUEZ_ADAPTER_INTERFACE,
+                              G_VARIANT_TYPE_DICTIONARY);
 
-               v = g_variant_lookup_value (variant, "Discovering", G_VARIANT_TYPE_BOOLEAN);
-               discovering = v ? g_variant_get_boolean (v) : FALSE;
+       v = g_variant_lookup_value (dict, "Address", G_VARIANT_TYPE_STRING);
+       address = v ? g_variant_get_string (v, NULL) : NULL;
 
-               v = g_variant_lookup_value (variant, "Powered", G_VARIANT_TYPE_BOOLEAN);
-               powered = v ? g_variant_get_boolean (v) : FALSE;
+       v = g_variant_lookup_value (dict, "Name", G_VARIANT_TYPE_STRING);
+       name = v ? g_variant_get_string (v, NULL) : NULL;
 
-               v = g_variant_lookup_value (variant, "Devices", G_VARIANT_TYPE_OBJECT_PATH_ARRAY);
-               devices = v ? g_variant_get_objv (v, NULL) : NULL;
+       v = g_variant_lookup_value (dict, "Discovering", G_VARIANT_TYPE_BOOLEAN);
+       discovering = v ? g_variant_get_boolean (v) : FALSE;
 
-               v = g_variant_lookup_value (variant, "Discoverable", G_VARIANT_TYPE_BOOLEAN);
-               discoverable = v ? g_variant_get_boolean (v) : FALSE;
+       v = g_variant_lookup_value (dict, "Powered", G_VARIANT_TYPE_BOOLEAN);
+       powered = v ? g_variant_get_boolean (v) : FALSE;
 
-               g_variant_unref (variant);
-       } else {
-               address = NULL;
-               name = NULL;
-               discovering = FALSE;
-               discoverable = FALSE;
-               powered = FALSE;
-               devices = NULL;
-       }
+       v = g_variant_lookup_value (dict, "Discoverable", G_VARIANT_TYPE_BOOLEAN);
+       discoverable = v ? g_variant_get_boolean (v) : FALSE;
 
        gtk_tree_store_insert_with_values(priv->store, &iter, NULL, -1,
                                          BLUETOOTH_COLUMN_PROXY, adapter,
@@ -810,23 +550,16 @@ adapter_added (Manager         *manager,
                                          BLUETOOTH_COLUMN_POWERED, powered,
                                          -1);
 
-       g_signal_connect (G_OBJECT (adapter), "g-signal",
-                         G_CALLBACK (adapter_g_signal), client);
+       g_signal_connect (G_OBJECT (adapter), "g-properties-changed",
+                         G_CALLBACK (adapter_g_properties_changed), client);
 
-       if (devices != NULL) {
-               guint i;
-
-               for (i = 0; devices[i] != NULL; i++) {
-                       device_created (adapter, devices[i], client);
-               }
-               g_free (devices);
-       }
+       default_adapter_changed (manager, path, client);
 
        g_object_unref (adapter);
 }
 
 static void
-adapter_removed (Manager         *manager,
+adapter_removed (ObjectManager   *manager,
                 const char      *path,
                 BluetoothClient *client)
 {
@@ -834,8 +567,7 @@ adapter_removed (Manager         *manager,
        GtkTreeIter iter;
        gboolean cont;
 
-       cont = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(priv->store),
-                                                                       &iter);
+       cont = gtk_tree_model_get_iter_first (GTK_TREE_MODEL(priv->store), &iter);
 
        while (cont == TRUE) {
                GDBusProxy *adapter;
@@ -863,81 +595,72 @@ adapter_removed (Manager         *manager,
                        break;
                }
 
-               cont = gtk_tree_model_iter_next(GTK_TREE_MODEL(priv->store),
-                                                                       &iter);
+               cont = gtk_tree_model_iter_next (GTK_TREE_MODEL(priv->store), &iter);
        }
 }
 
 static void
-default_adapter_changed (Manager         *manager,
-                        const char      *path,
-                        BluetoothClient *client)
+interface_added (BluetoothClient *client,
+                const char *path,
+                GVariant   *variant)
 {
        BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
-       GtkTreeIter iter;
-       gboolean cont;
 
-       cont = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(priv->store),
-                                                                       &iter);
-       if (priv->default_adapter) {
-               gtk_tree_row_reference_free (priv->default_adapter);
-               priv->default_adapter = NULL;
+       if (g_variant_lookup_value (variant, BLUEZ_ADAPTER_INTERFACE,
+                                   G_VARIANT_TYPE_DICTIONARY)) {
+               g_debug ("New Adapter interface added.\n");
+               adapter_added (priv->manager, path, variant, client);
+               return;
        }
 
-       while (cont == TRUE) {
-               GDBusProxy *adapter;
-               const char *adapter_path;
-               gboolean found, powered;
-
-               gtk_tree_model_get(GTK_TREE_MODEL(priv->store), &iter,
-                                  BLUETOOTH_COLUMN_PROXY, &adapter,
-                                  BLUETOOTH_COLUMN_POWERED, &powered, -1);
-
-               adapter_path = g_dbus_proxy_get_object_path(adapter);
+       if (g_variant_lookup_value (variant, BLUEZ_DEVICE_INTERFACE,
+                                   G_VARIANT_TYPE_DICTIONARY)) {
+               g_debug ("New Device interface added.\n");
+               device_added (priv->manager, client, path, variant);
+               return;
+       }
+}
 
-               found = g_str_equal(path, adapter_path);
+static void
+interface_removed (BluetoothClient *client,
+                  const char      *path,
+                  GVariant        *variant)
+{
+       BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
+       const char **ifaces;
+       int i;
 
-               g_object_unref(adapter);
+       ifaces = g_variant_get_strv (variant, NULL);
 
-               if (found != FALSE) {
-                       GtkTreePath *tree_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->store), 
&iter);
-                       priv->default_adapter = gtk_tree_row_reference_new (GTK_TREE_MODEL (priv->store), 
tree_path);
-                       gtk_tree_path_free (tree_path);
+       for (i = 0 ; ifaces[i] != NULL ; i++) {
+               if (g_strcmp0(ifaces[i], BLUEZ_ADAPTER_INTERFACE) == 0) {
+                       adapter_removed(priv->manager, path, client);
+                       return;
                }
 
-               gtk_tree_store_set(priv->store, &iter,
-                                       BLUETOOTH_COLUMN_DEFAULT, found, -1);
-
-               cont = gtk_tree_model_iter_next(GTK_TREE_MODEL(priv->store),
-                                                                       &iter);
+               if (g_strcmp0(ifaces[i], BLUEZ_DEVICE_INTERFACE) == 0) {
+                       device_removed (path, client);
+                       return;
+               }
        }
-
-       /* Record the new default adapter */
-       g_object_notify (G_OBJECT (client), "default-adapter");
-       g_object_notify (G_OBJECT (client), "default-adapter-powered");
-       g_object_notify (G_OBJECT (client), "default-adapter-discoverable");
 }
 
 static void
-manager_g_signal (GDBusProxy      *proxy,
-                 gchar           *sender_name,
-                 gchar           *signal_name,
-                 GVariant        *parameters,
-                 BluetoothClient *client)
+object_manager_g_signal (GDBusProxy      *proxy,
+                        gchar           *sender_name,
+                        gchar           *signal_name,
+                        GVariant        *parameters,
+                        BluetoothClient *client)
 {
        char *object_path;
+       GVariant *variant;
 
-       if (g_strcmp0 (signal_name, "PropertyChanged") == 0)
-               return;
-
-       g_variant_get (parameters, "(o)", &object_path);
+       g_variant_get (parameters, "(o*)", &object_path, &variant);
 
-       if (g_strcmp0 (signal_name, "AdapterAdded") == 0) {
-               adapter_added (MANAGER (proxy), object_path, client);
-       } else if (g_strcmp0 (signal_name, "AdapterRemoved") == 0) {
-               adapter_removed (MANAGER (proxy), object_path, client);
-       } else if (g_strcmp0 (signal_name, "DefaultAdapterChanged") == 0) {
-               default_adapter_changed (MANAGER (proxy), object_path, client);
+       if (g_strcmp0 (signal_name, "InterfacesAdded") == 0) {
+               interface_added (client, object_path, variant);
+       } else if (g_strcmp0 (signal_name, "InterfacesRemoved") == 0) {
+               interface_removed (client, object_path, variant);
        } else {
                g_assert_not_reached ();
        }
@@ -952,43 +675,33 @@ bluez_appeared_cb (GDBusConnection *connection,
                   BluetoothClient *client)
 {
        BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
-       GVariant *variant;
-       const char **array;
-       gchar *default_path = NULL;
+       GVariantIter iter;
+       GVariant *variant, *v, *ifaces;
+       char *key;
 
-       priv->manager = manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
-                                                       G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | 
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
-                                                       BLUEZ_SERVICE,
-                                                       BLUEZ_MANAGER_PATH,
-                                                       NULL,
-                                                       NULL);
+       priv->manager = object_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                                              G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | 
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
+                                                              BLUEZ_SERVICE,
+                                                              BLUEZ_MANAGER_PATH,
+                                                              NULL,
+                                                              NULL);
 
        g_signal_connect (G_OBJECT (priv->manager), "g-signal",
-                         G_CALLBACK (manager_g_signal), client);
+                         G_CALLBACK (object_manager_g_signal), client);
 
        variant = NULL;
-       manager_call_get_properties_sync (MANAGER (priv->manager), &variant, NULL, NULL);
-       if (variant != NULL) {
-               GVariant *v;
-               guint i;
-
-               v = g_variant_lookup_value (variant, "Adapters", G_VARIANT_TYPE_OBJECT_PATH_ARRAY);
-               array = v ? g_variant_get_objv (v, NULL) : NULL;
-
-               if (array != NULL) {
-                       for (i = 0; array[i] != NULL; i++)
-                               adapter_added(priv->manager, array[i], client);
-                       g_free (array);
-               }
+       object_manager_call_get_managed_objects_sync (OBJECT_MANAGER (priv->manager),
+                                                     &variant, NULL, NULL);
+       if (variant == NULL)
+               return;
 
-               g_variant_unref (variant);
+       g_variant_iter_init (&iter, variant);
+       while ((v = g_variant_iter_next_value (&iter))) {
+               g_variant_get (v, "{o*}", &key, &ifaces);
+               interface_added (client, key, ifaces);
        }
 
-       manager_call_default_adapter_sync (priv->manager, &default_path, NULL, NULL);
-       if (default_path != NULL) {
-               default_adapter_changed (priv->manager, default_path, client);
-               g_free(default_path);
-       }
+       g_variant_unref (variant);
 }
 
 static void
@@ -1015,8 +728,6 @@ static void bluetooth_client_init(BluetoothClient *client)
 {
        BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
 
-       g_type_class_ref (BLUETOOTH_TYPE_STATUS);
-
        priv->store = gtk_tree_store_new(_BLUETOOTH_NUM_COLUMNS, G_TYPE_OBJECT,
                                         G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
                                         G_TYPE_UINT, G_TYPE_STRING,
@@ -1152,6 +863,8 @@ _bluetooth_client_set_discoverable (BluetoothClient *client,
 {
        GError *error = NULL;
        GDBusProxy *adapter;
+       Properties *properties;
+       const char *path;
        gboolean ret;
 
        g_return_val_if_fail (BLUETOOTH_IS_CLIENT (client), FALSE);
@@ -1160,24 +873,22 @@ _bluetooth_client_set_discoverable (BluetoothClient *client,
        if (adapter == NULL)
                return FALSE;
 
-       if (discoverable) {
-               ret = adapter_call_set_property_sync (ADAPTER (adapter),
-                                                     "DiscoverableTimeout",
-                                                     g_variant_new_variant (g_variant_new_uint32 (timeout)),
-                                                     NULL, &error);
-               if (ret == FALSE) {
-                       g_warning ("Failed to set DiscoverableTimeout to %d: %s", timeout, error->message);
-                       g_error_free (error);
-                       g_object_unref (adapter);
-                       return ret;
-               }
-       }
+       path = g_dbus_proxy_get_object_path (adapter);
 
-       ret = adapter_call_set_property_sync (ADAPTER (adapter),
-                                             "Discoverable",
-                                             g_variant_new_variant (g_variant_new_boolean (discoverable)),
-                                             NULL, &error);
+       properties = properties_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                                       G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | 
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
+                                                       BLUEZ_SERVICE, path, NULL, NULL);
+
+       if (properties == NULL)
+               return FALSE;
+
+       ret = properties_call_set_sync (properties,
+                                       BLUEZ_ADAPTER_INTERFACE,
+                                       "Discoverable",
+                                       g_variant_new_variant (g_variant_new_boolean (discoverable)),
+                                       NULL, &error);
        if (ret == FALSE) {
+
                g_warning ("Failed to set Discoverable to %d: %s", discoverable, error->message);
                g_error_free (error);
        }
@@ -1198,9 +909,9 @@ _bluetooth_client_set_default_adapter_discovering (BluetoothClient *client,
                return;
 
        if (discover)
-               adapter_call_start_discovery_sync (ADAPTER (adapter), NULL, NULL);
+               adapter1_call_start_discovery_sync (ADAPTER1 (adapter), NULL, NULL);
        else
-               adapter_call_stop_discovery_sync (ADAPTER (adapter), NULL, NULL);
+               adapter1_call_stop_discovery_sync (ADAPTER1 (adapter), NULL, NULL);
 
        g_object_unref(adapter);
 }
@@ -1281,8 +992,6 @@ static void bluetooth_client_finalize(GObject *client)
 
        g_bus_unwatch_name (priv->owner_change_id);
 
-       g_type_class_unref (g_type_class_peek (BLUETOOTH_TYPE_STATUS));
-
        if (priv->manager)
                g_object_unref (priv->manager);
 
@@ -1483,30 +1192,26 @@ GtkTreeModel *bluetooth_client_get_device_model (BluetoothClient *client)
        g_return_val_if_fail (BLUETOOTH_IS_CLIENT (client), NULL);
 
        priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
-       cont = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(priv->store),
-                                                                       &iter);
+       cont = gtk_tree_model_get_iter_first (GTK_TREE_MODEL(priv->store), &iter);
 
        while (cont == TRUE) {
                gboolean is_default;
 
-               gtk_tree_model_get(GTK_TREE_MODEL(priv->store), &iter,
-                               BLUETOOTH_COLUMN_DEFAULT, &is_default, -1);
+               gtk_tree_model_get (GTK_TREE_MODEL(priv->store), &iter,
+                                   BLUETOOTH_COLUMN_DEFAULT, &is_default, -1);
 
                if (is_default == TRUE) {
                        found = TRUE;
                        break;
                }
 
-               cont = gtk_tree_model_iter_next(GTK_TREE_MODEL(priv->store),
-                                                                       &iter);
+               cont = gtk_tree_model_iter_next (GTK_TREE_MODEL(priv->store), &iter);
        }
 
        if (found == TRUE) {
-               path = gtk_tree_model_get_path(GTK_TREE_MODEL(priv->store),
-                                                                       &iter);
-               model = gtk_tree_model_filter_new(GTK_TREE_MODEL(priv->store),
-                                                                       path);
-               gtk_tree_path_free(path);
+               path = gtk_tree_model_get_path (GTK_TREE_MODEL(priv->store), &iter);
+               model = gtk_tree_model_filter_new (GTK_TREE_MODEL(priv->store), path);
+               gtk_tree_path_free (path);
        } else
                model = NULL;
 
@@ -1514,31 +1219,24 @@ GtkTreeModel *bluetooth_client_get_device_model (BluetoothClient *client)
 }
 
 typedef struct {
-       BluetoothClientCreateDeviceFunc func;
-       gpointer data;
+       BluetoothClientSetupFunc func;
        BluetoothClient *client;
 } CreateDeviceData;
 
 static void
-create_device_callback (GDBusProxy       *proxy,
-                       GAsyncResult     *res,
-                       CreateDeviceData *devdata)
+device_pair_callback (GDBusProxy       *proxy,
+                     GAsyncResult     *res,
+                     CreateDeviceData *devdata)
 {
        GError *error = NULL;
-       char *path = NULL;
-       GVariant *ret;
+       const char *path;
 
-       ret = g_dbus_proxy_call_finish (proxy, res, &error);
-       if (ret == NULL) {
-               g_warning ("CreateDevice failed: %s", error->message);
-       } else {
-               g_variant_get (ret, "(o)", &path);
-               g_variant_unref (ret);
-       }
+       if (device1_call_pair_finish (DEVICE1(proxy), res, &error) == FALSE)
+               g_warning ("Pair() failed: %s", error->message);
 
+       path = g_dbus_proxy_get_object_path(proxy);
        if (devdata->func)
-               devdata->func(devdata->client, path, error, devdata->data);
-       g_free (path);
+               devdata->func (devdata->client, error, path);
 
        if (error != NULL)
                g_error_free (error);
@@ -1547,72 +1245,59 @@ create_device_callback (GDBusProxy       *proxy,
        g_free (devdata);
 }
 
-gboolean bluetooth_client_create_device (BluetoothClient *client,
-                                        const char *address,
-                                        const char *agent,
-                                        BluetoothClientCreateDeviceFunc func,
-                                        gpointer data)
+gboolean
+bluetooth_client_setup_device (BluetoothClient          *client,
+                              const char               *path,
+                              const char               *agent,
+                              BluetoothClientSetupFunc  func,
+                              gboolean                  pair)
 {
        BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
        CreateDeviceData *devdata;
-       GDBusProxy *adapter;
-       GtkTreeIter iter;
+       GDBusProxy *adapter, *device;
+       GtkTreeIter iter, adapter_iter;
+       gboolean paired;
+       GError *err = NULL;
 
        g_return_val_if_fail (BLUETOOTH_IS_CLIENT (client), FALSE);
-       g_return_val_if_fail (address != NULL, FALSE);
 
-       adapter = _bluetooth_client_get_default_adapter(client);
-       if (adapter == NULL)
+       if (get_iter_from_path (priv->store, &iter, path) == FALSE)
                return FALSE;
 
-       /* Remove the pairing if it already exists, but only for pairings */
-       if (agent != NULL &&
-           get_iter_from_address(priv->store, &iter, address, adapter) == TRUE) {
-               GDBusProxy *device;
-               gboolean paired;
-               GError *err = NULL;
+       gtk_tree_model_get (GTK_TREE_MODEL(priv->store), &iter,
+                           BLUETOOTH_COLUMN_PROXY, &device,
+                           BLUETOOTH_COLUMN_PAIRED, &paired, -1);
 
-               gtk_tree_model_get (GTK_TREE_MODEL(priv->store), &iter,
-                                   BLUETOOTH_COLUMN_PROXY, &device,
-                                   BLUETOOTH_COLUMN_PAIRED, &paired, -1);
-               if (device != NULL &&
-                   paired != FALSE &&
-                   adapter_call_remove_device_sync (ADAPTER (adapter),
-                                                    g_dbus_proxy_get_object_path (device),
-                                                    NULL, &err) == FALSE) {
-                       g_warning ("Failed to remove device '%s': %s", address,
-                                  err->message);
+       if (paired != FALSE &&
+                       gtk_tree_model_iter_parent (GTK_TREE_MODEL(priv->store),
+                                                   &adapter_iter, &iter)) {
+               gtk_tree_model_get (GTK_TREE_MODEL(priv->store), &adapter_iter,
+                                   BLUETOOTH_COLUMN_PROXY, &adapter, -1);
+               adapter1_call_remove_device_sync (ADAPTER1 (adapter),
+                                                 path,
+                                                 NULL, &err);
+               if (err != NULL) {
+                       g_warning ("Failed to remove device: %s", err->message);
                        g_error_free (err);
                }
-               if (device != NULL)
-                       g_object_unref (device);
+               g_object_unref (adapter);
        }
 
-       devdata = g_new0 (CreateDeviceData, 1);
-       devdata->func = func;
-       devdata->data = data;
-       devdata->client = g_object_ref (client);
-
-       if (agent != NULL)
-               g_dbus_proxy_call (adapter,
-                                  "CreatePairedDevice",
-                                  g_variant_new ("(sos)", address, agent, "DisplayYesNo"),
-                                  G_DBUS_CALL_FLAGS_NONE,
-                                  90 * 1000,
-                                  NULL,
-                                  (GAsyncReadyCallback) create_device_callback,
-                                  devdata);
-       else
-               g_dbus_proxy_call (adapter,
-                                  "CreateDevice",
-                                  g_variant_new ("(s)", address),
-                                  G_DBUS_CALL_FLAGS_NONE,
-                                  90 * 1000,
+       if (pair == TRUE) {
+               devdata = g_new0 (CreateDeviceData, 1);
+               devdata->func = func;
+               devdata->client = g_object_ref (client);
+
+               device1_call_pair (DEVICE1(device),
                                   NULL,
-                                  (GAsyncReadyCallback) create_device_callback,
+                                  (GAsyncReadyCallback) device_pair_callback,
                                   devdata);
-       g_object_unref (adapter);
+       } else {
+               if (func)
+                       func (client, NULL, path);
+       }
 
+       g_object_unref (device);
        return TRUE;
 }
 
@@ -1621,177 +1306,104 @@ bluetooth_client_set_trusted (BluetoothClient *client,
                              const char      *device,
                              gboolean         trusted)
 {
-       BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
-       GtkTreeIter iter;
-       GDBusProxy *proxy;
+       Properties *properties;
+       GError     *error = NULL;
+       gboolean   ret;
 
        g_return_val_if_fail (BLUETOOTH_IS_CLIENT (client), FALSE);
        g_return_val_if_fail (device != NULL, FALSE);
 
-       if (get_iter_from_path (priv->store, &iter, device) == FALSE)
+       properties = properties_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                                       G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | 
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
+                                                       BLUEZ_SERVICE, device, NULL, NULL);
+
+       if (properties == NULL)
                return FALSE;
 
-       gtk_tree_model_get (GTK_TREE_MODEL (priv->store), &iter,
-                           BLUETOOTH_COLUMN_PROXY, &proxy,
-                           -1);
+       ret = properties_call_set_sync (properties, BLUEZ_DEVICE_INTERFACE, "Trusted",
+                                       g_variant_new_variant (g_variant_new_boolean (trusted)),
+                                       NULL, &error);
+       if (ret == FALSE) {
+               g_warning ("Failed to set Trusted to %d: %s", trusted, error->message);
+               g_error_free (error);
+       }
 
-       if (proxy == NULL)
-               return FALSE;
+       g_object_unref (properties);
+       return ret;
+}
 
-       device_call_set_property_sync (DEVICE (proxy),
-                                      "Trusted",
-                                      g_variant_new_variant (g_variant_new_boolean (trusted)),
-                                      NULL, NULL);
+GDBusProxy *
+bluetooth_client_get_device (BluetoothClient *client,
+                            const char       *path)
+{
+       BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
+       GtkTreeIter iter;
+       GDBusProxy *proxy;
 
-       g_object_unref(proxy);
+       if (get_iter_from_path (priv->store, &iter, path) == FALSE) {
+               return NULL;
+       }
 
-       return TRUE;
+       gtk_tree_model_get (GTK_TREE_MODEL(priv->store), &iter,
+                                       BLUETOOTH_COLUMN_PROXY, &proxy,
+                                       -1);
+       return proxy;
 }
 
-typedef struct {
-       GSimpleAsyncResult *simple;
-       /* used for disconnect */
-       GList *services;
-       Device *device;
-} ConnectData;
-
 static void
 connect_callback (GDBusProxy   *proxy,
                  GAsyncResult *res,
-                 ConnectData  *conndata)
+                 GSimpleAsyncResult *simple)
 {
-       GVariant *variant;
        gboolean retval;
        GError *error = NULL;
 
-       variant = g_dbus_proxy_call_finish (proxy, res, &error);
-       if (variant == NULL) {
-               retval = FALSE;
+       retval = device1_call_connect_finish (DEVICE1(proxy), res, &error);
+       if (retval == FALSE) {
                g_debug ("Connect failed for %s: %s",
                         g_dbus_proxy_get_object_path (proxy), error->message);
                g_error_free (error);
        } else {
                g_debug ("Connect succeeded for %s",
                         g_dbus_proxy_get_object_path (proxy));
-               g_variant_unref (variant);
-               retval = TRUE;
        }
 
-       g_simple_async_result_set_op_res_gboolean (conndata->simple, retval);
-       g_simple_async_result_complete_in_idle (conndata->simple);
+       g_simple_async_result_set_op_res_gboolean (simple, retval);
+       g_simple_async_result_complete_in_idle (simple);
 
-       g_object_unref (conndata->simple);
+       g_object_unref (simple);
        g_object_unref (proxy);
-       g_free (conndata);
 }
 
 static void
 disconnect_callback (GDBusProxy   *proxy,
                     GAsyncResult *res,
-                    ConnectData  *conndata)
+                    GSimpleAsyncResult *simple)
 {
        gboolean retval;
        GError *error = NULL;
 
-       if (conndata->services == NULL) {
-               retval = device_call_disconnect_finish (conndata->device, res, &error);
-               if (retval == FALSE) {
-                       g_debug ("Disconnect failed for %s: %s",
-                                g_dbus_proxy_get_object_path (G_DBUS_PROXY (conndata->device)),
-                                error->message);
-                       g_error_free (error);
-               } else {
-                       g_debug ("Disconnect succeeded for %s",
-                                g_dbus_proxy_get_object_path (G_DBUS_PROXY (conndata->device)));
-               }
+       retval = device1_call_disconnect_finish (DEVICE1(proxy), res, &error);
+       if (retval == FALSE) {
+               g_debug ("Disconnect failed for %s: %s",
+                        g_dbus_proxy_get_object_path (proxy),
+                        error->message);
+               g_error_free (error);
        } else {
-               GDBusProxy *service;
-               BluetoothClient *client;
-               GVariant *variant;
-
-               variant = g_dbus_proxy_call_finish (proxy, res, &error);
-               if (variant == NULL) {
-                       retval = FALSE;
-                       g_debug ("Disconnect failed for %s on %s: %s",
-                                g_dbus_proxy_get_object_path (proxy),
-                                g_dbus_proxy_get_interface_name (proxy),
-                                error->message);
-                       g_error_free (error);
-               } else {
-                       g_debug ("Disconnect succeeded for %s on %s",
-                                g_dbus_proxy_get_object_path (proxy),
-                                g_dbus_proxy_get_interface_name (proxy));
-                       g_variant_unref (variant);
-                       retval = TRUE;
-               }
-               g_object_unref (proxy);
-
-               client = (BluetoothClient *) g_async_result_get_source_object (G_ASYNC_RESULT 
(conndata->simple));
-               service = get_proxy_for_iface (DEVICE (conndata->device), conndata->services->data, client);
-               g_object_unref (client);
-
-               conndata->services = g_list_remove (conndata->services, conndata->services->data);
-
-               g_dbus_proxy_call (G_DBUS_PROXY (service),
-                                  "Disconnect",
-                                  g_variant_new ("()"),
-                                  G_DBUS_CALL_FLAGS_NONE,
-                                  -1,
-                                  NULL,
-                                  (GAsyncReadyCallback) disconnect_callback,
-                                  conndata);
-
-               return;
+               g_debug ("Disconnect succeeded for %s",
+                        g_dbus_proxy_get_object_path (proxy));
        }
-
-       g_simple_async_result_set_op_res_gboolean (conndata->simple, retval);
-       g_simple_async_result_complete_in_idle (conndata->simple);
+       g_simple_async_result_set_op_res_gboolean (simple, retval);
+       g_simple_async_result_complete_in_idle (simple);
 
        g_object_unref (proxy);
-       g_clear_object (&conndata->device);
-       g_object_unref (conndata->simple);
-       g_free (conndata);
-}
-
-static int
-service_to_index (const char *service)
-{
-       guint i;
-
-       g_return_val_if_fail (service != NULL, -1);
-
-       for (i = 0; i < G_N_ELEMENTS (connectable_interfaces); i++) {
-               if (g_str_equal (connectable_interfaces[i], service) != FALSE)
-                       return i;
-       }
-       for (i = 0; i < G_N_ELEMENTS (detectable_interfaces); i++) {
-               if (g_str_equal (detectable_interfaces[i], service) != FALSE)
-                       return i + G_N_ELEMENTS (connectable_interfaces);
-       }
-       g_assert_not_reached ();
-
-       return -1;
-}
-
-static int
-rev_sort_services (const char *servicea, const char *serviceb)
-{
-       int a, b;
-
-       a = service_to_index (servicea);
-       b = service_to_index (serviceb);
-
-       if (a < b)
-               return 1;
-       if (a > b)
-               return -1;
-       return 0;
+       g_object_unref (simple);
 }
 
 /**
  * bluetooth_client_connect_service:
  * @client: a #BluetoothClient
- * @device: the DBUS path on which to operate
+ * @path: the object path on which to operate
  * @connect: Whether try to connect or disconnect from services on a device
  * @cancellable: optional #GCancellable object, %NULL to ignore
  * @callback: (scope async): a #GAsyncReadyCallback to call when the connection is complete
@@ -1803,133 +1415,52 @@ rev_sort_services (const char *servicea, const char *serviceb)
  **/
 void
 bluetooth_client_connect_service (BluetoothClient     *client,
-                                 const char          *device,
+                                 const char          *path,
                                  gboolean             connect,
                                  GCancellable        *cancellable,
                                  GAsyncReadyCallback  callback,
                                  gpointer             user_data)
 {
-       GSimpleAsyncResult *simple;
        BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
-       ConnectData *conndata;
-       GDBusProxy *proxy;
-       GHashTable *table;
        GtkTreeIter iter;
-       guint i;
-       gboolean res;
+       GSimpleAsyncResult *simple;
+       GDBusProxy *device;
 
        g_return_if_fail (BLUETOOTH_IS_CLIENT (client));
-       g_return_if_fail (device != NULL);
+       g_return_if_fail (path != NULL);
+
+       if (get_iter_from_path (priv->store, &iter, path) == FALSE)
+               return;
+
+       gtk_tree_model_get (GTK_TREE_MODEL(priv->store), &iter,
+                           BLUETOOTH_COLUMN_PROXY, &device,
+                           -1);
 
        simple = g_simple_async_result_new (G_OBJECT (client),
                                            callback,
                                            user_data,
                                            bluetooth_client_connect_service);
-       res = FALSE;
-
-       if (get_iter_from_path (priv->store, &iter, device) == FALSE)
-               goto bail;
 
        if (cancellable != NULL) {
                g_object_set_data_full (G_OBJECT (simple), "cancellable",
                                        g_object_ref (cancellable), g_object_unref);
-               g_object_set_data_full (G_OBJECT (simple), "device",
-                                       g_strdup (device), g_free);
-       }
-
-       gtk_tree_model_get (GTK_TREE_MODEL (priv->store), &iter,
-                           BLUETOOTH_COLUMN_PROXY, &proxy,
-                           BLUETOOTH_COLUMN_SERVICES, &table,
-                           -1);
-
-       /* No proxy? Let's leave it there */
-       if (proxy == NULL) {
-               if (table != NULL)
-                       g_hash_table_unref (table);
-               g_debug ("Device '%s' has a services table, but no proxy", device);
-               goto bail;
-       }
-
-       if (connect && table == NULL) {
-               g_object_unref (proxy);
-               res = TRUE;
-               goto bail;
        }
 
-       conndata = g_new0 (ConnectData, 1);
-       conndata->simple = simple;
+       simple = simple;
 
        if (connect) {
-               GDBusProxy *service;
-               const char *iface_name;
-
-               iface_name = NULL;
-               for (i = 0; i < G_N_ELEMENTS (connectable_interfaces); i++) {
-                       if (g_hash_table_lookup_extended (table, connectable_interfaces[i], NULL, NULL) != 
FALSE) {
-                               iface_name = connectable_interfaces[i];
-                               break;
-                       }
-               }
-
-               if (iface_name == NULL) {
-                       g_printerr("No supported services on the '%s' device\n", device);
-                       g_hash_table_unref (table);
-                       g_free (conndata);
-                       g_object_unref (proxy);
-                       goto bail;
-               }
-
-               service = get_proxy_for_iface (DEVICE (proxy), iface_name, client);
-
-               g_debug ("Calling 'Connect' on interface %s for %s",
-                        iface_name, g_dbus_proxy_get_object_path (service));
-
-               g_dbus_proxy_call (G_DBUS_PROXY (service),
-                                  "Connect",
-                                  NULL,
-                                  G_DBUS_CALL_FLAGS_NONE,
-                                  -1,
-                                  NULL,
-                                  (GAsyncReadyCallback) connect_callback,
-                                  conndata);
-       } else if (table != NULL) {
-               GDBusProxy *service;
-
-               conndata->device = g_object_ref (DEVICE (proxy));
-               conndata->services = g_hash_table_get_keys (table);
-               g_hash_table_unref (table);
-               conndata->services = g_list_sort (conndata->services, (GCompareFunc) rev_sort_services);
-
-               service = get_proxy_for_iface (conndata->device, conndata->services->data, client);
-
-               g_debug ("Calling 'Disconnect' on interface %s for %s",
-                        (char *) conndata->services->data, g_dbus_proxy_get_object_path (service));
-
-               conndata->services = g_list_remove (conndata->services, conndata->services->data);
-
-               g_dbus_proxy_call (G_DBUS_PROXY (service),
-                                  "Disconnect",
-                                  NULL,
-                                  G_DBUS_CALL_FLAGS_NONE,
-                                  -1,
-                                  NULL,
-                                  (GAsyncReadyCallback) disconnect_callback,
-                                  conndata);
-       } else if (table == NULL) {
-               g_debug ("Calling device_call_disconnect() for %s",
-                        g_dbus_proxy_get_object_path (proxy));
-               device_call_disconnect (DEVICE (proxy),
-                                       NULL,
-                                       (GAsyncReadyCallback) disconnect_callback,
-                                       conndata);
+               device1_call_connect (DEVICE1(device),
+                                     NULL,
+                                     (GAsyncReadyCallback) connect_callback,
+                                     simple);
+       } else {
+               device1_call_disconnect (DEVICE1(device),
+                                        NULL,
+                                        (GAsyncReadyCallback) disconnect_callback,
+                                        simple);
        }
 
-       return;
-
-bail:
-       g_simple_async_result_set_op_res_gboolean (simple, res);
-       g_simple_async_result_complete_in_idle (simple);
-       g_object_unref (simple);
+       g_object_unref (device);
 }
 
 /**
@@ -1958,22 +1489,6 @@ bluetooth_client_connect_service_finish (BluetoothClient *client,
 
 #define BOOL_STR(x) (x ? "True" : "False")
 
-static void
-services_foreach (const char *service, gpointer _value, GString *str)
-{
-       GEnumClass *eclass;
-       GEnumValue *ev;
-       BluetoothStatus status = GPOINTER_TO_INT (_value);
-
-       eclass = g_type_class_ref (BLUETOOTH_TYPE_STATUS);
-       ev = g_enum_get_value (eclass, status);
-       if (ev == NULL)
-               g_warning ("Unknown status value %d", status);
-
-       g_string_append_printf (str, "%s (%s) ", service, ev ? ev->value_nick : "unknown");
-       g_type_class_unref (eclass);
-}
-
 void
 bluetooth_client_dump_device (GtkTreeModel *model,
                              GtkTreeIter *iter)
@@ -1981,7 +1496,6 @@ bluetooth_client_dump_device (GtkTreeModel *model,
        GDBusProxy *proxy;
        char *address, *alias, *name, *icon, **uuids;
        gboolean is_default, paired, trusted, connected, discoverable, discovering, powered, is_adapter;
-       GHashTable *services;
        GtkTreeIter parent;
        guint type;
 
@@ -1998,7 +1512,6 @@ bluetooth_client_dump_device (GtkTreeModel *model,
                            BLUETOOTH_COLUMN_DISCOVERABLE, &discoverable,
                            BLUETOOTH_COLUMN_DISCOVERING, &discovering,
                            BLUETOOTH_COLUMN_POWERED, &powered,
-                           BLUETOOTH_COLUMN_SERVICES, &services,
                            BLUETOOTH_COLUMN_UUIDS, &uuids,
                            BLUETOOTH_COLUMN_PROXY, &proxy,
                            -1);
@@ -2027,14 +1540,6 @@ bluetooth_client_dump_device (GtkTreeModel *model,
                g_print ("\tD-Bus Path: %s\n", proxy ? g_dbus_proxy_get_object_path (proxy) : "(none)");
                g_print ("\tType: %s Icon: %s\n", bluetooth_type_to_string (type), icon);
                g_print ("\tPaired: %s Trusted: %s Connected: %s\n", BOOL_STR(paired), BOOL_STR(trusted), 
BOOL_STR(connected));
-               if (services != NULL) {
-                       GString *str;
-
-                       str = g_string_new (NULL);
-                       g_hash_table_foreach (services, (GHFunc) services_foreach, str);
-                       g_print ("\tServices: %s\n", str->str);
-                       g_string_free (str, TRUE);
-               }
                if (uuids != NULL) {
                        guint i;
                        g_print ("\tUUIDs: ");
@@ -2050,8 +1555,6 @@ bluetooth_client_dump_device (GtkTreeModel *model,
        g_free (icon);
        if (proxy != NULL)
                g_object_unref (proxy);
-       if (services != NULL)
-               g_hash_table_unref (services);
        g_strfreev (uuids);
 }
 
diff --git a/lib/bluetooth-client.h b/lib/bluetooth-client.h
index 9145347..a3d0b35 100644
--- a/lib/bluetooth-client.h
+++ b/lib/bluetooth-client.h
@@ -66,7 +66,7 @@ GtkTreeModel *bluetooth_client_get_adapter_model(BluetoothClient *client);
 GtkTreeModel *bluetooth_client_get_device_model(BluetoothClient *client);
 
 void bluetooth_client_connect_service (BluetoothClient     *client,
-                                      const char          *device,
+                                      const char          *path,
                                       gboolean             connect,
                                       GCancellable        *cancellable,
                                       GAsyncReadyCallback  callback,
diff --git a/lib/gnome-bluetooth.symbols b/lib/gnome-bluetooth.symbols
index c78e4a8..bf292a0 100644
--- a/lib/gnome-bluetooth.symbols
+++ b/lib/gnome-bluetooth.symbols
@@ -16,7 +16,7 @@ bluetooth_chooser_stop_discovery
 bluetooth_chooser_button_get_type
 bluetooth_chooser_button_new
 bluetooth_chooser_button_available
-bluetooth_client_create_device
+bluetooth_client_setup_device
 bluetooth_client_dump_device
 bluetooth_client_get_type
 bluetooth_client_new
@@ -27,6 +27,7 @@ bluetooth_client_get_device_model
 bluetooth_client_connect_service
 bluetooth_client_connect_service_finish
 bluetooth_client_set_trusted
+bluetooth_client_get_device
 bluetooth_class_to_type
 bluetooth_type_to_string
 bluetooth_verify_address
diff --git a/lib/test-client.c b/lib/test-client.c
index 6325170..7bd929d 100644
--- a/lib/test-client.c
+++ b/lib/test-client.c
@@ -121,42 +121,6 @@ legacypairing_to_text(GtkTreeViewColumn *column, GtkCellRenderer *cell,
        }
 }
 
-static void
-services_foreach (const char *service, gpointer value, GString *str)
-{
-       GEnumClass *eclass;
-       GEnumValue *ev;
-       BluetoothStatus status = GPOINTER_TO_INT (value);
-
-       eclass = g_type_class_ref (BLUETOOTH_TYPE_STATUS);
-       ev = g_enum_get_value (eclass, status);
-       if (ev == NULL)
-               g_warning ("Unknown status value %d", status);
-
-       g_string_append_printf (str, "%s (%s) ", service, ev ? ev->value_nick : "unknown");
-       g_type_class_unref (eclass);
-}
-
-static void services_to_text(GtkTreeViewColumn *column, GtkCellRenderer *cell,
-               GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
-{
-       GString *str;
-       GHashTable *services;
-
-       gtk_tree_model_get(model, iter, BLUETOOTH_COLUMN_SERVICES, &services, -1);
-       if (services == NULL) {
-               g_object_set(cell, "text", NULL, NULL);
-               return;
-       }
-
-       str = g_string_new (NULL);
-       g_hash_table_foreach (services, (GHFunc) services_foreach, str);
-       g_object_set(cell, "text", str->str, NULL);
-       g_string_free (str, TRUE);
-
-       g_hash_table_unref (services);
-}
-
 static void uuids_to_text(GtkTreeViewColumn *column, GtkCellRenderer *cell,
                          GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 {
@@ -273,10 +237,6 @@ static void create_window(void)
                                        "text", BLUETOOTH_COLUMN_POWERED, NULL);
 
        gtk_tree_view_insert_column_with_data_func(GTK_TREE_VIEW(tree), -1,
-                                       "Services", gtk_cell_renderer_text_new(),
-                                               services_to_text, NULL, NULL);
-
-       gtk_tree_view_insert_column_with_data_func(GTK_TREE_VIEW(tree), -1,
                                        "UUIDs", gtk_cell_renderer_text_new(),
                                                uuids_to_text, NULL, NULL);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]