advertising: Add Data implementation 80/204980/1
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Tue, 17 Apr 2018 13:56:18 +0000 (16:56 +0300)
committerAmit Purwar <amit.purwar@samsung.com>
Mon, 29 Apr 2019 04:04:09 +0000 (09:34 +0530)
This adds the support for Data property.

Change-Id: I1e2f7ad6c05b9e470e49c30563eb5573a4453e90
Signed-off-by: Amit Purwar <amit.purwar@samsung.com>
src/advertising.c

index 53fc89e..b087b48 100644 (file)
@@ -583,6 +583,64 @@ static bool parse_timeout(DBusMessageIter *iter,
        return true;
 }
 
+static bool parse_data(DBusMessageIter *iter, struct btd_adv_client *client)
+{
+       DBusMessageIter entries;
+
+       if (!iter) {
+               bt_ad_clear_data(client->data);
+               return true;
+       }
+
+       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
+               return false;
+
+       dbus_message_iter_recurse(iter, &entries);
+
+       bt_ad_clear_data(client->data);
+
+       while (dbus_message_iter_get_arg_type(&entries)
+                                               == DBUS_TYPE_DICT_ENTRY) {
+               DBusMessageIter value, entry, array;
+               uint8_t type;
+               uint8_t *data;
+               int len;
+
+               dbus_message_iter_recurse(&entries, &entry);
+               dbus_message_iter_get_basic(&entry, &type);
+
+               dbus_message_iter_next(&entry);
+
+               if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_VARIANT)
+                       goto fail;
+
+               dbus_message_iter_recurse(&entry, &value);
+
+               if (dbus_message_iter_get_arg_type(&value) != DBUS_TYPE_ARRAY)
+                       goto fail;
+
+               dbus_message_iter_recurse(&value, &array);
+
+               if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_BYTE)
+                       goto fail;
+
+               dbus_message_iter_get_fixed_array(&array, &data, &len);
+
+               DBG("Adding Data for type 0x%02x len %u", type, len);
+
+               if (!bt_ad_add_data(client->data, type, data, len))
+                       goto fail;
+
+               dbus_message_iter_next(&entries);
+       }
+
+       return true;
+
+fail:
+       bt_ad_clear_data(client->data);
+       return false;
+}
+
 static struct adv_parser {
        const char *name;
        bool (*func)(DBusMessageIter *iter, struct btd_adv_client *client);
@@ -597,6 +655,7 @@ static struct adv_parser {
        { "Appearance", parse_appearance },
        { "Duration", parse_duration },
        { "Timeout", parse_timeout },
+       { "Data", parse_data },
        { },
 };