On Tue, 2012-08-28 at 17:08 -0700, Tudor Marcu wrote:
> When the client is started with the interactive option, it should drop into an
> interactive shell mode. These files handle all the interactive commands
> using readline, and provide quick functionality that is similar to plain
> synchronous command. Invalid input will be ignored, and the input is tokenized
> to allow for various input errors.
> ---
> client/interactive.c | 202
> ++++++++++++++++++++++++++++++++++++++++++++++++++
> client/interactive.h | 30 ++++++++
> 2 files changed, 232 insertions(+)
> create mode 100644 client/interactive.c
> create mode 100644 client/interactive.h
>
> diff --git a/client/interactive.c b/client/interactive.c
> new file mode 100644
> index 0000000..96cc02b
> --- /dev/null
> +++ b/client/interactive.c
> @@ -0,0 +1,202 @@
> +/*
> + *
> + * Connection Manager
> + *
> + * Copyright (C) 2012 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 version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
> USA
> + *
> + */
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <readline/readline.h>
> +#include <readline/history.h>
> +
> +#include <glib.h>
> +
> +#include "client/interactive.h"
> +#include "client/services.h"
> +#include "client/technology.h"
> +#include "client/data_manager.h"
> +
> +static void show_help(void)
> +{
> + printf("\n\t\t\t[Welcome to Connman interactive mode]\n\n"
> + " enable Enables given technology\n"
> + " <technology>\n"
> + " offlinemode Enables OfflineMode\n"
> + " disable Disables given technology\n"
> + " <technology>\n"
> + " offlinemode Disables OfflineMode\n"
> + " state Shows if the system is online or
> offline\n"
> + " services Display list of all services\n"
> + " tech Current technology on the
> system\n"
> + " scan <technology> Scans for new services on the
> given technology\n"
> + " connect <service> Connect to a given service\n"
> + " disconnect <service> Disconnect from service\n"
> + " help, h Show this dialogue\n"
> + " quit, q, exit Exit program\n");
> +}
> +
> +static int handle_commands(DBusConnection *connection, char *token)
> +{
> + DBusMessage *message;
> + gchar *prev_command = NULL;
> +
> + for (;;) {
> + if (strcmp(token, "quit") == 0 || strcmp(token, "exit") == 0 ||
> + strcmp(token, "q") == 0) {
> + g_free(prev_command);
> + free(token);
> + return 0;
> + }
> +
> + if (strcmp(token, "help") == 0 || strcmp(token, "h") == 0) {
> + show_help();
> + add_history(token);
> + }
> +
> + if (strcmp(token, "services") == 0) {
> + list_properties(connection, "GetServices", NULL);
> + add_history(token);
> + }
> +
> + if (strcmp(token, "state") == 0) {
> + list_properties(connection, "GetProperties", NULL);
> + add_history(token);
> + }
> +
> + if (strcmp(token, "tech") == 0) {
> + list_properties(connection, "GetTechnologies", NULL);
> + add_history(token);
> + }
> +
> + if (strcmp(token, "scan") == 0) {
> + prev_command = g_strdup(token);
> + token = strtok(NULL, " ");
> + if (token == NULL) {
> + fprintf(stderr, " ! Please input a technology "
> + "to scan\n");
> + break;
> + }
> + message = get_message(connection, "GetTechnologies");
> + scan_technology(connection, message, token);
> + dbus_message_unref(message);
> + prev_command = g_strdup_printf("%s %s", prev_command,
> + token);
> + add_history(prev_command);
> + /* FIXME: add function to receive and read the
> + * ServicesChanged signal asynchronously. */
> + }
> +
> + if (strcmp(token, "enable") == 0) {
> + prev_command = g_strdup(token);
> + token = strtok(NULL, " ");
> + if (token == NULL) {
> + fprintf(stderr, " ! Please input a technology "
> + "to enable\n");
> + break;
> + }
> + if (strcmp(token, "offlinemode") == 0) {
> + set_manager(connection, "OfflineMode", TRUE);
> + printf("OfflineMode is now enabled\n");
> + break;
> + }
> + message = get_message(connection, "GetTechnologies");
> + if (set_technology(connection, message, "Powered",
> + token, TRUE) == 0)
> + printf("Enabled %s technology\n",
> + token);
> + dbus_message_unref(message);
> + prev_command = g_strdup_printf("%s %s", prev_command,
> + token);
> + add_history(prev_command);
> + }
> +
> + if (strcmp(token, "disable") == 0) {
> + prev_command = g_strdup(token);
> + token = strtok(NULL, " ");
> + if (token == NULL) {
> + fprintf(stderr, " ! Please input a technology "
> + "to disable\n");
> + break;
> + }
> + if (strcmp(token, "offlinemode") == 0) {
> + set_manager(connection, "OfflineMode", FALSE);
> + printf("OfflineMode is now disabled\n");
> + break;
> + }
> + message = get_message(connection, "GetTechnologies");
> + if (set_technology(connection, message, "Powered",
> + token, FALSE) == 0)
> + printf("Disabled %s technology\n",
> + token);
> + dbus_message_unref(message);
> + prev_command = g_strdup_printf("%s %s", prev_command,
> + token);
> + add_history(prev_command);
> + }
> +
> + if (strcmp(token, "connect") == 0) {
> + prev_command = g_strdup(token);
> + token = strtok(NULL, " ");
> + if (token == NULL) {
> + fprintf(stderr, " ! Please input a service to "
> + "connect to\n");
> + break;
> + }
> + connect_service(connection, strip_service_path(token));
> + prev_command = g_strdup_printf("%s %s", prev_command,
> + token);
> + add_history(prev_command);
> + }
> +
> + if (strcmp(token, "disconnect") == 0) {
> + prev_command = g_strdup(token);
> + token = strtok(NULL, " ");
> + if (token == NULL) {
> + fprintf(stderr, " ! Please input a service to "
> + "disconnect from\n");
> + break;
> + }
> + disconnect_service(connection,
> + strip_service_path(token));
> + prev_command = g_strdup_printf("%s %s", prev_command,
> + token);
> + add_history(prev_command);
> + } else {
> + break;
> + }
> + }
> + return 1;
> +}
> +
Nope. Please factor out the cmn command part from patch 09 into a
function of it's own and call that function from show_interactive()
below (and then you have to reorder this patch). We want only one set of
identical commands for interactive and non-interactive mode. Also reuse
show_help() from patch 09.
When monitoring (or running as an agent in the next set of features) in
interactive mode ^C or ^D should drop the user back to the interactive
prompt, not exit the interactive command. When on an empty prompt in
interactive mode, ^C or ^D should of course exit...
> +void show_interactive(DBusConnection *connection)
> +{
> + static char *input;
> + char *token;
> +
> + show_help();
> + while (TRUE) {
> + input = readline("> ");
> + token = strtok(input, " ");
> +
> + if (token)
> + if (handle_commands(connection, token) != 1)
> + break;
> + }
> +}
> +
> diff --git a/client/interactive.h b/client/interactive.h
> new file mode 100644
> index 0000000..85faea1
> --- /dev/null
> +++ b/client/interactive.h
> @@ -0,0 +1,30 @@
> +/*
> + *
> + * Connection Manager
> + *
> + * Copyright (C) 2012 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 version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
> USA
> + *
> + */
> +
> +#ifndef __CLIENT_INTERACTIVE_H
> +#define __CLIENT_INTERACTIVE_H
> +
> +#include <dbus/dbus.h>
> +
> +void show_interactive(DBusConnection *connection);
> +
> +#endif
> +
Cheers,
Patrik
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman