diff options
| author | Marcel Holtmann <marcel@holtmann.org> | 2006-12-25 15:06:01 +0000 | 
|---|---|---|
| committer | Marcel Holtmann <marcel@holtmann.org> | 2006-12-25 15:06:01 +0000 | 
| commit | 6c47e6b19c99c201994496298b84f4af05bd0d41 (patch) | |
| tree | 5d70b578c0f09de780b99f0322907cd46b6bbf8f | |
| parent | b311d1f2d0bbd906b51c93423f86625e74931a55 (diff) | |
Add support for GetRemoteFeatures method
| -rw-r--r-- | hcid/dbus-adapter.c | 53 | ||||
| -rw-r--r-- | hcid/dbus-api.txt | 7 | 
2 files changed, 60 insertions, 0 deletions
| diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c index 4a3cd258..a36ab4fa 100644 --- a/hcid/dbus-adapter.c +++ b/hcid/dbus-adapter.c @@ -1383,6 +1383,58 @@ static DBusHandlerResult adapter_get_remote_class(DBusConnection *conn,  	return send_message_and_unref(conn, reply);  } +static DBusHandlerResult adapter_get_remote_features(DBusConnection *conn, +						DBusMessage *msg, void *data) +{ +	char filename[PATH_MAX + 1]; +	struct adapter *adapter = data; +	DBusMessage *reply = NULL; +	DBusMessageIter iter, array_iter; +	uint8_t features[8], *ptr = features; +	const char *addr; +	char tmp[3], *str; +	int i; + +	if (!dbus_message_get_args(msg, NULL, +				DBUS_TYPE_STRING, &addr, +				DBUS_TYPE_INVALID)) +		return error_invalid_arguments(conn, msg); + +	if (check_address(addr) < 0) +		return error_invalid_arguments(conn, msg); + +	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address, "features"); + +	str = textfile_caseget(filename, addr); +	if (!str) +		return error_not_available(conn, msg); + +	memset(features, 0, sizeof(features)); +	for (i = 0; i < sizeof(features); i++) { +		memcpy(tmp, str + (i * 2), 2); +		features[i] = (uint8_t) strtol(tmp, NULL, 16); +	} + +	reply = dbus_message_new_method_return(msg); +	if (!reply) { +		free(str); +		return DBUS_HANDLER_RESULT_NEED_MEMORY; +	} + +	dbus_message_iter_init_append(reply, &iter); +	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, +				DBUS_TYPE_BYTE_AS_STRING, &array_iter); + +	dbus_message_iter_append_fixed_array(&array_iter, +				DBUS_TYPE_BYTE, &ptr, sizeof(features)); + +	dbus_message_iter_close_container(&iter, &array_iter); + +	free(str); + +	return send_message_and_unref(conn, reply); +} +  static DBusHandlerResult adapter_get_remote_name(DBusConnection *conn,  						DBusMessage *msg, void *data)  { @@ -2709,6 +2761,7 @@ static struct service_data dev_services[] = {  	{ "GetRemoteMinorClass",		adapter_get_remote_minor_class	},  	{ "GetRemoteServiceClasses",		adapter_get_remote_service_cls	},  	{ "GetRemoteClass",			adapter_get_remote_class	}, +	{ "GetRemoteFeatures",			adapter_get_remote_features	},  	{ "GetRemoteName",			adapter_get_remote_name		},  	{ "GetRemoteAlias",			adapter_get_remote_alias	},  	{ "SetRemoteAlias",			adapter_set_remote_alias	}, diff --git a/hcid/dbus-api.txt b/hcid/dbus-api.txt index ee44a5ad..21fd3380 100644 --- a/hcid/dbus-api.txt +++ b/hcid/dbus-api.txt @@ -586,6 +586,13 @@ Methods		string GetAddress()  			Possible errors: org.bluez.Error.InvalidArguments  			                 org.bluez.Error.NotAvailable +		array{byte} GetRemoteFeatures(string address) + +			Get the remote features encoded as bit mask. + +			Possible errors: org.bluez.Error.InvalidArguments +			                 org.bluez.Error.NotAvailable +  		string GetRemoteName(string address)  			Get adapter name for a remote device. This request | 
