diff options
| -rw-r--r-- | src/adapter.c | 29 | ||||
| -rw-r--r-- | src/adapter.h | 5 | ||||
| -rw-r--r-- | 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); | 
