diff --git a/doc/adapter-api.txt b/doc/adapter-api.txt
index 08de6cd..03b5611 100644
--- a/doc/adapter-api.txt
+++ b/doc/adapter-api.txt
int16 RSSI : RSSI threshold value
uint16 Pathloss : Pathloss threshold value
string Transport : type of scan to run
+ bool ResetData : Reset advertisement data
When a remote device is found that advertises any UUID
from UUIDs, it will be reported if:
the RSSI delta-threshold, that is imposed by
StartDiscovery by default, will not be applied.
+ If ResetData is enabled PropertiesChanged signals will
+ be generated for either ManufacturerData and ServiceData
+ everytime they are discovered.
+
When multiple clients call SetDiscoveryFilter, their
filters are internally merged, and notifications about
new devices are sent to all clients. Therefore, each
diff --git a/src/adapter.c b/src/adapter.c
index 3935460..a2c8b44 100644
--- a/src/adapter.c
+++ b/src/adapter.c
uint16_t pathloss;
int16_t rssi;
GSList *uuids;
+ bool reset;
};
struct watch_client {
return true;
}
+static bool parse_reset_data(DBusMessageIter *value, bool *duplicates)
+{
+ if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_BOOLEAN)
+ return false;
+
+ dbus_message_iter_get_basic(value, duplicates);
+
+ return true;
+}
+
static bool parse_discovery_filter_entry(char *key, DBusMessageIter *value,
struct discovery_filter *filter)
{
if (!strcmp("Transport", key))
return parse_transport(value, &filter->type);
+ if (!strcmp("ResetData", key))
+ return parse_reset_data(value, &filter->reset);
+
DBG("Unknown key parameter: %s!\n", key);
return false;
}
(*filter)->pathloss = DISTANCE_VAL_INVALID;
(*filter)->rssi = DISTANCE_VAL_INVALID;
(*filter)->type = get_scan_type(adapter);
+ (*filter)->reset = false;
dbus_message_iter_init(msg, &iter);
if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
(*filter)->rssi != DISTANCE_VAL_INVALID)
goto invalid_args;
- DBG("filtered discovery params: transport: %d rssi: %d pathloss: %d",
- (*filter)->type, (*filter)->rssi, (*filter)->pathloss);
+ DBG("filtered discovery params: transport: %d rssi: %d pathloss: %d "
+ " reset data: %s ", (*filter)->type, (*filter)->rssi,
+ (*filter)->pathloss, (*filter)->reset ? "true" : "false");
return true;
return got_match;
}
+static void filter_reset_data(void *data, void *user_data)
+{
+ struct watch_client *client = data;
+ bool *reset = user_data;
+
+ if (*reset || !client->discovery_filter)
+ return;
+
+ *reset = client->discovery_filter->reset;
+}
+
static void update_found_devices(struct btd_adapter *adapter,
const bdaddr_t *bdaddr,
uint8_t bdaddr_type, int8_t rssi,
struct eir_data eir_data;
bool name_known, discoverable;
char addr[18];
+ bool reset = false;
memset(&eir_data, 0, sizeof(eir_data));
eir_parse(&eir_data, data, data_len);
device_add_eir_uuids(dev, eir_data.services);
+ if (adapter->discovery_list)
+ g_slist_foreach(adapter->discovery_list, filter_reset_data,
+ &reset);
+
if (eir_data.msd_list) {
- device_set_manufacturer_data(dev, eir_data.msd_list);
+ device_set_manufacturer_data(dev, eir_data.msd_list, reset);
adapter_msd_notify(adapter, dev, eir_data.msd_list);
}
if (eir_data.sd_list)
- device_set_service_data(dev, eir_data.sd_list);
+ device_set_service_data(dev, eir_data.sd_list, reset);
if (bdaddr_type != BDADDR_BREDR)
device_set_flags(dev, eir_data.flags);
diff --git a/src/device.c b/src/device.c
index fb9c0e7..f34d408 100644
--- a/src/device.c
+++ b/src/device.c
DEVICE_INTERFACE, "ManufacturerData");
}
-void device_set_manufacturer_data(struct btd_device *dev, GSList *list)
+void device_set_manufacturer_data(struct btd_device *dev, GSList *list,
+ bool reset)
{
+ if (reset)
+ bt_ad_clear_manufacturer_data(dev->ad);
+
g_slist_foreach(list, add_manufacturer_data, dev);
}
DEVICE_INTERFACE, "ServiceData");
}
-void device_set_service_data(struct btd_device *dev, GSList *list)
+void device_set_service_data(struct btd_device *dev, GSList *list,
+ bool reset)
{
+ if (reset)
+ bt_ad_clear_service_data(dev->ad);
+
g_slist_foreach(list, add_service_data, dev);
}
diff --git a/src/device.h b/src/device.h
index 3cab366..5f56918 100644
--- a/src/device.h
+++ b/src/device.h
bool device_attach_att(struct btd_device *dev, GIOChannel *io);
void btd_device_add_uuid(struct btd_device *device, const char *uuid);
void device_add_eir_uuids(struct btd_device *dev, GSList *uuids);
-void device_set_manufacturer_data(struct btd_device *dev, GSList *list);
-void device_set_service_data(struct btd_device *dev, GSList *list);
+void device_set_manufacturer_data(struct btd_device *dev, GSList *list,
+ bool reset);
+void device_set_service_data(struct btd_device *dev, GSList *list, bool reset);
void device_probe_profile(gpointer a, gpointer b);
void device_remove_profile(gpointer a, gpointer b);
struct btd_adapter *device_get_adapter(struct btd_device *device);