summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2008-10-28 23:17:56 +0200
committerJohan Hedberg <johan.hedberg@nokia.com>2008-10-28 23:17:56 +0200
commitb12f6eaa5b3f65a5b5f9c98e358f2f6ca912ef97 (patch)
tree6eeae2b466fa238ccfbade25869578152b833cb1
parent6fa921829d4fd308cba21ccc173853e6397f43ac (diff)
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.
-rw-r--r--src/adapter.c29
-rw-r--r--src/adapter.h5
-rw-r--r--src/dbus-hci.c70
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);