From b12f6eaa5b3f65a5b5f9c98e358f2f6ca912ef97 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Tue, 28 Oct 2008 23:17:56 +0200 Subject: Send DeviceFound signals also the first time the name gets resolved This patch makes sure that we send the DeviceFound with the Name property for newly found pre-2.1 devices when their names gets resolved for the first time. --- src/adapter.c | 29 +++++++++++++++++++----- src/adapter.h | 5 ++++- src/dbus-hci.c | 70 +++++++++++++++++++++++++++++++++++++++++----------------- 3 files changed, 78 insertions(+), 26 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index f1f4222c..70d1a8e8 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -331,6 +331,12 @@ struct pending_auth_info *adapter_new_auth_request(struct btd_adapter *adapter, return info; } +static void dev_info_free(struct remote_dev_info *dev) +{ + g_free(dev->alias); + g_free(dev); +} + int pending_remote_name_cancel(struct btd_adapter *adapter) { struct remote_dev_info *dev, match; @@ -360,7 +366,7 @@ int pending_remote_name_cancel(struct btd_adapter *adapter) } /* free discovered devices list */ - g_slist_foreach(adapter->found_devices, (GFunc) g_free, NULL); + g_slist_foreach(adapter->found_devices, (GFunc) dev_info_free, NULL); g_slist_free(adapter->found_devices); adapter->found_devices = NULL; @@ -2637,7 +2643,8 @@ int adapter_stop(struct btd_adapter *adapter) } if (adapter->found_devices) { - g_slist_foreach(adapter->found_devices, (GFunc) g_free, NULL); + g_slist_foreach(adapter->found_devices, + (GFunc) dev_info_free, NULL); g_slist_free(adapter->found_devices); adapter->found_devices = NULL; } @@ -2936,7 +2943,8 @@ void adapter_set_state(struct btd_adapter *adapter, int state) (GSourceFunc) start_inquiry, adapter); if (!discov_active && adapter->found_devices) { - g_slist_foreach(adapter->found_devices, (GFunc) g_free, NULL); + g_slist_foreach(adapter->found_devices, + (GFunc) dev_info_free, NULL); g_slist_free(adapter->found_devices); adapter->found_devices = NULL; } @@ -2983,7 +2991,8 @@ int dev_rssi_cmp(struct remote_dev_info *d1, struct remote_dev_info *d2) } int adapter_add_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr, - int8_t rssi, name_status_t name_status) + int8_t rssi, uint32_t class, const char *alias, + name_status_t name_status) { struct remote_dev_info *dev, match; @@ -2998,6 +3007,13 @@ int adapter_add_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr, if (rssi != 0) dev->rssi = rssi; + dev->class = class; + + if (alias) { + g_free(dev->alias); + dev->alias = g_strdup(alias); + } + /* Get remote name can be received while inquiring. * Keep in mind that multiple inquiry result events can * be received from the same remote device. @@ -3015,6 +3031,9 @@ int adapter_add_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr, bacpy(&dev->bdaddr, bdaddr); dev->rssi = rssi; + dev->class = class; + if (alias) + dev->alias = g_strdup(alias); dev->name_status = name_status; adapter->found_devices = g_slist_insert_sorted(adapter->found_devices, @@ -3035,7 +3054,7 @@ int adapter_remove_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr) return -1; adapter->found_devices = g_slist_remove(adapter->found_devices, dev); - g_free(dev); + dev_info_free(dev); return 0; } diff --git a/src/adapter.h b/src/adapter.h index 6464f260..0983f140 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -53,6 +53,8 @@ typedef enum { struct remote_dev_info { bdaddr_t bdaddr; int8_t rssi; + uint32_t class; + char *alias; name_status_t name_status; }; @@ -144,7 +146,8 @@ int adapter_get_state(struct btd_adapter *adapter); struct remote_dev_info *adapter_search_found_devices(struct btd_adapter *adapter, struct remote_dev_info *match); int adapter_add_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr, - int8_t rssi, name_status_t name_status); + int8_t rssi, uint32_t class, const char *alias, + name_status_t name_status); int adapter_remove_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr); void adapter_update_oor_devices(struct btd_adapter *adapter); void adapter_remove_oor_device(struct btd_adapter *adapter, char *peer_addr); diff --git a/src/dbus-hci.c b/src/dbus-hci.c index a043406d..c830f6c2 100644 --- a/src/dbus-hci.c +++ b/src/dbus-hci.c @@ -886,6 +886,7 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, char filename[PATH_MAX + 1]; struct btd_adapter *adapter; char local_addr[18], peer_addr[18], *alias, *name, *tmp_name; + const char *real_alias; const char *path, *icon, *paddr = peer_addr; struct remote_dev_info *dev, match; dbus_int16_t tmp_rssi = rssi; @@ -942,12 +943,15 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, name = textfile_get(filename, peer_addr); if (!alias) { + real_alias = NULL; + if (!name) { alias = g_strdup(peer_addr); g_strdelimit(alias, ":", '-'); } else alias = g_strdup(name); - } + } else + real_alias = alias; tmp_name = extract_eir_name(data, &name_type); if (tmp_name) { @@ -992,10 +996,11 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, "Alias", DBUS_TYPE_STRING, &alias, NULL); } - g_free(alias); - /* add in the list to track name sent/pending */ - adapter_add_found_device(adapter, peer, rssi, name_status); + adapter_add_found_device(adapter, peer, rssi, class, real_alias, + name_status); + + g_free(alias); } void hcid_dbus_remote_class(bdaddr_t *local, bdaddr_t *peer, uint32_t class) @@ -1035,8 +1040,9 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status, { struct btd_adapter *adapter; char srcaddr[18], dstaddr[18]; - const gchar *dev_path; int state; + struct btd_device *device; + struct remote_dev_info match, *dev_info; adapter = manager_find_adapter(local); if (!adapter) { @@ -1047,27 +1053,51 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status, ba2str(local, srcaddr); ba2str(peer, dstaddr); - if (!status) { - struct btd_device *device; + if (status != 0) + goto proceed; + + bacpy(&match.bdaddr, peer); + match.name_status = NAME_ANY; - device = adapter_find_device(adapter, dstaddr); - if (device) { - char alias[248]; + dev_info = adapter_search_found_devices(adapter, &match); + if (dev_info) { + const char *adapter_path = adapter_get_path(adapter); + const char *icon = class_to_icon(dev_info->class); + const char *alias, *paddr = dstaddr; + dbus_int16_t rssi = dev_info->rssi; - dev_path = device_get_path(device); + if (dev_info->alias) + alias = dev_info->alias; + else + alias = name; + emit_device_found(adapter_path, dstaddr, + "Address", DBUS_TYPE_STRING, &paddr, + "Class", DBUS_TYPE_UINT32, &dev_info->class, + "Icon", DBUS_TYPE_STRING, &icon, + "RSSI", DBUS_TYPE_INT16, &rssi, + "Name", DBUS_TYPE_STRING, &name, + "Alias", DBUS_TYPE_STRING, &alias, + NULL); + } + + device = adapter_find_device(adapter, dstaddr); + if (device) { + char alias[248]; + const char *dev_path = device_get_path(device); + + emit_property_changed(connection, dev_path, + DEVICE_INTERFACE, "Name", + DBUS_TYPE_STRING, &name); + + if (read_device_alias(srcaddr, dstaddr, + alias, sizeof(alias)) < 1) emit_property_changed(connection, dev_path, - DEVICE_INTERFACE, "Name", - DBUS_TYPE_STRING, &name); - - if (read_device_alias(srcaddr, dstaddr, - alias, sizeof(alias)) < 1) - emit_property_changed(connection, dev_path, - DEVICE_INTERFACE, "Alias", - DBUS_TYPE_STRING, &name); - } + DEVICE_INTERFACE, "Alias", + DBUS_TYPE_STRING, &name); } +proceed: /* remove from remote name request list */ adapter_remove_found_device(adapter, peer); -- cgit