bluetooth: Add support for transport created by external profile
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 12 Nov 2012 10:26:02 +0000 (12:26 +0200)
committerTanu Kaskinen <tanuk@iki.fi>
Wed, 19 Dec 2012 10:31:47 +0000 (12:31 +0200)
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
src/modules/bluetooth/bluetooth-util.h

index 14368da6fca0aeb72d28a2c955de6bca723620e1..e09e17012ec7f9753e0605c940bf1fef5f23cb0f 100644 (file)
@@ -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);
index 874baa01862143542459e656a46e51c3fffb0f7a..95dd5c67fd5554fad53824723258e12dde115dcb 100644 (file)
@@ -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;