[PATCH v4 14/41] bluetooth: Parse BlueZ 5 D-Bus interfaces

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.

-- 
Tanu



[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux