Re: [PATCH v3 BlueZ 2/2] gatt-database: Add support for Included service

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

 



Hi Avichal,

On Mon, Mar 19, 2018 at 2:02 PM, Avichal Agarwal <avichal.a@xxxxxxxxxxx> wrote:
> Add support of included services in gatt server.While
> registring the service new property is added
> "includes"
>         array{object} type  [read-only]
>         Array of object paths representing the included
>         services of this service.
> ---
>  src/gatt-database.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 83 insertions(+)
>
> diff --git a/src/gatt-database.c b/src/gatt-database.c
> index 9a33ae7..d1acc65 100644
> --- a/src/gatt-database.c
> +++ b/src/gatt-database.c
> @@ -109,6 +109,7 @@ struct external_service {
>         uint16_t attr_cnt;
>         struct queue *chrcs;
>         struct queue *descs;
> +       struct queue *includes;
>  };
>
>  struct external_profile {
> @@ -444,12 +445,20 @@ static void desc_free(void *data)
>         free(desc);
>  }
>
> +static void inc_free(void *data)
> +{
> +       struct external_desc *inc = data;
> +
> +       free(inc);
> +}
> +
>  static void service_free(void *data)
>  {
>         struct external_service *service = data;
>
>         queue_destroy(service->chrcs, chrc_free);
>         queue_destroy(service->descs, desc_free);
> +       queue_destroy(service->includes,inc_free );
>
>         if (service->attrib)
>                 gatt_db_remove_service(service->app->database->db,
> @@ -1533,6 +1542,7 @@ static struct external_service *create_service(struct gatt_app *app,
>         service->proxy = g_dbus_proxy_ref(proxy);
>         service->chrcs = queue_new();
>         service->descs = queue_new();
> +       service->includes = queue_new();
>
>         /* Add 1 for the service declaration */
>         if (!incr_attr_count(service, 1)) {
> @@ -1616,6 +1626,39 @@ static bool parse_uuid(GDBusProxy *proxy, bt_uuid_t *uuid)
>         return true;
>  }
>
> +static bool parse_includes(GDBusProxy *proxy, struct external_service *service)
> +{
> +       DBusMessageIter iter;
> +       DBusMessageIter array;
> +       char *obj;
> +
> +       if (!g_dbus_proxy_get_property(proxy, "Includes", &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_OBJECT_PATH)
> +                       return false;
> +
> +               dbus_message_iter_get_basic(&array, &obj);
> +
> +               if (queue_push_tail(service->includes,obj)){
> +                       DBG("Included paths added\n");
> +                       incr_attr_count(service ,1);
> +               }else {
> +                       error("Failed to add Includes path in que\n");
> +                       return FALSE;
> +               }
> +
> +       } while (dbus_message_iter_next(&array));
> +
> +       return true;
> +}
> +
>  static bool parse_primary(GDBusProxy *proxy, bool *primary)
>  {
>         DBusMessageIter iter;
> @@ -2488,6 +2531,40 @@ fail:
>         gatt_db_attribute_write_result(attrib, id, BT_ATT_ERROR_UNLIKELY);
>  }
>
> +static void include_services(void *data ,void *userdata)
> +{
> +       char *obj = (char *)data;
> +       struct external_service *service = (struct external_service *)userdata;
> +       struct gatt_db_attribute *attrib=NULL;
> +       struct external_service  *service_inc=NULL;
> +
> +       DBG("object path receieved %s,",obj);
> +
> +       service_inc = queue_find(service->app->services, match_service_by_path, obj);
> +       if(service_inc) {
> +
> +               if (!(service)->attrib)
> +                       error("service attibute not found\n");
> +
> +               if (!service_inc->attrib)
> +                       error("include attribute not found\n");
> +
> +               attrib = gatt_db_service_add_included((service)->attrib ,service_inc->attrib);
> +               if (attrib == NULL)
> +                       error("include service attributes failed\n");
> +               else
> +                       (service)->attrib = attrib;
> +
> +       } else
> +               error("include service not found\n");
> +
> +}
> +
> +static void database_add_includes(struct external_service *service)
> +{
> +       queue_foreach(service->includes,include_services,service );
> +}
> +
>  static bool database_add_chrc(struct external_service *service,
>                                                 struct external_chrc *chrc)
>  {
> @@ -2560,11 +2637,17 @@ static bool database_add_service(struct external_service *service)
>                 return false;
>         }
>
> +       if (!parse_includes(service->proxy,service))
> +               error("Failed to read \"Includes\" property of service");
> +
>         service->attrib = gatt_db_add_service(service->app->database->db, &uuid,
>                                                 primary, service->attr_cnt);
>         if (!service->attrib)
>                 return false;
>
> +       database_add_includes(service);
> +       DBG("ATTR count %d\n",service->attr_cnt);
> +
>         entry = queue_get_entries(service->chrcs);
>         while (entry) {
>                 struct external_chrc *chrc = entry->data;
> --
> 2.7.4

I don't see the patch v3 for 1/2, have you actually sent it?


-- 
Luiz Augusto von Dentz
--
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