diff options
Diffstat (limited to 'hcid/adapter.c')
| -rw-r--r-- | hcid/adapter.c | 121 | 
1 files changed, 109 insertions, 12 deletions
| diff --git a/hcid/adapter.c b/hcid/adapter.c index bd80023f..6bd17750 100644 --- a/hcid/adapter.c +++ b/hcid/adapter.c @@ -720,6 +720,37 @@ static DBusHandlerResult adapter_get_discoverable_to(DBusConnection *conn,  	return send_message_and_unref(conn, reply);  } +static void resolve_paths(DBusMessage *msg, char **old_path, char **new_path) +{ +	const char *path = dbus_message_get_path(msg); + +	if (!path) +		return; + +	if (old_path) +		*old_path = NULL; + +	if (new_path) +		*new_path = NULL; + +	/* old path calls */ +	if (g_str_has_prefix(path, BASE_PATH)) { +		if (old_path) +			*old_path = g_strdup(path); + +		if (hcid_dbus_use_experimental() && new_path) +			*new_path = g_strdup(path + ADAPTER_PATH_INDEX); + +		return; +	} + +	if (old_path) +		*old_path = g_strconcat(BASE_PATH, path); + +	if (new_path) +		*new_path = g_strdup(path); +} +  static DBusHandlerResult set_discoverable_timeout(DBusConnection *conn,  							DBusMessage *msg,  							uint32_t timeout, @@ -728,6 +759,7 @@ static DBusHandlerResult set_discoverable_timeout(DBusConnection *conn,  	struct adapter *adapter = data;  	DBusMessage *reply;  	bdaddr_t bdaddr; +	char *old_path, *new_path;  	reply = dbus_message_new_method_return(msg);  	if (!reply) @@ -748,19 +780,22 @@ static DBusHandlerResult set_discoverable_timeout(DBusConnection *conn,  	str2ba(adapter->address, &bdaddr);  	write_discoverable_timeout(&bdaddr, timeout); -	dbus_connection_emit_signal(conn, dbus_message_get_path(msg), +	resolve_paths(msg, &old_path, &new_path); + +	dbus_connection_emit_signal(conn, old_path,  					ADAPTER_INTERFACE,  					"DiscoverableTimeoutChanged",  					DBUS_TYPE_UINT32, &timeout,  					DBUS_TYPE_INVALID); -	if (hcid_dbus_use_experimental()) { -		dbus_connection_emit_property_changed(conn, -						dbus_message_get_path(msg), +	if (new_path) { +		dbus_connection_emit_property_changed(conn, new_path,  						ADAPTER_INTERFACE,  						"DiscoverableTimeout",  						DBUS_TYPE_UINT32, &timeout);  	} +	g_free(old_path); +	g_free(new_path);  	return send_message_and_unref(conn, reply);  } @@ -1152,6 +1187,7 @@ static int set_name(DBusConnection *conn, DBusMessage *msg, const char *name,  	DBusMessage *reply;  	bdaddr_t bdaddr;  	int ecode; +	char *new_path;  	if (!g_utf8_validate(name, -1, NULL)) {  		error("Name change failed: the supplied name isn't valid UTF-8"); @@ -1174,14 +1210,16 @@ done:  	if (!reply)  		return DBUS_HANDLER_RESULT_NEED_MEMORY; -	if (hcid_dbus_use_experimental()) { -		dbus_connection_emit_property_changed(conn, -						dbus_message_get_path(msg), +	resolve_paths(msg, NULL, &new_path); + +	if (new_path) { +		dbus_connection_emit_property_changed(conn, new_path,  						ADAPTER_INTERFACE,  						"Name", DBUS_TYPE_STRING,  						&name);  	} +	g_free(new_path);  	return send_message_and_unref(conn, reply);  } @@ -1855,7 +1893,7 @@ static DBusHandlerResult adapter_set_remote_alias(DBusConnection *conn,  {  	struct adapter *adapter = data;  	DBusMessage *reply; -	char *alias, *addr; +	char *alias, *addr, *old_path, *new_path;  	bdaddr_t bdaddr;  	int ecode; @@ -1880,12 +1918,27 @@ static DBusHandlerResult adapter_set_remote_alias(DBusConnection *conn,  	if (!reply)  		return DBUS_HANDLER_RESULT_NEED_MEMORY; -	dbus_connection_emit_signal(conn, dbus_message_get_path(msg), +	resolve_paths(msg, &old_path, &new_path); + +	dbus_connection_emit_signal(conn, old_path,  					ADAPTER_INTERFACE, "RemoteAliasChanged",  					DBUS_TYPE_STRING, &addr,  					DBUS_TYPE_STRING, &alias,  					DBUS_TYPE_INVALID); +	if (new_path) { +		struct device *device; + +		device = adapter_get_device(adapter, addr); +		if (device) { +			dbus_connection_emit_property_changed(conn, +					device->path, DEVICE_INTERFACE, +					"Alias", DBUS_TYPE_STRING, &alias); +		} +	} + +	g_free(old_path); +	g_free(new_path);  	return send_message_and_unref(conn, reply);  } @@ -2436,7 +2489,7 @@ static DBusHandlerResult adapter_remove_bonding(DBusConnection *conn,  	GSList *l;  	DBusMessage *reply;  	char filename[PATH_MAX + 1]; -	char *addr_ptr, *str; +	char *addr_ptr, *str, *old_path, *new_path;  	bdaddr_t bdaddr;  	int dd; @@ -2494,11 +2547,25 @@ static DBusHandlerResult adapter_remove_bonding(DBusConnection *conn,  		}  	} +	resolve_paths(msg, &old_path, &new_path); +  	dbus_connection_emit_signal(conn, dbus_message_get_path(msg),  					ADAPTER_INTERFACE, "BondingRemoved",  					DBUS_TYPE_STRING, &addr_ptr,  					DBUS_TYPE_INVALID); +	if (new_path) { +		struct device *device; +		gboolean paired = FALSE; + +		device = adapter_get_device(adapter, addr_ptr); +		if (device) { +			dbus_connection_emit_property_changed(conn, +					device->path, DEVICE_INTERFACE, +					"Paired", DBUS_TYPE_BOOLEAN, &paired); +		} +	} +  	reply = dbus_message_new_method_return(msg);  	hci_close_dev(dd); @@ -3108,6 +3175,7 @@ static DBusHandlerResult adapter_set_trusted(DBusConnection *conn,  	DBusMessage *reply;  	bdaddr_t local;  	const char *address; +	char *old_path, *new_path;  	if (!dbus_message_get_args(msg, NULL,  			DBUS_TYPE_STRING, &address, @@ -3125,11 +3193,25 @@ static DBusHandlerResult adapter_set_trusted(DBusConnection *conn,  	write_trust(&local, address, GLOBAL_TRUST, TRUE); -	dbus_connection_emit_signal(conn, dbus_message_get_path(msg), +	resolve_paths(msg, &old_path, &new_path); + +	dbus_connection_emit_signal(conn, old_path,  					ADAPTER_INTERFACE, "TrustAdded",  					DBUS_TYPE_STRING, &address,  					DBUS_TYPE_INVALID); +	if (new_path) { +		struct device *device; +		gboolean trust = TRUE; + +		device = adapter_get_device(adapter, address); +		if (device) { +			dbus_connection_emit_property_changed(conn, +					device->path, DEVICE_INTERFACE, +					"Trusted", DBUS_TYPE_BOOLEAN, &trust); +		} +	} +  	return send_message_and_unref(conn, reply);  } @@ -3174,6 +3256,7 @@ static DBusHandlerResult adapter_remove_trust(DBusConnection *conn,  	DBusMessage *reply;  	const char *address;  	bdaddr_t local; +	char *old_path, *new_path;  	if (!dbus_message_get_args(msg, NULL,  			DBUS_TYPE_STRING, &address, @@ -3191,11 +3274,25 @@ static DBusHandlerResult adapter_remove_trust(DBusConnection *conn,  	write_trust(&local, address, GLOBAL_TRUST, FALSE); -	dbus_connection_emit_signal(conn, dbus_message_get_path(msg), +	resolve_paths(msg, &old_path, &new_path); + +	dbus_connection_emit_signal(conn, old_path,  					ADAPTER_INTERFACE, "TrustRemoved",  					DBUS_TYPE_STRING, &address,  					DBUS_TYPE_INVALID); +	if (new_path) { +		struct device *device; +		gboolean trust = FALSE; + +		device = adapter_get_device(adapter, address); +		if (device) { +			dbus_connection_emit_property_changed(conn, +					device->path, DEVICE_INTERFACE, +					"Trusted", DBUS_TYPE_BOOLEAN, &trust); +		} +	} +  	return send_message_and_unref(conn, reply);  } | 
