diff --git a/client/agent.c b/client/agent.c
index 6ab0d4d..5f1a1ba 100644
--- a/client/agent.c
+++ b/client/agent.c
#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)
rl_clear_message();
agent_registered = FALSE;
+ agent_capability = NULL;
rl_printf("Agent released\n");
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);
}
}
-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) {
rl_printf("Failed to call register agent method\n");
return;
}
+
+ agent_capability = NULL;
}
static void unregister_agent_setup(DBusMessageIter *iter, 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 6e4536d..c86d0d5 100644
--- a/client/agent.h
+++ b/client/agent.h
*
*/
-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 77cdd92..9654df5 100644
--- a/client/main.c
+++ b/client/main.c
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;
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);
}
}
}
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);
}
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 },
};
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);
g_list_free_full(ctrl_list, proxy_leak);
g_list_free_full(dev_list, proxy_leak);
+ g_free(auto_register_agent);
+
return 0;
}