From c6a33252221dff904cf277e085e2ce70aced8788 Mon Sep 17 00:00:00 2001 From: Daniels Umanovskis Date: Fri, 1 Nov 2019 16:03:19 +0100 Subject: [PATCH] dbus: Add support for reading manufacturer data from advertisement packets --- dbus/gattlib_advertisement.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/dbus/gattlib_advertisement.c b/dbus/gattlib_advertisement.c index 028a4ed..1fe3f33 100644 --- a/dbus/gattlib_advertisement.c +++ b/dbus/gattlib_advertisement.c @@ -56,8 +56,33 @@ int get_advertisement_data_from_device(OrgBluezDevice1 *bluez_device1, *manufacturer_data_size = 0; manufacturer_data_variant = org_bluez_device1_get_manufacturer_data(bluez_device1); if (manufacturer_data_variant != NULL) { - fprintf(stderr, "Warning: Manufacturer Data not supported: %s\n", + if (g_variant_n_children(manufacturer_data_variant) != 1) { + fprintf(stderr, "Warning: Manufacturer Data with multiple children: %s\n", g_variant_print(manufacturer_data_variant, TRUE)); + return GATTLIB_NOT_SUPPORTED; + } + GVariant* manufacturer_data_dict = g_variant_get_child_value(manufacturer_data_variant, 0); + GVariantIter *iter; + GVariant* values; + + g_variant_get(manufacturer_data_dict, "{qv}", manufacturer_id, &values); + *manufacturer_data_size = g_variant_n_children(values); + + *manufacturer_data = calloc(*manufacturer_data_size, sizeof(guchar)); + if (*manufacturer_data == NULL) { + return GATTLIB_OUT_OF_MEMORY; + } + + GVariant* value; + g_variant_get(values, "ay", &iter); + size_t index = 0; + + while (value = g_variant_iter_next_value(iter)) + { + g_variant_get(value, "y", &(*manufacturer_data)[index++]); + g_variant_unref(value); + } + g_variant_iter_free(iter); } service_data_variant = org_bluez_device1_get_service_data(bluez_device1);