Return-Path: Subject: Port bluetooth-sendto to BlueZ 4.x From: Bastien Nocera To: linux-bluetooth@vger.kernel.org Content-Type: multipart/mixed; boundary="=-pFLtaNx8oOcqOOO59eeu" Date: Tue, 23 Sep 2008 17:55:42 -0700 Message-Id: <1222217742.10497.130.camel@snoogens.fab.redhat.com> Mime-Version: 1.0 Sender: linux-bluetooth-owner@vger.kernel.org List-ID: --=-pFLtaNx8oOcqOOO59eeu Content-Type: text/plain Content-Transfer-Encoding: 7bit Patch attached. --=-pFLtaNx8oOcqOOO59eeu Content-Disposition: attachment; filename="0001-Fix-getting-names-of-remote-devices.patch" Content-Type: text/x-patch; name="0001-Fix-getting-names-of-remote-devices.patch"; charset="UTF-8" Content-Transfer-Encoding: 7bit >From 71bd2202a5407af206f2476de20e379d8bbea264 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Tue, 23 Sep 2008 17:53:49 -0700 Subject: [PATCH] Fix getting names of remote devices Look in the BlueZ device database to find the name of the remote device, porting code from BlueZ 3.x to the 4.x APIs --- sendto/main.c | 80 +++++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 52 insertions(+), 28 deletions(-) diff --git a/sendto/main.c b/sendto/main.c index daccf91..044bbbc 100644 --- a/sendto/main.c +++ b/sendto/main.c @@ -415,52 +415,76 @@ static void create_notify(DBusGProxy *proxy, G_TYPE_INVALID); } +static char * +get_name (DBusGProxy *device) +{ + GHashTable *hash; + + if (dbus_g_proxy_call(device, "GetProperties", NULL, + G_TYPE_INVALID, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), + &hash, G_TYPE_INVALID) != FALSE) { + GValue *value; + char *name; + + value = g_hash_table_lookup(hash, "Name"); + name = value ? g_value_dup_string(value) : NULL; + g_hash_table_destroy(hash); + return name; + } + + return NULL; +} + static gchar *get_device_name(const gchar *address) { DBusGConnection *connection; - DBusGProxy *manager, *proxy; - gchar *adapter, *name; + DBusGProxy *manager; + GPtrArray *adapters; + gchar *name; + guint i; + + name = NULL; connection = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); if (connection == NULL) - return NULL; + return name; manager = dbus_g_proxy_new_for_name(connection, "org.bluez", - "/org/bluez", "org.bluez.Manager"); + "/", "org.bluez.Manager"); if (manager == NULL) { dbus_g_connection_unref(connection); - return NULL; + return name; } - if (dbus_g_proxy_call(manager, "DefaultAdapter", NULL, G_TYPE_INVALID, - G_TYPE_STRING, &adapter, G_TYPE_INVALID) == FALSE) { + if (dbus_g_proxy_call(manager, "ListAdapters", NULL, + G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &adapters, + G_TYPE_INVALID) == FALSE) { g_object_unref(manager); dbus_g_connection_unref(connection); - return NULL; + return name; } - g_object_unref(manager); - - proxy = dbus_g_proxy_new_for_name(connection, "org.bluez", - adapter, "org.bluez.Adapter"); - if (proxy == NULL) { - g_free(adapter); - dbus_g_connection_unref(connection); - return NULL; - } - - g_free(adapter); - - if (dbus_g_proxy_call(proxy, "GetRemoteName", NULL, - G_TYPE_STRING, address, G_TYPE_INVALID, - G_TYPE_STRING, &name, G_TYPE_INVALID) == FALSE) { - g_object_unref(proxy); - dbus_g_connection_unref(connection); - return NULL; + for (i = 0; i < adapters->len && name == NULL; i++) + { + DBusGProxy *adapter; + char *device_path; + + adapter = dbus_g_proxy_new_for_name(connection, "org.bluez", + g_ptr_array_index (adapters, i), "org.bluez.Adapter"); + if (dbus_g_proxy_call(adapter, "FindDevice", NULL, + G_TYPE_STRING, address, G_TYPE_INVALID, + DBUS_TYPE_G_OBJECT_PATH, &device_path, G_TYPE_INVALID) != FALSE) { + DBusGProxy *device; + device = dbus_g_proxy_new_for_name(connection, "org.bluez", device_path, "org.bluez.Device"); + name = get_name(device); + g_object_unref(device); + break; + } + g_object_unref(adapter); } - g_object_unref(proxy); - + g_ptr_array_free(adapters, TRUE); + g_object_unref(manager); dbus_g_connection_unref(connection); return name; -- 1.6.0.1 --=-pFLtaNx8oOcqOOO59eeu--