diff --git a/doc/adapter-api.txt b/doc/adapter-api.txt
index efc1031..7a587fb 100644
--- a/doc/adapter-api.txt
+++ b/doc/adapter-api.txt
resolving. Use StopDiscovery to release the sessions
acquired.
- This process will start emitting DevicesFound and
- PropertyChanged "Discovering" signals.
+ This process will start creating Device objects as
+ new devices are discovered.
Possible errors: org.bluez.Error.NotReady
org.bluez.Error.Failed
Possible errors: org.bluez.Error.InvalidArguments
org.bluez.Error.Failed
-Signals DevicesFound(array{object path, dict values})
-
- This signal will be sent every time devices have
- been found. In general they only appear during a
- device discovery.
-
- The dictionary contains the properties from the
- org.bluez.Device1 interface.
-
Properties string Address [readonly]
The Bluetooth device address.
diff --git a/src/adapter.c b/src/adapter.c
index b0b45ca..9b83afe 100644
--- a/src/adapter.c
+++ b/src/adapter.c
#define MODE_UNKNOWN 0xff
#define REMOVE_TEMP_TIMEOUT (3 * 60)
-#define PENDING_FOUND_MAX 5
static const char *base_path = "/org/bluez";
static GSList *adapter_drivers = NULL;
};
struct discovery {
- guint id;
GSList *found;
- GSList *pending;
};
struct btd_adapter {
return NULL;
}
-static void send_devices_found(struct btd_adapter *adapter)
-{
- struct discovery *discovery = adapter->discovery;
- DBusConnection *conn = btd_get_dbus_connection();
- DBusMessageIter iter, props;
- DBusMessage *signal;
-
- if (!discovery || !discovery->pending)
- return;
-
- signal = dbus_message_new_signal(adapter->path, ADAPTER_INTERFACE,
- "DevicesFound");
- if (!signal) {
- error("Unable to allocate DevicesFound signal");
- g_slist_free(discovery->pending);
- discovery->pending = NULL;
- return;
- }
-
- dbus_message_iter_init_append(signal, &iter);
- dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{oa{sv}}",
- &props);
-
- while (discovery->pending) {
- struct btd_device *dev = discovery->pending->data;
- const char *path = device_get_path(dev);
- DBusMessageIter entry;
-
- dbus_message_iter_open_container(&props, DBUS_TYPE_DICT_ENTRY,
- NULL, &entry);
- dbus_message_iter_append_basic(&entry, DBUS_TYPE_OBJECT_PATH,
- &path);
- g_dbus_get_properties(conn, path, DEVICE_INTERFACE, &entry);
- dbus_message_iter_close_container(&props, &entry);
-
- discovery->pending = g_slist_remove(discovery->pending, dev);
- }
-
- dbus_message_iter_close_container(&iter, &props);
-
- g_dbus_send_message(conn, signal);
-}
-
static void invalidate_rssi(gpointer a)
{
struct btd_device *dev = a;
if (!discovery)
return;
- if (discovery->id > 0)
- g_source_remove(discovery->id);
-
- send_devices_found(adapter);
-
adapter->discovery = NULL;
g_slist_free_full(discovery->found, invalidate_rssi);
adapter->devices = g_slist_remove(adapter->devices, dev);
- if (discovery) {
+ if (discovery)
discovery->found = g_slist_remove(discovery->found, dev);
- discovery->pending = g_slist_remove(discovery->pending, dev);
- }
adapter->connections = g_slist_remove(adapter->connections, dev);
{ }
};
-static const GDBusSignalTable adapter_signals[] = {
- { GDBUS_SIGNAL("DevicesFound",
- GDBUS_ARGS({ "devices", "a{oa{sv}}" })) },
- { }
-};
-
static const GDBusPropertyTable adapter_properties[] = {
{ "Address", "s", adapter_property_get_address },
{ "Name", "s", adapter_property_get_name, adapter_property_set_name },
if (!g_dbus_register_interface(btd_get_dbus_connection(),
path, ADAPTER_INTERFACE,
- adapter_methods, adapter_signals,
+ adapter_methods, NULL,
adapter_properties, adapter,
adapter_free)) {
error("Adapter interface init failed on path %s", path);
adapter->allow_name_changes = allow_name_changes;
}
-static gboolean send_found(gpointer user_data)
-{
- struct btd_adapter *adapter = user_data;
- struct discovery *discovery = adapter->discovery;
-
- if (!discovery)
- return FALSE;
-
- discovery->id = 0;
-
- if (!discovery->pending)
- return FALSE;
-
- send_devices_found(adapter);
-
- discovery->id = g_timeout_add_seconds(1, send_found, adapter);
-
- return FALSE;
-}
-
static gboolean adapter_remove_temp(gpointer data)
{
struct btd_adapter *adapter = data;
void adapter_set_discovering(struct btd_adapter *adapter,
gboolean discovering)
{
- struct discovery *discovery;
guint connect_list_len;
if (discovering && !adapter->discovery)
adapter->discovery = g_new0(struct discovery, 1);
- discovery = adapter->discovery;
-
g_dbus_emit_property_changed(btd_get_dbus_connection(), adapter->path,
ADAPTER_INTERFACE, "Discovering");
g_source_remove(adapter->remove_temp);
adapter->remove_temp = 0;
}
- discovery->id = g_timeout_add_seconds(1, send_found, adapter);
return;
}
eir_data_free(&eir_data);
- if (!g_slist_find(discovery->pending, dev)) {
- guint pending_count;
-
- discovery->pending = g_slist_prepend(discovery->pending, dev);
-
- pending_count = g_slist_length(discovery->pending);
-
- if (discovery->id == 0) {
- discovery->id = g_idle_add(send_found, adapter);
- } else if (pending_count > PENDING_FOUND_MAX) {
- g_source_remove(discovery->id);
- discovery->id = g_idle_add(send_found, adapter);
- }
- }
-
if (g_slist_find(discovery->found, dev))
return;