summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);