[virt-tools-list] [PATCH 04/12] Add remote-viewer program

Marc-André Lureau marcandre.lureau at gmail.com
Tue Dec 13 19:35:02 UTC 2011


This program is meant for direct URI connections.
ex: remote-viewer vnc://uri
---
 .gitignore               |    3 +
 po/POTFILES.in           |    2 +
 src/Makefile.am          |  108 ++++++++++++++++++++-------------
 src/remote-viewer-main.c |  148 ++++++++++++++++++++++++++++++++++++++++++++++
 src/remote-viewer.c      |  141 +++++++++++++++++++++++++++++++++++++++++++
 src/remote-viewer.h      |   56 +++++++++++++++++
 6 files changed, 415 insertions(+), 43 deletions(-)
 create mode 100644 src/remote-viewer-main.c
 create mode 100644 src/remote-viewer.c
 create mode 100644 src/remote-viewer.h

diff --git a/.gitignore b/.gitignore
index 5879464..6435031 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,6 +23,7 @@ man/*.1
 missing
 .deps/
 .libs
+src/remote-viewer
 src/virt-viewer
 po/POTFILES
 po/stamp-it
@@ -33,3 +34,5 @@ po/stamp-it
 */#*#
 stamp-h1
 INSTALL
+*.lo
+*.la
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 57b6c52..49ae4f5 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,3 +1,5 @@
+src/remote-viewer-main.c
+src/remote-viewer.c
 src/virt-viewer-about.xml
 src/virt-viewer-app.c
 src/virt-viewer-auth.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 4643de9..e1e0ee9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,57 +1,79 @@
+NULL =
+# we are forced to use a shared library,
+# because libtool reordred .a after .la libs, and it fails to link
+lib_LTLIBRARIES = libvirt-viewer.la
 bin_PROGRAMS = virt-viewer
 
 builderxmldir = $(pkgdatadir)/ui
-builderxml_DATA = \
-	virt-viewer.xml \
-	virt-viewer-about.xml \
-	virt-viewer-auth.xml
+builderxml_DATA =				\
+	virt-viewer.xml				\
+	virt-viewer-about.xml			\
+	virt-viewer-auth.xml			\
+	$(NULL)
 
 EXTRA_DIST = $(builderxml_DATA)
 
-virt_viewer_SOURCES = \
-	virt-viewer-main.c \
-	virt-viewer.h virt-viewer.c \
-	virt-viewer-util.h virt-viewer-util.c \
-	virt-viewer-auth.h virt-viewer-auth.c \
-	virt-viewer-events.h virt-viewer-events.c \
-	virt-viewer-app.h virt-viewer-app.c \
-	virt-viewer-session.h virt-viewer-session.c \
-	virt-viewer-display.h virt-viewer-display.c \
-	virt-viewer-notebook.h virt-viewer-notebook.c \
-	virt-viewer-window.h virt-viewer-window.c \
-	view/autoDrawer.c \
-	view/autoDrawer.h \
-	view/drawer.c \
-	view/drawer.h \
-	view/ovBox.c \
-	view/ovBox.h
+virt_viewer_SOURCES =					\
+	virt-viewer-events.h virt-viewer-events.c	\
+	virt-viewer.h virt-viewer.c			\
+	virt-viewer-main.c				\
+	$(NULL)
+virt_viewer_LDADD = libvirt-viewer.la
+virt_viewer_LDFLAGS = @LIBVIRT_LIBS@
+virt_viewer_CFLAGS = $(AM_CFLAGS) @LIBVIRT_CFLAGS@
+
+if HAVE_SPICE_GTK
+bin_PROGRAMS += remote-viewer
+remote_viewer_SOURCES =				\
+	remote-viewer.h remote-viewer.c		\
+	remote-viewer-main.c			\
+	$(NULL)
+remote_viewer_LDADD = libvirt-viewer.la
+endif
+
+libvirt_viewer_la_SOURCES =				\
+	virt-viewer-util.h virt-viewer-util.c		\
+	virt-viewer-auth.h virt-viewer-auth.c		\
+	virt-viewer-app.h virt-viewer-app.c		\
+	virt-viewer-session.h virt-viewer-session.c	\
+	virt-viewer-display.h virt-viewer-display.c	\
+	virt-viewer-notebook.h virt-viewer-notebook.c	\
+	virt-viewer-window.h virt-viewer-window.c	\
+	view/autoDrawer.c				\
+	view/autoDrawer.h				\
+	view/drawer.c					\
+	view/drawer.h					\
+	view/ovBox.c					\
+	view/ovBox.h					\
+	$(NULL)
+libvirt_viewer_la_LIBADD =			\
+	@GMODULE2_LIBS@				\
+	@GTK_LIBS@				\
+	@LIBXML2_LIBS@				\
+	$(NULL)
 
 if HAVE_GTK_VNC
