tools/btpclient: Add solicit uuid16 service list support for ad 63/205063/1
authorGrzegorz Kolodziejczyk <grzegorz.kolodziejczyk@codecoup.pl>
Wed, 28 Feb 2018 12:41:27 +0000 (13:41 +0100)
committerAmit Purwar <amit.purwar@samsung.com>
Mon, 29 Apr 2019 04:19:18 +0000 (09:49 +0530)
This patch adds support to get/set solicit uuid16 service list in
advertising data.

Change-Id: I6088d8b4c1a1d0e926e9ade45715662dde0823b8
Signed-off-by: Amit Purwar <amit.purwar@samsung.com>
tools/btpclient.c

index daa2e87..932310e 100644 (file)
@@ -44,6 +44,7 @@
 #define AD_TYPE_INCOMPLETE_UUID16_SERVICE_LIST 0x02
 #define AD_TYPE_SHORT_NAME                     0x08
 #define AD_TYPE_TX_POWER                       0x0a
+#define AD_TYPE_SOLICIT_UUID16_SERVICE_LIST    0x14
 #define AD_TYPE_SERVICE_DATA_UUID16            0x16
 #define AD_TYPE_APPEARANCE                     0x19
 #define AD_TYPE_MANUFACTURER_DATA              0xff
@@ -97,6 +98,7 @@ static struct ad {
        struct l_queue *uuids;
        struct l_queue *services;
        struct l_queue *manufacturers;
+       struct l_queue *solicits;
        bool tx_power;
        bool name;
        bool appearance;
@@ -449,6 +451,7 @@ static void ad_cleanup(void)
        l_queue_destroy(ad.uuids, l_free);
        l_queue_destroy(ad.services, ad_cleanup_service);
        l_queue_destroy(ad.manufacturers, l_free);
+       l_queue_destroy(ad.solicits, l_free);
 
        memset(&ad, 0, sizeof(ad));
 }
@@ -762,6 +765,7 @@ static void ad_init(void)
        ad.uuids = l_queue_new();
        ad.services = l_queue_new();
        ad.manufacturers = l_queue_new();
+       ad.solicits = l_queue_new();
 
        ad.local_appearance = UINT16_MAX;
 }
@@ -882,6 +886,27 @@ static bool ad_manufacturerdata_getter(struct l_dbus *dbus,
        return true;
 }
 
+static bool ad_solicituuids_getter(struct l_dbus *dbus,
+                                       struct l_dbus_message *message,
+                                       struct l_dbus_message_builder *builder,
+                                       void *user_data)
+{
+       const struct l_queue_entry *entry;
+
+       if (l_queue_isempty(ad.solicits))
+               return false;
+
+       l_dbus_message_builder_enter_array(builder, "s");
+
+       for (entry = l_queue_get_entries(ad.solicits); entry;
+                                                       entry = entry->next)
+               l_dbus_message_builder_append_basic(builder, 's', entry->data);
+
+       l_dbus_message_builder_leave_array(builder);
+
+       return true;
+}
+
 static bool ad_includes_getter(struct l_dbus *dbus,
                                        struct l_dbus_message *message,
                                        struct l_dbus_message_builder *builder,
@@ -981,6 +1006,8 @@ static void setup_ad_interface(struct l_dbus_interface *interface)
        l_dbus_interface_property(interface, "ManufacturerData", 0,
                                        "a{qv}", ad_manufacturerdata_getter,
                                        NULL);
+       l_dbus_interface_property(interface, "SolicitUUIDs", 0, "as",
+                                               ad_solicituuids_getter, NULL);
        l_dbus_interface_property(interface, "Includes", 0, "as",
                                                ad_includes_getter, NULL);
        l_dbus_interface_property(interface, "LocalName", 0, "s",
@@ -1095,6 +1122,14 @@ static void create_advertising_data(uint8_t adv_data_len, const uint8_t *data)
 
                        break;
                }
+               case AD_TYPE_SOLICIT_UUID16_SERVICE_LIST:
+               {
+                       char *uuid = dupuuid2str(ad_data, 16);
+
+                       l_queue_push_tail(ad.solicits, uuid);
+
+                       break;
+               }
                default:
                        l_info("Unsupported advertising data type");