On Sat, 2013-09-21 at 14:02 +0300, Tanu Kaskinen wrote: > On Wed, 2013-09-18 at 16:17 -0500, jprvita at gmail.com wrote: > > From: Jo?o Paulo Rechi Vita <jprvita at openbossa.org> > > > > Parse the arguments of the InterfacesAdded signal and the > > GetManagedObjects() reply. > > > > This code is based on previous work by Mikel Astiz. > > --- > > src/modules/bluetooth/bluez5-util.c | 72 +++++++++++++++++++++++++++++++++++-- > > 1 file changed, 70 insertions(+), 2 deletions(-) > > > > diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez5-util.c > > index bf4a046..7f0a7ec 100644 > > --- a/src/modules/bluetooth/bluez5-util.c > > +++ b/src/modules/bluetooth/bluez5-util.c > > @@ -38,6 +38,7 @@ > > #include "bluez5-util.h" > > > > #define BLUEZ_SERVICE "org.bluez" > > +#define BLUEZ_ADAPTER_INTERFACE BLUEZ_SERVICE ".Adapter1" > > #define BLUEZ_DEVICE_INTERFACE BLUEZ_SERVICE ".Device1" > > #define BLUEZ_MEDIA_ENDPOINT_INTERFACE BLUEZ_SERVICE ".MediaEndpoint1" > > #define BLUEZ_MEDIA_TRANSPORT_INTERFACE BLUEZ_SERVICE ".MediaTransport1" > > @@ -379,6 +380,73 @@ static void adapter_remove_all(pa_bluetooth_discovery *y) { > > } > > } > > > > +static void parse_interfaces_and_properties(pa_bluetooth_discovery *y, DBusMessageIter *dict_i) { > > + DBusMessageIter element_i; > > + const char *path; > > + > > + pa_assert(dbus_message_iter_get_arg_type(dict_i) == DBUS_TYPE_OBJECT_PATH); > > + dbus_message_iter_get_basic(dict_i, &path); > > + > > + pa_assert_se(dbus_message_iter_next(dict_i)); > > + pa_assert(dbus_message_iter_get_arg_type(dict_i) == DBUS_TYPE_ARRAY); > > + > > + dbus_message_iter_recurse(dict_i, &element_i); > > + > > + while (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) { > > + DBusMessageIter iface_i; > > + const char *interface; > > + > > + dbus_message_iter_recurse(&element_i, &iface_i); > > + > > + pa_assert(dbus_message_iter_get_arg_type(&iface_i) == DBUS_TYPE_STRING); > > + dbus_message_iter_get_basic(&iface_i, &interface); > > + > > + pa_assert_se(dbus_message_iter_next(&iface_i)); > > + pa_assert(dbus_message_iter_get_arg_type(&iface_i) == DBUS_TYPE_ARRAY); > > + > > + if (pa_streq(interface, BLUEZ_ADAPTER_INTERFACE)) { > > + pa_bluetooth_adapter *a; > > + > > + if ((a = pa_hashmap_get(y->adapters, path))) { > > + pa_log_error("Found duplicated D-Bus path for device %s", path); > > + return; > > + } else > > + a = adapter_create(y, path); > > + > > + pa_log_debug("Adapter %s found", path); > > + > > + /* TODO: parse adapter properties and register endpoints */ > > + > > + } else if (pa_streq(interface, BLUEZ_DEVICE_INTERFACE)) { > > + pa_bluetooth_device *d; > > + > > + if ((d = pa_hashmap_get(y->devices, path))) { > > + if (d->device_info_valid == 1) { > > + pa_log_error("Found duplicated D-Bus path for device %s", path); > > + return; > > + } > > + > > + if (d->device_info_valid == -1) { > > + pa_log_notice("Device %s was known before but had invalid information, reseting", path); > > + d->device_info_valid = 0; > > Didn't we agree that the device shouldn't be reset? If the device is > reset, the device properties should be reset too, otherwise the old > property values can leak to the new initialization. But as discussed > last round, resetting the property values is error prone, so if the > device initialization fails once, then the device should stay > uninitialized forever. We don't need to resurrect failed devices. Never mind, I see you fixed this in a later patch (it would have been good to fix it already in this patch, but no big deal). -- Tanu