summaryrefslogtreecommitdiff
path: root/src/modules/bluetooth/bluetooth-util.c
diff options
context:
space:
mode:
authorMikel Astiz <mikel.astiz@bmw-carit.de>2013-05-10 10:30:44 +0200
committerArun Raghavan <arun.raghavan@collabora.co.uk>2013-06-04 00:38:42 +0530
commit2f79fb580ad583b2492b567d32630e7e03883855 (patch)
treeef43fa18951bcac33d5a815bb899cec19d47f52a /src/modules/bluetooth/bluetooth-util.c
parent235611a7d13ab251689f5b480183d7f39e043a2e (diff)
downloadpulseaudio-2f79fb580ad583b2492b567d32630e7e03883855.tar.gz
bluetooth: Parse media transport's properties
Add the code to parse the properties of the media transport object when a PropertiesChanged signal is received. Note that the transport might have an owner other than BlueZ, and thus the property changes would be emitted from arbitrary senders. For performance reasons, the installed match considers the interface name where the property has changed. It could be possible to install and remove the D-Bus matches dynamically when a new owner is registered/unregistered, but filtering based on the interface name seems good enough already.
Diffstat (limited to 'src/modules/bluetooth/bluetooth-util.c')
-rw-r--r--src/modules/bluetooth/bluetooth-util.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
index a32227aeb..a0e68113d 100644
--- a/src/modules/bluetooth/bluetooth-util.c
+++ b/src/modules/bluetooth/bluetooth-util.c
@@ -1094,6 +1094,24 @@ static int transport_parse_property(pa_bluetooth_transport *t, DBusMessageIter *
return 0;
}
+static int parse_transport_properties(pa_bluetooth_transport *t, DBusMessageIter *i) {
+ DBusMessageIter element_i;
+
+ dbus_message_iter_recurse(i, &element_i);
+
+ while (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) {
+ DBusMessageIter dict_i;
+
+ dbus_message_iter_recurse(&element_i, &dict_i);
+
+ transport_parse_property(t, &dict_i);
+
+ dbus_message_iter_next(&element_i);
+ }
+
+ return 0;
+}
+
static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *userdata) {
DBusError err;
pa_bluetooth_discovery *y;
@@ -1315,6 +1333,13 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us
}
parse_device_properties(d, &arg_i, true);
+ } else if (pa_streq(interface, "org.bluez.MediaTransport1")) {
+ pa_bluetooth_transport *t;
+
+ if (!(t = pa_hashmap_get(y->transports, dbus_message_get_path(m))))
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+ parse_transport_properties(t, &arg_i);
}
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
@@ -1979,6 +2004,8 @@ pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c) {
"type='signal',sender='org.bluez',interface='org.freedesktop.DBus.ObjectManager',member='InterfacesRemoved'",
"type='signal',sender='org.bluez',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'"
",arg0='org.bluez.Device1'",
+ "type='signal',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'"
+ ",arg0='org.bluez.MediaTransport1'",
NULL) < 0) {
pa_log("Failed to add D-Bus matches: %s", err.message);
goto fail;
@@ -2056,6 +2083,8 @@ void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *y) {
"type='signal',sender='org.bluez',interface='org.freedesktop.DBus.ObjectManager',member='InterfacesRemoved'",
"type='signal',sender='org.bluez',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'"
",arg0='org.bluez.Device1'",
+ "type='signal',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'"
+ ",arg0='org.bluez.MediaTransport1'",
NULL);
if (y->filter_added)