diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2012-12-18 04:20:40 +0100 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2012-12-18 04:20:40 +0100 |
commit | 5557e7b453d9f14b67462e3072517cf971a4b51e (patch) | |
tree | 35331056f17025274dd496e5845cc411f8e35e7f /client/agent.c | |
parent | dae938bcbddb3452f850fef9a783d0b566b6b307 (diff) | |
download | bluez-5557e7b453d9f14b67462e3072517cf971a4b51e.tar.gz |
client: Add support for handling passkey confirmation
Diffstat (limited to 'client/agent.c')
-rw-r--r-- | client/agent.c | 69 |
1 files changed, 66 insertions, 3 deletions
diff --git a/client/agent.c b/client/agent.c index 6ab7cd486..31bbdd5ad 100644 --- a/client/agent.c +++ b/client/agent.c @@ -36,23 +36,86 @@ #define AGENT_INTERFACE "org.bluez.Agent1" static gboolean agent_registered = FALSE; +static DBusMessage *pending_message = NULL; + +dbus_bool_t agent_completion(void) +{ + if (!pending_message) + return FALSE; + + return TRUE; +} + +dbus_bool_t agent_input(DBusConnection *conn, const char *input) +{ + rl_clear_message(); + + if (!pending_message) + return FALSE; + + g_dbus_send_reply(conn, pending_message, DBUS_TYPE_INVALID); + + dbus_message_unref(pending_message); + pending_message = NULL; + + return TRUE; +} static DBusMessage *release_agent(DBusConnection *conn, DBusMessage *msg, void *user_data) { agent_registered = FALSE; - begin_message(); - printf("Agent released\n"); - end_message(); + rl_printf("Agent released\n"); + + if (pending_message) { + dbus_message_unref(pending_message); + pending_message = NULL; + } g_dbus_unregister_interface(conn, AGENT_PATH, AGENT_INTERFACE); return dbus_message_new_method_return(msg); } +static DBusMessage *request_confirmation(DBusConnection *conn, + DBusMessage *msg, void *user_data) +{ + const char *device; + dbus_uint32_t passkey; + char *str; + + rl_printf("Request confirmation\n"); + + dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &device, + DBUS_TYPE_UINT32, &passkey, DBUS_TYPE_INVALID); + + str = g_strdup_printf("Confirm passkey %06u (yes/no): ", passkey); + rl_message(str); + g_free(str); + + pending_message = dbus_message_ref(msg); + + return NULL; +} + +static DBusMessage *cancel_request(DBusConnection *conn, + DBusMessage *msg, void *user_data) +{ + rl_printf("Request canceled\n"); + + dbus_message_unref(pending_message); + pending_message = NULL; + + return dbus_message_new_method_return(msg); +} + static const GDBusMethodTable methods[] = { { GDBUS_METHOD("Release", NULL, NULL, release_agent) }, + { GDBUS_ASYNC_METHOD("RequestConfirmation", + GDBUS_ARGS({ "device", "o"}, { "passkey", "u" }), + NULL, request_confirmation) }, + { GDBUS_METHOD("Cancel", NULL, NULL, cancel_request) }, { } }; |