-virt_viewer_SOURCES += \
-	virt-viewer-session-vnc.h virt-viewer-session-vnc.c \
-	virt-viewer-display-vnc.h virt-viewer-display-vnc.c
+libvirt_viewer_la_SOURCES +=					\
+	virt-viewer-session-vnc.h virt-viewer-session-vnc.c	\
+	virt-viewer-display-vnc.h virt-viewer-display-vnc.c	\
+	$(NULL)
+libvirt_viewer_la_LIBADD += @GTK_VNC_LIBS@
 endif
 
 if HAVE_SPICE_GTK
-virt_viewer_SOURCES += \
-	virt-viewer-session-spice.h virt-viewer-session-spice.c \
-	virt-viewer-display-spice.h virt-viewer-display-spice.c
+libvirt_viewer_la_SOURCES +=					\
+	virt-viewer-session-spice.h virt-viewer-session-spice.c	\
+	virt-viewer-display-spice.h virt-viewer-display-spice.c	\
+	$(NULL)
+libvirt_viewer_la_LIBADD += @SPICE_GTK_LIBS@
 endif
 
-virt_viewer_LDADD = \
-	@GTK_VNC_LIBS@ \
-	@SPICE_GTK_LIBS@ \
-	@GMODULE2_LIBS@ \
-	@GTK_LIBS@ \
-	@LIBXML2_LIBS@ \
-	@LIBVIRT_LIBS@
-
-virt_viewer_CFLAGS = \
-	@GTK_VNC_CFLAGS@ \
-	@SPICE_GTK_CFLAGS@ \
+AM_CFLAGS =						\
 	@GMODULE2_CFLAGS@ \
