*
* Connection Manager
*
- * Copyright (C) 2012-2013 Intel Corporation. All rights reserved.
+ * Copyright (C) 2012-2014 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
static char *saved_line;
static int saved_point;
-static connmanctl_input_func_t *readline_input_handler;
-
void __connmanctl_quit(void)
{
- if (main_loop != NULL)
+ if (main_loop)
g_main_loop_quit(main_loop);
}
char **args, **trim_args;
int num, len, err, i;
- if (input == NULL) {
+ if (!input) {
rl_newline(1, '\n');
g_main_loop_quit(main_loop);
return;
args = g_strsplit(input, " ", 0);
num = g_strv_length(args);
- trim_args = g_new0(char *, num);
+ trim_args = g_new0(char *, num + 1);
for (i = 0, len = 0; i < num; i++) {
if (*args[i] != '\0') {
trim_args[len] = args[i];
}
if (len > 0) {
-
- add_history(input);
+ HIST_ENTRY *previous = history_get(where_history());
+ if(!previous || strcmp(previous->line, input))
+ add_history(input);
err = __connmanctl_commands(connection, trim_args, len);
g_strfreev(args);
g_free(trim_args);
+ free(input);
}
static gboolean input_handler(GIOChannel *channel, GIOCondition condition,
return FALSE;
}
- if (readline_input_handler != NULL)
- rl_callback_read_char();
+ rl_callback_read_char();
return TRUE;
}
return NULL;
}
-static char **complete_command(const char *text, int start, int end)
+/* Return how many parameters we have typed */
+int __connmanctl_input_calc_level(void)
{
- char **command = NULL;
+ int count = 0;
+ char *ptr;
+
+ ptr = rl_line_buffer;
+
+ while (*ptr) {
+ if (*ptr == ' ') {
+ if (*(ptr + 1) == ' ') {
+ ptr++;
+ continue;
+ } else
+ count++;
+ }
+ ptr++;
+ }
+
+ return count;
+}
+void __connmanctl_input_lookup_end(void)
+{
rl_attempted_completion_over = 1;
+}
- if (start == 0)
- command = rl_completion_matches(text,
+static char **complete_command(const char *text, int start, int end)
+{
+ if (start == 0) {
+ return rl_completion_matches(text,
__connmanctl_lookup_command);
- return command;
+ } else {
+ __connmanctl_lookup_cb cb;
+ char **str = NULL;
+
+ cb = __connmanctl_get_lookup_func(rl_line_buffer);
+ if (cb)
+ str = rl_completion_matches(text, cb);
+ else
+ rl_attempted_completion_over = 1;
+
+ return str;
+ }
+}
+
+static struct {
+ connmanctl_input_func_t cb;
+ void *user_data;
+} agent_handler;
+
+static void rl_agent_handler(char *input)
+{
+ agent_handler.cb(input, agent_handler.user_data);
}
void __connmanctl_agent_mode(const char *prompt,
- connmanctl_input_func_t input_handler)
+ connmanctl_input_func_t input_handler, void *user_data)
{
- readline_input_handler = input_handler;
+ agent_handler.cb = input_handler;
+ agent_handler.user_data = user_data;
- if (input_handler != NULL)
- rl_callback_handler_install(prompt, input_handler);
+ if (input_handler)
+ rl_callback_handler_install(prompt, rl_agent_handler);
else {
rl_set_prompt(prompt);
rl_callback_handler_remove();
void __connmanctl_command_mode(void)
{
- readline_input_handler = rl_handler;
-
rl_callback_handler_install("connmanctl> ", rl_handler);
rl_attempted_completion_function = complete_command;
}
return 1;
}
- channel = g_io_channel_unix_new(fileno(stdin));
- source = g_io_add_watch(channel, G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
- input_handler, NULL);
- g_io_channel_unref(channel);
-
if (argc < 2) {
interactive = true;
+ channel = g_io_channel_unix_new(fileno(stdin));
+ source = g_io_add_watch(channel,
+ G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
+ input_handler, NULL);
+ g_io_channel_unref(channel);
+
+ __connmanctl_monitor_completions(connection);
+
__connmanctl_command_mode();
- err = -EINPROGRESS;
+ err = -EINPROGRESS;
} else {
interactive = false;
err = __connmanctl_commands(connection, help, 1);
else
err = __connmanctl_commands(connection, argv + 1,
- argc -1);
+ argc - 1);
}
if (err == -EINPROGRESS) {
err = 0;
}
- g_source_remove(source);
+ if (interactive) {
+ g_source_remove(source);
+ __connmanctl_monitor_completions(NULL);
- if (interactive == true) {
rl_callback_handler_remove();
+#if !defined TIZEN_EXT
rl_message("");
+#endif
}
dbus_connection_unref(connection);
- if (main_loop != NULL)
+ if (main_loop)
g_main_loop_unref(main_loop);
if (err < 0)