From b6be7aac6982e870fefae7db2aa497d3d0af8b7d Mon Sep 17 00:00:00 2001 From: ctf Date: Wed, 8 Jul 2020 14:55:07 +0800 Subject: [PATCH 18/19] add EirData api Signed-off-by: ctf --- src/adapter.c | 1 + src/device.c | 39 +++++++++++++++++++++++++++++++++++++++ src/device.h | 1 + 3 files changed, 41 insertions(+) diff --git a/src/adapter.c b/src/adapter.c index 1472d81..cd54926 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -6014,6 +6014,7 @@ static void update_found_devices(struct btd_adapter *adapter, return; } + device_set_eri_data(dev, data, data_len); device_update_last_seen(dev, bdaddr_type); /* diff --git a/src/device.c b/src/device.c index c1da35c..61f3c41 100644 --- a/src/device.c +++ b/src/device.c @@ -92,6 +92,8 @@ #define GATT_INCLUDE_UUID_STR "2802" #define GATT_CHARAC_UUID_STR "2803" +#define GATT_EIR_DATA_LEN 240 + static DBusConnection *dbus_conn = NULL; static unsigned service_state_cb_id; @@ -262,6 +264,8 @@ struct btd_device { GIOChannel *att_io; guint store_id; + + uint8_t eir_data[GATT_EIR_DATA_LEN]; }; static const uint16_t uuid_list[] = { @@ -727,6 +731,22 @@ static gboolean dev_property_get_address(const GDBusPropertyTable *property, return TRUE; } +static gboolean dev_property_get_eir_data(const GDBusPropertyTable *property, + DBusMessageIter *iter, void *user_data) +{ + struct btd_device *device = user_data; + const char *ptr = device->eir_data; + DBusMessageIter array; + + dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, + DBUS_TYPE_BYTE_AS_STRING, &array); + dbus_message_iter_append_fixed_array(&array, DBUS_TYPE_BYTE, + &ptr, sizeof(device->eir_data)); + dbus_message_iter_close_container(iter, &array); + + return TRUE; +} + static gboolean property_get_address_type(const GDBusPropertyTable *property, DBusMessageIter *iter, void *user_data) { @@ -2755,6 +2775,7 @@ static const GDBusPropertyTable device_properties[] = { NULL, dev_property_advertising_data_exist, G_DBUS_PROPERTY_FLAG_EXPERIMENTAL }, { "MTU", "q", dev_property_get_client_mtu }, + { "EirData", "ay", dev_property_get_eir_data }, { } }; @@ -5597,6 +5618,24 @@ void device_set_flags(struct btd_device *device, uint8_t flags) DEVICE_INTERFACE, "AdvertisingFlags"); } +void device_set_eri_data(struct btd_device *device, const uint8_t *data, uint8_t data_len) +{ + int len; + + if (!device) + return; + + if(!data || data_len <= 0) + return; + + if(!strcmp(device->eir_data, data)) + return; + + len = data_len > GATT_EIR_DATA_LEN ? GATT_EIR_DATA_LEN : data_len; + memset(device->eir_data, 0, GATT_EIR_DATA_LEN); + memcpy(device->eir_data, data, len); +} + bool device_is_connectable(struct btd_device *device) { if (!device) diff --git a/src/device.h b/src/device.h index 06b1004..1f1d7fb 100644 --- a/src/device.h +++ b/src/device.h @@ -107,6 +107,7 @@ void device_set_rssi_with_delta(struct btd_device *device, int8_t rssi, void device_set_rssi(struct btd_device *device, int8_t rssi); void device_set_tx_power(struct btd_device *device, int8_t tx_power); void device_set_flags(struct btd_device *device, uint8_t flags); +void device_set_eri_data(struct btd_device *device, const uint8_t *data, uint8_t data_len); bool btd_device_is_connected(struct btd_device *dev); uint8_t btd_device_get_bdaddr_type(struct btd_device *dev); bool device_is_retrying(struct btd_device *device); -- 2.20.1