diff options
| -rw-r--r-- | src/dbus-hci.c | 3 | ||||
| -rw-r--r-- | src/device.c | 26 | ||||
| -rw-r--r-- | src/device.h | 2 | 
3 files changed, 20 insertions, 11 deletions
diff --git a/src/dbus-hci.c b/src/dbus-hci.c index 2ae307e8..3abf6bdc 100644 --- a/src/dbus-hci.c +++ b/src/dbus-hci.c @@ -611,7 +611,8 @@ void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer,  	/* If this is a new pairing send the appropriate signal for it  	 * and proceed with service discovery */  	if (status == 0) { -		if (device_set_paired(connection, device, bonding) && bonding) +		device_set_paired(connection, device, bonding); +		if (bonding)  			adapter_free_bonding_request(adapter);  		return;  	} diff --git a/src/device.c b/src/device.c index 81e39e0b..bd58f7c3 100644 --- a/src/device.c +++ b/src/device.c @@ -1275,7 +1275,7 @@ static gboolean start_discovery(gpointer user_data)  	return FALSE;  } -gboolean device_set_paired(DBusConnection *conn, struct btd_device *device, +int device_set_paired(DBusConnection *conn, struct btd_device *device,  			struct bonding_request_info *bonding)  {  	dbus_bool_t paired = TRUE; @@ -1286,22 +1286,30 @@ gboolean device_set_paired(DBusConnection *conn, struct btd_device *device,  						DEVICE_INTERFACE, "Paired",  						DBUS_TYPE_BOOLEAN, &paired); -	if (device->discov_timer) -		return FALSE; -  	/* If we were initiators start service discovery immediately.  	 * However if the other end was the initator wait a few seconds  	 * before SDP. This is due to potential IOP issues if the other  	 * end starts doing SDP at the same time as us */ -	if (bonding) -		device_browse(device, bonding->conn, -				bonding->msg, NULL); -	else +	if (bonding) { +		/* If we are initiators remove any discovery timer and just +		 * start discovering services directly */ +		if (device->discov_timer) { +			g_source_remove(device->discov_timer); +			device->discov_timer = 0; +		} + +		return device_browse(device, bonding->conn, bonding->msg, +					NULL); +	} + +	/* If we are not initiators and there is no currently active discovery +	 * or discovery timer, set the discovery timer */ +	if (!device->discov_active && !device->discov_timer)  		device->discov_timer = g_timeout_add(DISCOVERY_TIMER,  							start_discovery,  							device); -	return TRUE; +	return 0;  }  int btd_register_device_driver(struct btd_device_driver *driver) diff --git a/src/device.h b/src/device.h index 126426df..f977d7eb 100644 --- a/src/device.h +++ b/src/device.h @@ -42,7 +42,7 @@ void device_set_temporary(struct btd_device *device, gboolean temporary);  void device_set_cap(struct btd_device *device, uint8_t cap);  void device_set_auth(struct btd_device *device, uint8_t auth);  uint8_t device_get_auth(struct btd_device *device); -gboolean device_set_paired(DBusConnection *conn, struct btd_device *device, +int device_set_paired(DBusConnection *conn, struct btd_device *device,  			struct bonding_request_info *bonding);  gboolean device_get_connected(struct btd_device *device);  void device_set_connected(DBusConnection *conn, struct btd_device *device,  | 
