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 /hcid | |
parent | b311d1f2d0bbd906b51c93423f86625e74931a55 (diff) |
Add support for GetRemoteFeatures method
Diffstat (limited to 'hcid')
-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 |