From 3a3074accbfc72126def9f8dc2cf92681512af7d Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 18 Dec 2012 17:39:56 +0100 Subject: [PATCH] client: Add support for providing agent capability --- client/agent.c | 13 +++++++++++-- client/agent.h | 3 ++- client/main.c | 37 ++++++++++++++++++++++++++----------- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/client/agent.c b/client/agent.c index 6ab0d4dde..5f1a1ba72 100644 --- a/client/agent.c +++ b/client/agent.c @@ -36,6 +36,7 @@ #define AGENT_INTERFACE "org.bluez.Agent1" static gboolean agent_registered = FALSE; +static const char *agent_capability = NULL; static DBusMessage *pending_message = NULL; dbus_bool_t agent_completion(void) @@ -98,6 +99,7 @@ static DBusMessage *release_agent(DBusConnection *conn, rl_clear_message(); agent_registered = FALSE; + agent_capability = NULL; rl_printf("Agent released\n"); @@ -197,7 +199,7 @@ static const GDBusMethodTable methods[] = { static void register_agent_setup(DBusMessageIter *iter, void *user_data) { const char *path = AGENT_PATH; - const char *capability = ""; + const char *capability = agent_capability; dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path); dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &capability); @@ -223,13 +225,17 @@ static void register_agent_reply(DBusMessage *message, void *user_data) } } -void agent_register(DBusConnection *conn, GDBusProxy *manager) +void agent_register(DBusConnection *conn, GDBusProxy *manager, + const char *capability) + { if (agent_registered == TRUE) { rl_printf("Agent is already registered\n"); return; } + agent_capability = capability; + if (g_dbus_register_interface(conn, AGENT_PATH, AGENT_INTERFACE, methods, NULL, NULL, NULL, NULL) == FALSE) { @@ -244,6 +250,8 @@ void agent_register(DBusConnection *conn, GDBusProxy *manager) rl_printf("Failed to call register agent method\n"); return; } + + agent_capability = NULL; } static void unregister_agent_setup(DBusMessageIter *iter, void *user_data) @@ -262,6 +270,7 @@ static void unregister_agent_reply(DBusMessage *message, void *user_data) if (dbus_set_error_from_message(&error, message) == FALSE) { agent_registered = FALSE; + agent_capability = NULL; rl_printf("Agent unregistered\n"); if (g_dbus_unregister_interface(conn, AGENT_PATH, diff --git a/client/agent.h b/client/agent.h index 6e4536df4..c86d0d5ab 100644 --- a/client/agent.h +++ b/client/agent.h @@ -21,7 +21,8 @@ * */ -void agent_register(DBusConnection *conn, GDBusProxy *manager); +void agent_register(DBusConnection *conn, GDBusProxy *manager, + const char *capability); void agent_unregister(DBusConnection *conn, GDBusProxy *manager); dbus_bool_t agent_completion(void); diff --git a/client/main.c b/client/main.c index 77cdd922d..9654df56c 100644 --- a/client/main.c +++ b/client/main.c @@ -44,7 +44,7 @@ static GMainLoop *main_loop; static DBusConnection *dbus_conn; static GDBusProxy *agent_manager; -static gboolean auto_register_agent = FALSE; +static gchar *auto_register_agent = NULL; static GDBusProxy *default_ctrl; static GList *ctrl_list; @@ -219,8 +219,9 @@ static void proxy_added(GDBusProxy *proxy, void *user_data) if (!agent_manager) { agent_manager = proxy; - if (auto_register_agent == TRUE) - agent_register(dbus_conn, agent_manager); + if (auto_register_agent) + agent_register(dbus_conn, agent_manager, + auto_register_agent); } } } @@ -531,14 +532,17 @@ static void cmd_agent(const char *arg) return; if (enable == TRUE) { - auto_register_agent = TRUE; + g_free(auto_register_agent); + auto_register_agent = g_strdup(""); if (agent_manager) - agent_register(dbus_conn, agent_manager); + agent_register(dbus_conn, agent_manager, + auto_register_agent); else rl_printf("Agent registration enabled\n"); } else { - auto_register_agent = FALSE; + g_free(auto_register_agent); + auto_register_agent = NULL; if (agent_manager) agent_unregister(dbus_conn, agent_manager); @@ -1000,13 +1004,24 @@ static guint setup_signalfd(void) } static gboolean option_version = FALSE; -static gboolean option_agent = FALSE; + +static gboolean parse_agent(const char *key, const char *value, + gpointer user_data, GError **error) +{ + if (value) + auto_register_agent = g_strdup(value); + else + auto_register_agent = g_strdup(""); + + return TRUE; +} static GOptionEntry options[] = { { "version", 'v', 0, G_OPTION_ARG_NONE, &option_version, "Show version information and exit" }, - { "agent", 'a', 0, G_OPTION_ARG_NONE, &option_agent, - "Automatically register agent handler" }, + { "agent", 'a', G_OPTION_FLAG_OPTIONAL_ARG, + G_OPTION_ARG_CALLBACK, parse_agent, + "Register agent handler", "CAPABILITY" }, { NULL }, }; @@ -1036,8 +1051,6 @@ int main(int argc, char *argv[]) exit(0); } - auto_register_agent = option_agent; - main_loop = g_main_loop_new(NULL, FALSE); dbus_conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, NULL); @@ -1075,5 +1088,7 @@ int main(int argc, char *argv[]) g_list_free_full(ctrl_list, proxy_leak); g_list_free_full(dev_list, proxy_leak); + g_free(auto_register_agent); + return 0; } -- 2.47.3