diff options
-rw-r--r-- | hcid/device.c | 95 | ||||
-rw-r--r-- | hcid/device.h | 2 |
2 files changed, 95 insertions, 2 deletions
diff --git a/hcid/device.c b/hcid/device.c index 0f1ab4a4..94e657eb 100644 --- a/hcid/device.c +++ b/hcid/device.c @@ -58,6 +58,7 @@ #include "device.h" #include "dbus-common.h" #include "dbus-hci.h" +#include "error.h" #define MAX_DEVICES 16 @@ -747,6 +748,9 @@ static DBusHandlerResult get_properties(DBusConnection *conn, dbus_bool_t boolean; uint32_t class; + if (!hcid_dbus_use_experimental()) + return error_unknown_method(conn, msg); + reply = dbus_message_new_method_return(msg); if (!reply) return DBUS_HANDLER_RESULT_NEED_MEMORY; @@ -826,10 +830,97 @@ static DBusHandlerResult get_properties(DBusConnection *conn, return send_message_and_unref(conn, reply); } +static DBusHandlerResult set_alias(DBusConnection *conn, DBusMessage *msg, + const char *alias, void *data) +{ + struct device *device = data; + struct adapter *adapter = device->adapter; + DBusMessage *reply; + bdaddr_t bdaddr; + int ecode; + + str2ba(device->address, &bdaddr); + + ecode = set_device_alias(adapter->dev_id, &bdaddr, alias); + if (ecode < 0) + return error_failed_errno(conn, msg, -ecode); + + reply = dbus_message_new_method_return(msg); + if (!reply) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + dbus_connection_emit_property_changed(conn, dbus_message_get_path(msg), + DEVICE_INTERFACE, "Alias", + DBUS_TYPE_STRING, &alias); + + return send_message_and_unref(conn, reply); +} + +static DBusHandlerResult set_trust(DBusConnection *conn, DBusMessage *msg, + dbus_bool_t value, void *data) +{ + struct device *device = data; + struct adapter *adapter = device->adapter; + DBusMessage *reply; + bdaddr_t local; + + reply = dbus_message_new_method_return(msg); + if (!reply) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + str2ba(adapter->address, &local); + + write_trust(&local, device->address, GLOBAL_TRUST, value); + + dbus_connection_emit_property_changed(conn, dbus_message_get_path(msg), + DEVICE_INTERFACE, "Trusted", + DBUS_TYPE_BOOLEAN, &value); + + return send_message_and_unref(conn, reply); +} + static DBusHandlerResult set_property(DBusConnection *conn, - DBusMessage *msg, void *user_data) + DBusMessage *msg, void *data) { - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + DBusMessageIter iter; + DBusMessageIter sub; + const char *property; + + if (!hcid_dbus_use_experimental()) + return error_unknown_method(conn, msg); + + if (!dbus_message_iter_init(msg, &iter)) + return error_invalid_arguments(conn, msg, NULL); + + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) + return error_invalid_arguments(conn, msg, NULL); + + dbus_message_iter_get_basic(&iter, &property); + dbus_message_iter_next(&iter); + + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) + return error_invalid_arguments(conn, msg, NULL); + dbus_message_iter_recurse(&iter, &sub); + + if (g_str_equal("Trusted", property)) { + dbus_bool_t value; + + if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN) + return error_invalid_arguments(conn, msg, NULL); + dbus_message_iter_get_basic(&sub, &value); + + return set_trust(conn, msg, value, data); + } else if (g_str_equal("Alias", property)) { + char *alias; + + if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING) + return error_invalid_arguments(conn, msg, NULL); + dbus_message_iter_get_basic(&sub, &alias); + + return set_alias(conn, msg, alias, data); + } + + return error_invalid_arguments(conn, msg, NULL); } static DBusMethodVTable device_methods[] = { diff --git a/hcid/device.h b/hcid/device.h index 524e0441..08d4c1b0 100644 --- a/hcid/device.h +++ b/hcid/device.h @@ -22,6 +22,8 @@ * */ +#define DEVICE_INTERFACE "org.bluez.Device" + struct device { gchar *address; gchar *path; |