-	@GTK_CFLAGS@ \
-	@LIBXML2_CFLAGS@ \
-	@LIBVIRT_CFLAGS@ \
-	@WARN_CFLAGS@ \
-	-DLOCALE_DIR=\""$(datadir)/locale"\"
+	@GTK_CFLAGS@					\
+	@GTK_VNC_CFLAGS@				\
+	@LIBXML2_CFLAGS@				\
+	@SPICE_GTK_CFLAGS@				\
+	@WARN_CFLAGS@					\
+	-DLOCALE_DIR=\""$(datadir)/locale"\"		\
+	$(NULL)
diff --git a/src/remote-viewer-main.c b/src/remote-viewer-main.c
new file mode 100644
index 0000000..54670d1
--- /dev/null
+++ b/src/remote-viewer-main.c
@@ -0,0 +1,148 @@
+/*
+ * Remote Viewer: A spice/vnc client based on virt-viewer
+ *
+ * Copyright (C) 2011 Red Hat,
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Marc-André Lureau <marcandre.lureau at redhat.com>
+ */
+
+#include <config.h>
+#include <locale.h>
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+#include <stdlib.h>
+
+#ifdef HAVE_GTK_VNC
+#include <vncdisplay.h>
+#endif
+#ifdef HAVE_SPICE_GTK
+#include <spice-option.h>
+#endif
+
+#include "remote-viewer.h"
+#include "virt-viewer-app.h"
+
+static void
+remote_viewer_version(void)
+{
+	g_print(_("remote-viewer version %s\n"), VERSION);
+	exit(0);
+}
+
+int
+main(int argc, char **argv)
+{
+	GOptionContext *context;
+	GError *error = NULL;
+	int ret = 1;
+	int zoom = 100;
+	gchar **args = NULL;
+	gboolean verbose = FALSE;
+	gboolean debug = FALSE;
+	gboolean direct = FALSE;
+	gboolean fullscreen = FALSE;
+	RemoteViewer *viewer = NULL;
+	VirtViewerApp *app;
+	const char *help_msg = N_("Run '" PACKAGE " --help' to see a full list of available command line options");
+	const GOptionEntry options [] = {
+		{ "version", 'V', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
+		  remote_viewer_version, N_("Display version information"), NULL },
+		{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
+		  N_("Display verbose information"), NULL },
+		{ "direct", 'd', 0, G_OPTION_ARG_NONE, &direct,
+		  N_("Direct connection with no automatic tunnels"), NULL },
+		{ "zoom", 'z', 0, G_OPTION_ARG_INT, &zoom,
+		  N_("Zoom level of window, in percentage"), "ZOOM" },
+		{ "debug", '\0', 0, G_OPTION_ARG_NONE, &debug,
+		  N_("Display debugging information"), NULL },
+		{ "full-screen", 'f', 0, G_OPTION_ARG_NONE, &fullscreen,
+		  N_("Open in full screen mode"), NULL },
+		{ G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &args,
+		  NULL, "URI" },
+		{ NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL }
+	};
+
+	setlocale(LC_ALL, "");
+	bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR);
+	bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
+	textdomain(GETTEXT_PACKAGE);
+
+	/* Setup command line options */
+	context = g_option_context_new (_("- Remote viewer client"));
+	g_option_context_add_main_entries (context, options, NULL);
+	g_option_context_add_group (context, gtk_get_option_group (TRUE));
+#ifdef HAVE_GTK_VNC
+	g_option_context_add_group (context, vnc_display_get_option_group ());
+#endif
+	g_option_context_parse (context, &argc, &argv, &error);
+	if (error) {
+		g_printerr("%s\n%s\n",
+			   error->message,
+			   gettext(help_msg));
+		g_error_free(error);
+		goto cleanup;
+	}
+
+	g_option_context_free(context);
+
+	if (!args || (g_strv_length(args) != 1)) {
+		g_printerr(_("\nUsage: %s [OPTIONS] URI\n\n%s\n\n"), argv[0], help_msg);
+		goto cleanup;
+	}
+
+	if (zoom < 10 || zoom > 200) {
+		g_printerr(_("Zoom level must be within 10-200\n"));
+		goto cleanup;
+	}
+
+	virt_viewer_app_set_debug(debug);
+
+	viewer = remote_viewer_new(args[0], verbose);
+	if (viewer == NULL)
+		goto cleanup;
+
+	app = VIRT_VIEWER_APP(viewer);
+	g_object_set(app,
+		     "fullscreen", fullscreen,
+		     "guest-name", args[0],
+		     NULL);
+	virt_viewer_window_set_zoom_level(virt_viewer_app_get_main_window(app), zoom);
+	virt_viewer_app_set_direct(app, direct);
+
+	if (!virt_viewer_app_start(app))
+		goto cleanup;
+
+	gtk_main();
+
+	ret = 0;
+
+cleanup:
+	if (viewer)
+		g_object_unref(viewer);
+	g_strfreev(args);
+
+	return ret;
+}
+
+/*
+ * Local variables:
+ *  c-indent-level: 8
+ *  c-basic-offset: 8
+ *  tab-width: 8
+ *  indent-tabs-mode: t
+ * End:
+ */
diff --git a/src/remote-viewer.c b/src/remote-viewer.c
new file mode 100644
index 0000000..d5c9824
--- /dev/null
+++ b/src/remote-viewer.c
@@ -0,0 +1,141 @@
+/*
+ * Virt Viewer: A virtual machine console viewer
+ *
+ * Copyright (C) 2007-2009 Red Hat,
+ * Copyright (C) 2009 Daniel P. Berrange
+ * Copyright (C) 2010 Marc-André Lureau
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Marc-André Lureau <marcandre.lureau at redhat.com>
+ */
+
+#include <config.h>
+#include <gtk/gtk.h>
+#include <glib/gprintf.h>
+#include <glib/gi18n.h>
+
+#include "virt-viewer-app.h"
+#include "remote-viewer.h"
+
+struct _RemoteViewerPrivate {
+	int _dummy;
+};
+
+G_DEFINE_TYPE (RemoteViewer, remote_viewer, VIRT_VIEWER_TYPE_APP)
+#define GET_PRIVATE(o)							\
+        (G_TYPE_INSTANCE_GET_PRIVATE ((o), REMOTE_VIEWER_TYPE, RemoteViewerPrivate))
+
+static gboolean remote_viewer_start(VirtViewerApp *self);
+
+static void
+remote_viewer_get_property (GObject *object, guint property_id,
+			    GValue *value G_GNUC_UNUSED, GParamSpec *pspec)
+{
+	switch (property_id) {
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+	}
+}
+
+static void
+remote_viewer_set_property (GObject *object, guint property_id,
+			    const GValue *value G_GNUC_UNUSED, GParamSpec *pspec)
+{
+	switch (property_id) {
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+	}
+}
+
+static void
+remote_viewer_dispose (GObject *object)
+{
+	G_OBJECT_CLASS(remote_viewer_parent_class)->dispose (object);
+}
+
+static void
+remote_viewer_class_init (RemoteViewerClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	VirtViewerAppClass *app_class = VIRT_VIEWER_APP_CLASS (klass);
+
+	g_type_class_add_private (klass, sizeof (RemoteViewerPrivate));
+
+	object_class->get_property = remote_viewer_get_property;
+	object_class->set_property = remote_viewer_set_property;
+	object_class->dispose = remote_viewer_dispose;
+
+	app_class->start = remote_viewer_start;
+}
+
+static void
+remote_viewer_init(RemoteViewer *self)
+{
+	self->priv = GET_PRIVATE(self);
+}
+
+RemoteViewer *
+remote_viewer_new(const gchar *uri, gboolean verbose)
+{
+	return g_object_new(REMOTE_VIEWER_TYPE,
+			    "guri", uri,
+			    "verbose", verbose,
+			    NULL);
+}
+
+static gboolean
+remote_viewer_start(VirtViewerApp *app)
+{
+	gchar *guri;
+	gchar *type;
+	gboolean ret = FALSE;
+
+	g_object_get(app, "guri", &guri, NULL);
+	g_return_val_if_fail(guri != NULL, FALSE);
+
+	DEBUG_LOG("Opening display to %s", guri);
+
+	if (virt_viewer_util_extract_host(guri, &type, NULL, NULL, NULL, NULL) < 0) {
+		virt_viewer_app_simple_message_dialog(app, _("Cannot determine the connection type from URI"));
+		goto cleanup;
+	}
+
+	if (virt_viewer_app_create_session(app, type) < 0) {
+		virt_viewer_app_simple_message_dialog(app, _("Couldn't create a session for this type: %s"), type);
+		goto cleanup;
+	}
+
+	if (virt_viewer_app_activate(app) < 0) {
+		virt_viewer_app_simple_message_dialog(app, _("Failed to initiate connection"));
+		goto cleanup;
+	}
+
+	ret = VIRT_VIEWER_APP_CLASS(remote_viewer_parent_class)->start(app);
+
+ cleanup:
+	g_free(guri);
+	g_free(type);
+	return ret;
+}
+
+/*
+ * Local variables:
+ *  c-indent-level: 8
+ *  c-basic-offset: 8
+ *  tab-width: 8
+ *  indent-tabs-mode: t
+ * End:
+ */
diff --git a/src/remote-viewer.h b/src/remote-viewer.h
new file mode 100644
index 0000000..1ff6d8d
--- /dev/null
+++ b/src/remote-viewer.h
@@ -0,0 +1,56 @@
+/*
+ * Virt Viewer: A virtual machine console viewer
+ *
+ * Copyright (C) 2007 Red Hat,
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Daniel P. Berrange <berrange at redhat.com>
+ */
+
+#ifndef REMOTE_VIEWER_H
+#define REMOTE_VIEWER_H
+
+#include <glib-object.h>
+#include "virt-viewer-app.h"
+
+G_BEGIN_DECLS
+
+#define REMOTE_VIEWER_TYPE remote_viewer_get_type()
+#define REMOTE_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMOTE_VIEWER_TYPE, RemoteViewer))
+#define REMOTE_VIEWER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMOTE_VIEWER_TYPE, RemoteViewerClass))
+#define REMOTE_VIEWER_IS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMOTE_VIEWER_TYPE))
+#define REMOTE_VIEWER_IS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMOTE_VIEWER_TYPE))
+#define REMOTE_VIEWER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMOTE_VIEWER_TYPE, RemoteViewerClass))
+
+typedef struct _RemoteViewerPrivate RemoteViewerPrivate;
+
+typedef struct {
+        VirtViewerApp parent;
+        RemoteViewerPrivate *priv;
+} RemoteViewer;
+
+typedef struct {
+        VirtViewerAppClass parent_class;
+} RemoteViewerClass;
+
+GType remote_viewer_get_type (void);
+
+RemoteViewer *
+remote_viewer_new(const gchar *uri, gboolean verbose);
+
+G_END_DECLS
+
+#endif /* REMOTE_VIEWER_H */
-- 
1.7.7.3




More information about the virt-tools-list mailing list