diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2008-09-25 19:47:09 -0700 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2008-09-25 19:47:09 -0700 |
commit | 013d376e47dc68ec385e9f88d6bc6c07c921ee1a (patch) | |
tree | 9323178aa89987d9a39b4a9ed50525e65838454b /src/dbus-hci.c | |
parent | fa2f213673116a81e9d6ac9740f96acd92987073 (diff) |
Do service discovery also for pairings initiated from the other side
Diffstat (limited to 'src/dbus-hci.c')
-rw-r--r-- | src/dbus-hci.c | 69 |
1 files changed, 25 insertions, 44 deletions
diff --git a/src/dbus-hci.c b/src/dbus-hci.c index e003e084..6713f7b5 100644 --- a/src/dbus-hci.c +++ b/src/dbus-hci.c @@ -545,7 +545,8 @@ void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer, adapter_remove_auth_request(adapter, peer); - /* If this is a new pairing send the appropriate signal for it */ + /* If this is a new pairing send the appropriate signal for it + * and proceed with service discovery */ if (status == 0) { const char *dev_path; dbus_bool_t paired = TRUE; @@ -556,31 +557,32 @@ void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer, dbus_connection_emit_property_changed(connection, dev_path, DEVICE_INTERFACE, "Paired", DBUS_TYPE_BOOLEAN, &paired); + + /* 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 + device_schedule_service_discovery(device); + + return; } proceed: if (!bonding || bacmp(&bonding->bdaddr, peer)) return; /* skip: no bonding req pending */ - if (bonding->cancel) { - /* reply authentication canceled */ + if (bonding->cancel) reply = new_authentication_return(bonding->msg, - HCI_OE_USER_ENDED_CONNECTION); - g_dbus_send_message(connection, reply); - goto cleanup; - } - - if (status) { + HCI_OE_USER_ENDED_CONNECTION); + else reply = new_authentication_return(bonding->msg, status); - dbus_connection_send(connection, reply, NULL); - dbus_message_unref(reply); - } else { - device_set_temporary(device, FALSE); - device_browse(device, bonding->conn, - bonding->msg, NULL); - } -cleanup: + g_dbus_send_message(connection, reply); + adapter_free_bonding_request(adapter); } @@ -1018,9 +1020,7 @@ void hcid_dbus_conn_complete(bdaddr_t *local, uint8_t status, uint16_t handle, bdaddr_t *peer) { char peer_addr[18]; - const char *paddr = peer_addr; struct btd_adapter *adapter; - const gchar *dev_path; struct bonding_request_info *bonding; adapter = manager_find_adapter(local); @@ -1045,17 +1045,10 @@ void hcid_dbus_conn_complete(bdaddr_t *local, uint8_t status, uint16_t handle, bonding->hci_status = status; } else { struct btd_device *device; - gboolean connected = TRUE; - device = adapter_find_device(adapter, paddr); - if (device) { - dev_path = device_get_path(device); - - dbus_connection_emit_property_changed(connection, - dev_path, DEVICE_INTERFACE, - "Connected", DBUS_TYPE_BOOLEAN, - &connected); - } + device = adapter_find_device(adapter, peer_addr); + if (device) + device_set_connected(connection, device, TRUE); /* add in the active connetions list */ adapter_add_active_conn(adapter, peer, handle); @@ -1067,17 +1060,12 @@ void hcid_dbus_disconn_complete(bdaddr_t *local, uint8_t status, { DBusMessage *reply; char peer_addr[18]; - const char *paddr = peer_addr; struct btd_adapter *adapter; struct btd_device *device; struct active_conn_info *dev; - gboolean connected = FALSE; struct pending_auth_info *auth; - const gchar *dev_path; uint16_t dev_id; struct bonding_request_info *bonding; - bdaddr_t bdaddr; - char addr[18]; if (status) { error("Disconnection failed: 0x%02x", status); @@ -1129,19 +1117,12 @@ void hcid_dbus_disconn_complete(bdaddr_t *local, uint8_t status, adapter_remove_active_conn(adapter, dev); - device = adapter_find_device(adapter, paddr); + device = adapter_find_device(adapter, peer_addr); if (device) { - device_get_address(device, &bdaddr); - ba2str(&bdaddr, addr); - - dev_path = device_get_path(device); + device_set_connected(connection, device, FALSE); - dbus_connection_emit_property_changed(connection, - dev_path, DEVICE_INTERFACE, - "Connected", DBUS_TYPE_BOOLEAN, - &connected); if (device_is_temporary(device)) { - debug("Removing temporary device %s", addr); + debug("Removing temporary device %s", peer_addr); adapter_remove_device(connection, adapter, device); } } |