diff options
| -rw-r--r-- | audio/device.c | 60 | 
1 files changed, 58 insertions, 2 deletions
| diff --git a/audio/device.c b/audio/device.c index 450b2afe..87ddf5b7 100644 --- a/audio/device.c +++ b/audio/device.c @@ -135,12 +135,67 @@ static void device_unregister(DBusConnection *conn, void *data)  	device_free(device);  } +char *find_adapter(DBusConnection *conn, bdaddr_t *src) +{ +	DBusMessage *msg, *reply; +	DBusError derr; +	char address[18], *addr_ptr = address; +	char *path, *ret; + +	msg = dbus_message_new_method_call("org.bluez", "/org/bluez", +						"org.bluez.Manager", +						"FindAdapter"); +	if (!msg) { +		error("Unable to allocate new method call"); +		return NULL; +	} + +	ba2str(src, address); + +	dbus_message_append_args(msg, DBUS_TYPE_STRING, &addr_ptr, +				 DBUS_TYPE_INVALID); + +	dbus_error_init(&derr); +	reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, +								&derr); + +	dbus_message_unref(msg); + +	if (dbus_error_is_set(&derr) || +				dbus_set_error_from_message(&derr, reply)) { +		error("FindAdapter(%s) failed: %s", address, derr.message); +		dbus_error_free(&derr); +		return NULL; +	} + +	dbus_error_init(&derr); +	dbus_message_get_args(reply, &derr, +				DBUS_TYPE_STRING, &path, +				DBUS_TYPE_INVALID); + +	if (dbus_error_is_set(&derr)) { +		error("Unable to get message args"); +		dbus_message_unref(reply); +		dbus_error_free(&derr); +		return FALSE; +	} + +	ret = g_strdup(path); + +	dbus_message_unref(reply); + +	debug("Got path %s for adapter with address %s", ret, address); + +	return ret; +} +  struct device *device_register(DBusConnection *conn,  					const char *path, bdaddr_t *bda)  {  	struct device *dev;  	bdaddr_t src;  	int dev_id; +	char *adapter_path;  	if (!conn || !path)  		return NULL; @@ -150,6 +205,8 @@ struct device *device_register(DBusConnection *conn,  	if ((dev_id < 0) || (hci_devba(dev_id, &src) < 0))  		return NULL; +	adapter_path = find_adapter(conn, &src); +  	dev = g_new0(struct device, 1);  	if (!dbus_connection_create_object_path(conn, path, dev, @@ -171,8 +228,7 @@ struct device *device_register(DBusConnection *conn,  	bacpy(&dev->dst, bda);  	bacpy(&dev->src, &src);  	dev->conn = dbus_connection_ref(conn); -	dev->adapter_path = g_malloc0(16); -	snprintf(dev->adapter_path, 16, "/org/bluez/hci%d", dev_id); +	dev->adapter_path = adapter_path;  	return dev;  } | 
