Re: [PATCH BlueZ 7/8] core/gatt: Add Flags property to GattDescriptor

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

 



Hi Luiz,

> On Mon, Apr 27, 2015 at 6:14 AM, Luiz Augusto von Dentz <luiz.dentz@xxxxxxxxx> wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
>
> This adds the implementation of Flags property to GattDescriptor
> interface and properly convert it to permissions when adding the
> descriptor to the database.
> ---
>  src/gatt-database.c | 107 +++++++++++++++++++++++++++++++++++++++++-----------
>  1 file changed, 86 insertions(+), 21 deletions(-)
>
> diff --git a/src/gatt-database.c b/src/gatt-database.c
> index 9397bff..57e60a5 100644
> --- a/src/gatt-database.c
> +++ b/src/gatt-database.c
> @@ -119,6 +119,8 @@ struct external_desc {
>         struct external_service *service;
>         char *chrc_path;
>         GDBusProxy *proxy;
> +       uint8_t props;
> +       uint8_t ext_props;

Again, it doesn't make much sense to store "props" and "ext_props" for
descriptors as these are characteristic concepts. Just store the
permissions in a "perms" variable or something similar.

>         struct gatt_db_attribute *attrib;
>         bool handled;
>         struct queue *pending_reads;
> @@ -1202,26 +1204,16 @@ static bool check_service_path(GDBusProxy *proxy,
>         return g_strcmp0(service_path, service->path) == 0;
>  }
>
> -static bool parse_flags(GDBusProxy *proxy, uint8_t *props, uint8_t *ext_props)
> +static bool parse_chrc_flags(DBusMessageIter *array, uint8_t *props,
> +                                                       uint8_t *ext_props)
>  {
> -       DBusMessageIter iter, array;
>         const char *flag;
>
> -       *props = *ext_props = 0;
> -
> -       if (!g_dbus_proxy_get_property(proxy, "Flags", &iter))
> -               return false;
> -
> -       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY)
> -               return false;
> -
> -       dbus_message_iter_recurse(&iter, &array);
> -
>         do {
> -               if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_STRING)
> +               if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_STRING)
>                         return false;
>
> -               dbus_message_iter_get_basic(&array, &flag);
> +               dbus_message_iter_get_basic(array, &flag);
>
>                 if (!strcmp("broadcast", flag))
>                         *props |= BT_GATT_PROP_BROADCAST;
> @@ -1257,7 +1249,50 @@ static bool parse_flags(GDBusProxy *proxy, uint8_t *props, uint8_t *ext_props)
>                         error("Invalid characteristic flag: %s", flag);
>                         return false;
>                 }
> -       } while (dbus_message_iter_next(&array));
> +       } while (dbus_message_iter_next(array));
> +
> +       if (*ext_props)
> +               *props |= BT_GATT_PROP_EXT_PROP;
> +
> +       return true;
> +}
> +
> +static bool parse_desc_flags(DBusMessageIter *array, uint8_t *props,
> +                                                       uint8_t *ext_props)
> +{
> +       const char *flag;
> +
> +       do {
> +               if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_STRING)
> +                       return false;
> +
> +               dbus_message_iter_get_basic(array, &flag);
> +
> +               if (!strcmp("read", flag))
> +                       *props |= BT_GATT_PROP_READ;
> +               else if (!strcmp("write-without-response", flag))
> +                       *props |= BT_GATT_PROP_WRITE_WITHOUT_RESP;
> +               else if (!strcmp("write", flag))
> +                       *props |= BT_GATT_PROP_WRITE;
> +               else if (!strcmp("authenticated-signed-writes", flag))
> +                       *props |= BT_GATT_PROP_AUTH;
> +               else if (!strcmp("encrypt-read", flag)) {
> +                       *props |= BT_GATT_PROP_READ;
> +                       *ext_props |= BT_GATT_EXT_PROP_ENC_READ;
> +               } else if (!strcmp("encrypt-write", flag)) {
> +                       *props |= BT_GATT_PROP_WRITE;
> +                       *ext_props |= BT_GATT_EXT_PROP_ENC_WRITE;
> +               } else if (!strcmp("encrypt-authenticated-read", flag)) {
> +                       *props |= BT_GATT_PROP_READ;
> +                       *ext_props |= BT_GATT_EXT_PROP_AUTH_READ;
> +               } else if (!strcmp("encrypt-authenticated-write", flag)) {
> +                       *props |= BT_GATT_PROP_WRITE;
> +                       *ext_props |= BT_GATT_EXT_PROP_AUTH_WRITE;
> +               } else {
> +                       error("Invalid descriptor flag: %s", flag);
> +                       return false;
> +               }
> +       } while (dbus_message_iter_next(array));
>
>         if (*ext_props)
>                 *props |= BT_GATT_PROP_EXT_PROP;
> @@ -1265,6 +1300,28 @@ static bool parse_flags(GDBusProxy *proxy, uint8_t *props, uint8_t *ext_props)
>         return true;
>  }
>
> +static bool parse_flags(GDBusProxy *proxy, uint8_t *props, uint8_t *ext_props)
> +{
> +       DBusMessageIter iter, array;
> +       const char *iface;
> +
> +       *props = *ext_props = 0;
> +
> +       if (!g_dbus_proxy_get_property(proxy, "Flags", &iter))
> +               return false;
> +
> +       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY)
> +               return false;
> +
> +       dbus_message_iter_recurse(&iter, &array);
> +
> +       iface = g_dbus_proxy_get_interface(proxy);
> +       if (!strcmp(iface, GATT_CHRC_IFACE))
> +               return parse_chrc_flags(&array, props, ext_props);
> +
> +       return parse_desc_flags(&array, props, ext_props);
> +}
> +
>  static void proxy_added_cb(GDBusProxy *proxy, void *user_data)
>  {
>         struct external_service *service = user_data;
> @@ -1376,6 +1433,16 @@ static void proxy_added_cb(GDBusProxy *proxy, void *user_data)
>                         return;
>                 }
>
> +               /*
> +                * Parse descriptors flags here since they are used to
> +                * determine the permission the descriptor should have
> +                */
> +               if (!parse_flags(proxy, &desc->props, &desc->ext_props)) {
> +                       error("Failed to parse characteristic properties");
> +                       service->failed = true;
> +                       return;
> +               }
> +
>                 queue_push_tail(service->descs, desc);
>         } else {
>                 DBG("Ignoring unrelated interface: %s", iface);
> @@ -1896,19 +1963,17 @@ static bool database_add_desc(struct external_service *service,
>                                                 struct external_desc *desc)
>  {
>         bt_uuid_t uuid;
> +       uint32_t perm;
>
>         if (!parse_uuid(desc->proxy, &uuid)) {
>                 error("Failed to read \"UUID\" property of descriptor");
>                 return false;
>         }
>
> -       /*
> -        * TODO: Set permissions based on a D-Bus property of the external
> -        * descriptor.
> -        */
> +       perm = permissions_from_props(desc->props, desc->ext_props);
>         desc->attrib = gatt_db_service_add_descriptor(service->attrib, &uuid,
> -                                       BT_ATT_PERM_READ | BT_ATT_PERM_WRITE,
> -                                       desc_read_cb, desc_write_cb, desc);
> +                                                       perm, desc_read_cb,
> +                                                       desc_write_cb, desc);
>         if (!desc->attrib) {
>                 error("Failed to create descriptor entry in database");
>                 return false;
> --
> 2.1.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

Thanks,
Arman
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux