diff --git a/src/adapter.c b/src/adapter.c
index fe25608..c9ce6b5 100644
--- a/src/adapter.c
+++ b/src/adapter.c
*/
/* current discovery filter, if any */
struct mgmt_cp_start_service_discovery *current_discovery_filter;
+ struct watch_client *client; /* active discovery client */
GSList *discovery_found; /* list of found devices */
guint discovery_idle_timeout; /* timeout between discovery runs */
{
struct watch_client *client = user_data;
+ DBG("%p", client);
+
if (client->watch)
g_dbus_remove_watch(dbus_conn, client->watch);
g_free(client);
}
-static void discovery_remove(struct watch_client *client, bool exit)
+static void discovery_remove(struct watch_client *client)
{
struct btd_adapter *adapter = client->adapter;
adapter->discovery_list = g_slist_remove(adapter->discovery_list,
client);
- if (!exit && client->discovery_filter)
+ if (adapter->client == client)
+ adapter->client = NULL;
+
+ if (client->watch && client->discovery_filter)
adapter->set_filter_list = g_slist_prepend(
adapter->set_filter_list, client);
else
static void trigger_start_discovery(struct btd_adapter *adapter, guint delay);
-static void discovery_reply(struct watch_client *client, uint8_t status)
+static struct watch_client *discovery_complete(struct btd_adapter *adapter,
+ uint8_t status)
{
+ struct watch_client *client = adapter->client;
DBusMessage *reply;
+ if (!client)
+ return NULL;
+
+ adapter->client = NULL;
+
if (!client->msg)
- return;
+ return client;
if (!status) {
g_dbus_send_reply(dbus_conn, client->msg, DBUS_TYPE_INVALID);
dbus_message_unref(client->msg);
client->msg = NULL;
+
+ return client;
}
static void start_discovery_complete(uint8_t status, uint16_t length,
return;
}
- client = adapter->discovery_list->data;
-
if (length < sizeof(*rp)) {
btd_error(adapter->dev_id,
"Wrong size of start discovery return parameters");
- if (client->msg)
- goto fail;
+ discovery_complete(adapter, MGMT_STATUS_FAILED);
return;
}
else
adapter->filtered_discovery = false;
- discovery_reply(client, status);
+ discovery_complete(adapter, status);
if (adapter->discovering)
return;
return;
}
-fail:
/* Reply with an error if the first discovery has failed */
- if (client->msg) {
- discovery_reply(client, status);
- discovery_remove(client, false);
+ client = discovery_complete(adapter, status);
+ if (client) {
+ discovery_remove(client);
return;
}
cp.type = new_type;
mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
- adapter->dev_id, sizeof(cp), &cp,
- start_discovery_complete, adapter, NULL);
+ adapter->dev_id, sizeof(cp), &cp,
+ start_discovery_complete, adapter,
+ NULL);
+
return FALSE;
}
DBG("status 0x%02x", status);
- /* Is there are no clients the discovery must have been stopped while
- * discovery command was pending.
- */
- if (!adapter->discovery_list)
- return;
-
- client = adapter->discovery_list->data;
-
- discovery_reply(client, status);
-
- if (status != MGMT_STATUS_SUCCESS)
- goto done;
+ client = discovery_complete(adapter, status);
+ if (client)
+ discovery_remove(client);
adapter->discovery_type = 0x00;
adapter->discovery_enable = 0x00;
ADAPTER_INTERFACE, "Discovering");
trigger_passive_scanning(adapter);
-
-done:
- discovery_remove(client, false);
}
static int compare_sender(gconstpointer a, gconstpointer b)
return -EINPROGRESS;
}
-static int discovery_stop(struct watch_client *client, bool exit)
+static int discovery_stop(struct watch_client *client)
{
struct btd_adapter *adapter = client->adapter;
struct mgmt_cp_stop_discovery cp;
/* Check if there are more client discovering */
if (g_slist_next(adapter->discovery_list)) {
- discovery_remove(client, exit);
+ discovery_remove(client);
update_discovery_filter(adapter);
return 0;
}
* and so it is enough to send out the signal and just return.
*/
if (adapter->discovery_enable == 0x00) {
- discovery_remove(client, exit);
+ discovery_remove(client);
adapter->discovering = false;
g_dbus_emit_property_changed(dbus_conn, adapter->path,
ADAPTER_INTERFACE, "Discovering");
}
cp.type = adapter->discovery_type;
+ adapter->client = client;
mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
- adapter->dev_id, sizeof(cp), &cp,
- stop_discovery_complete, adapter, NULL);
+ adapter->dev_id, sizeof(cp), &cp,
+ stop_discovery_complete, adapter, NULL);
return -EINPROGRESS;
}
DBG("owner %s", client->owner);
- discovery_stop(client, true);
+ client->watch = 0;
+
+ discovery_stop(client);
}
/*
/* If the discovery has to be started wait it complete to reply */
if (err == -EINPROGRESS) {
client->msg = dbus_message_ref(msg);
+ adapter->client = client;
return NULL;
}
if (client->msg)
return btd_error_busy(msg);
- err = discovery_stop(client, false);
+ err = discovery_stop(client);
switch (err) {
case 0:
return dbus_message_new_method_return(msg);
case -EINPROGRESS:
client->msg = dbus_message_ref(msg);
+ adapter->client = client;
return NULL;
default:
return btd_error_failed(msg, strerror(-err));