summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/adapter-api.txt24
-rw-r--r--src/adapter.c17
-rw-r--r--src/dbus-hci.c27
3 files changed, 36 insertions, 32 deletions
diff --git a/doc/adapter-api.txt b/doc/adapter-api.txt
index 4a915d7f..a97ee921 100644
--- a/doc/adapter-api.txt
+++ b/doc/adapter-api.txt
@@ -54,31 +54,31 @@ Methods dict GetProperties()
Possible Errors: org.bluez.Error.DoesNotExist
- void DiscoverDevices()
+ void StartDiscovery()
- This method starts the device discovery procedure. This
+ This method starts the device discovery session. This
includes an inquiry procedure and remote device name
- resolving.
+ resolving. Use StopDiscovery to release the sessions
+ acquired.
- On start up this process will generate a DiscoveryStarted
- signal and then return DeviceFound singals. If the
- procedure has been finished an DiscoveryCompleted
- signal will be sent.
+ This process will start emitting DeviceFound and
+ PropertyChanged "Discovering" signals.
Possible errors: org.bluez.Error.NotReady
org.bluez.Error.Failed
- org.bluez.Error.InProgress
- org.bluez.Error.NoSuchAdapter
- void CancelDiscovery()
+ void StopDiscovery()
- This method will cancel any previous DiscoverDevices
+ This method will cancel any previous StartDiscovery
transaction.
+ Note that a discovery procedure is shared between all
+ discovery sessions thus calling StopDiscovery will only
+ release a single session.
+
Possible errors: org.bluez.Error.NotReady
org.bluez.Error.Failed
org.bluez.Error.NotAuthorized
- org.bluez.Error.NoSuchAdapter
object FindDevice(string address)
diff --git a/src/adapter.c b/src/adapter.c
index 36cac369..4f30bbfb 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -1413,7 +1413,7 @@ static int start_periodic_inquiry(struct btd_adapter *adapter)
return 0;
}
-static DBusMessage *adapter_discover_devices(DBusConnection *conn,
+static DBusMessage *adapter_start_discovery(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct session_req *req;
@@ -1450,7 +1450,7 @@ done:
return dbus_message_new_method_return(msg);
}
-static DBusMessage *adapter_cancel_discovery(DBusConnection *conn,
+static DBusMessage *adapter_stop_discovery(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct btd_adapter *adapter = data;
@@ -1973,8 +1973,8 @@ static GDBusMethodTable adapter_methods[] = {
{ "RequestMode", "s", "", request_mode,
G_DBUS_METHOD_FLAG_ASYNC},
{ "ReleaseMode", "", "", release_mode },
- { "DiscoverDevices", "", "", adapter_discover_devices},
- { "CancelDiscovery", "", "", adapter_cancel_discovery,
+ { "StartDiscovery", "", "", adapter_start_discovery },
+ { "StopDiscovery", "", "", adapter_stop_discovery,
G_DBUS_METHOD_FLAG_ASYNC},
{ "ListDevices", "", "ao", list_devices },
{ "CreateDevice", "s", "o", create_device,
@@ -2777,15 +2777,11 @@ void adapter_set_state(struct btd_adapter *adapter, int state)
if (adapter->state == state)
return;
- if (state & PERIODIC_INQUIRY || state & STD_INQUIRY) {
+ if (state & PERIODIC_INQUIRY || state & STD_INQUIRY)
discov_active = TRUE;
- if (adapter->scheduler_id)
- goto done;
- } else if (adapter->disc_sessions && adapter->state & STD_INQUIRY) {
+ else if (adapter->disc_sessions && main_opts.inqmode)
adapter->scheduler_id = g_timeout_add(main_opts.inqmode * 1000,
(GSourceFunc) start_inquiry, adapter);
- goto done;
- }
if (!discov_active && adapter->found_devices) {
g_slist_foreach(adapter->found_devices, (GFunc) g_free, NULL);
@@ -2803,7 +2799,6 @@ void adapter_set_state(struct btd_adapter *adapter, int state)
ADAPTER_INTERFACE, "Discovering",
DBUS_TYPE_BOOLEAN, &discov_active);
-done:
adapter->state = state;
}
diff --git a/src/dbus-hci.c b/src/dbus-hci.c
index 3776456c..f04694d4 100644
--- a/src/dbus-hci.c
+++ b/src/dbus-hci.c
@@ -714,12 +714,6 @@ void hcid_dbus_inquiry_complete(bdaddr_t *local)
!(adapter_get_state(adapter) & STD_INQUIRY))
adapter_update_oor_devices(adapter);
- /* reset the discover type to be able to handle D-Bus and non D-Bus
- * requests */
- state = adapter_get_state(adapter);
- state &= ~STD_INQUIRY;
- adapter_set_state(adapter, state);
-
/*
* The following scenarios can happen:
* 1. standard inquiry: always send discovery completed signal
@@ -731,7 +725,15 @@ void hcid_dbus_inquiry_complete(bdaddr_t *local)
*
* Keep in mind that non D-Bus requests can arrive.
*/
- found_device_req_name(adapter);
+ if (found_device_req_name(adapter) == 0)
+ return;
+
+ /* reset the discover type to be able to handle D-Bus and non D-Bus
+ * requests */
+ state = adapter_get_state(adapter);
+ state &= ~STD_INQUIRY;
+ state &= ~PERIODIC_INQUIRY;
+ adapter_set_state(adapter, state);
}
void hcid_dbus_periodic_inquiry_start(bdaddr_t *local, uint8_t status)
@@ -884,7 +886,7 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class,
state |= PERIODIC_INQUIRY;
adapter_set_state(adapter, state);
}
- /* Out of range list update */
+ /* Out of range list update */
if (adapter_get_state(adapter) & PERIODIC_INQUIRY)
adapter_remove_oor_device(adapter, peer_addr);
@@ -989,6 +991,7 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status,
char peer_addr[18];
const char *paddr = peer_addr;
const gchar *dev_path;
+ int state;
adapter = manager_find_adapter(local);
if (!adapter) {
@@ -1016,7 +1019,13 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status,
adapter_remove_found_device(adapter, peer);
/* check if there is more devices to request names */
- found_device_req_name(adapter);
+ if (found_device_req_name(adapter) == 0)
+ return;
+
+ state = adapter_get_state(adapter);
+ state &= ~PERIODIC_INQUIRY;
+ state &= ~STD_INQUIRY;
+ adapter_set_state(adapter, state);
}
void hcid_dbus_conn_complete(bdaddr_t *local, uint8_t status, uint16_t handle,