From 31d905aaae738969e9d63b8fb46ef92259fffbf0 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 12 Nov 2012 12:26:02 +0200 Subject: [PATCH] bluetooth: Add support for transport created by external profile With BlueZ 5 it is possible to have profile registered by a third party process which does not share the same bus id as bluetoothd so it is necessary to store the sender of the transport to be able to talk to it. Note that this is backward compatible. --- src/modules/bluetooth/bluetooth-util.c | 14 +++++++++----- src/modules/bluetooth/bluetooth-util.h | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c index 14368da6f..e09e17012 100644 --- a/src/modules/bluetooth/bluetooth-util.c +++ b/src/modules/bluetooth/bluetooth-util.c @@ -153,6 +153,7 @@ static void transport_free(pa_bluetooth_transport *t) { for (i = 0; i < PA_BLUETOOTH_TRANSPORT_HOOK_MAX; i++) pa_hook_done(&t->hooks[i]); + pa_xfree(t->owner); pa_xfree(t->path); pa_xfree(t->config); pa_xfree(t); @@ -1042,7 +1043,7 @@ int pa_bluetooth_transport_acquire(pa_bluetooth_transport *t, const char *access dbus_error_init(&err); - pa_assert_se(m = dbus_message_new_method_call("org.bluez", t->path, "org.bluez.MediaTransport", "Acquire")); + pa_assert_se(m = dbus_message_new_method_call(t->owner, t->path, "org.bluez.MediaTransport", "Acquire")); pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_STRING, &accesstype, DBUS_TYPE_INVALID)); r = dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(t->y->connection), m, -1, &err); @@ -1078,7 +1079,7 @@ void pa_bluetooth_transport_release(pa_bluetooth_transport *t, const char *acces dbus_error_init(&err); - pa_assert_se(m = dbus_message_new_method_call("org.bluez", t->path, "org.bluez.MediaTransport", "Release")); + pa_assert_se(m = dbus_message_new_method_call(t->owner, t->path, "org.bluez.MediaTransport", "Release")); pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_STRING, &accesstype, DBUS_TYPE_INVALID)); dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(t->y->connection), m, -1, &err); @@ -1105,12 +1106,13 @@ static int setup_dbus(pa_bluetooth_discovery *y) { return 0; } -static pa_bluetooth_transport *transport_new(pa_bluetooth_discovery *y, const char *path, enum profile p, const uint8_t *config, int size) { +static pa_bluetooth_transport *transport_new(pa_bluetooth_discovery *y, const char *owner, const char *path, enum profile p, const uint8_t *config, int size) { pa_bluetooth_transport *t; unsigned i; t = pa_xnew0(pa_bluetooth_transport, 1); t->y = y; + t->owner = pa_xstrdup(owner); t->path = pa_xstrdup(path); t->profile = p; t->config_size = size; @@ -1130,7 +1132,7 @@ static DBusMessage *endpoint_set_configuration(DBusConnection *conn, DBusMessage pa_bluetooth_discovery *y = userdata; pa_bluetooth_device *d; pa_bluetooth_transport *t; - const char *path, *dev_path = NULL, *uuid = NULL; + const char *sender, *path, *dev_path = NULL, *uuid = NULL; uint8_t *config = NULL; int size = 0; pa_bool_t nrec = FALSE; @@ -1199,7 +1201,9 @@ static DBusMessage *endpoint_set_configuration(DBusConnection *conn, DBusMessage else p = PROFILE_A2DP_SOURCE; - t = transport_new(y, path, p, config, size); + sender = dbus_message_get_sender(m); + + t = transport_new(y, sender, path, p, config, size); if (nrec) t->nrec = nrec; pa_hashmap_put(d->transports, t->path, t); diff --git a/src/modules/bluetooth/bluetooth-util.h b/src/modules/bluetooth/bluetooth-util.h index 874baa018..95dd5c67f 100644 --- a/src/modules/bluetooth/bluetooth-util.h +++ b/src/modules/bluetooth/bluetooth-util.h @@ -72,6 +72,7 @@ typedef enum pa_bluetooth_transport_hook { struct pa_bluetooth_transport { pa_bluetooth_discovery *y; + char *owner; char *path; enum profile profile; uint8_t codec;