[virt-tools-list] [virt-viewer 15/20] VirtViewerSessionOvirt implementation

Christophe Fergeau cfergeau at redhat.com
Wed Jun 13 12:23:23 UTC 2012


This will be a stub which will resolve the ovirt URI and
appropriately create either a VirtViewerSessionSpice or
VirtViewerSessionVnc, and it will then forward the various
VirtViewerSession calls to the actual session.
---
 src/Makefile.am                 |    2 +
 src/virt-viewer-app.c           |   11 ++
 src/virt-viewer-session-ovirt.c |  241 +++++++++++++++++++++++++++++++++++++++
 src/virt-viewer-session-ovirt.h |   77 +++++++++++++
 4 files changed, 331 insertions(+)
 create mode 100644 src/virt-viewer-session-ovirt.c
 create mode 100644 src/virt-viewer-session-ovirt.h

diff --git a/src/Makefile.am b/src/Makefile.am
index 733fd42..bfceacf 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -63,6 +63,8 @@ COMMON_SOURCES +=			\
 	ovirt-rest-call.c		\
 	ovirt-vm.c			\
 	ovirt-vm-display.c		\
+	virt-viewer-session-ovirt.h	\
+	virt-viewer-session-ovirt.c	\
 	$(OVIRT_HEADER_FILES)		\
 	$(NULL)
 
diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
index 2275d1c..9b577b2 100644
--- a/src/virt-viewer-app.c
+++ b/src/virt-viewer-app.c
@@ -58,6 +58,9 @@
 #ifdef HAVE_GTK_VNC
 #include "virt-viewer-session-vnc.h"
 #endif
+#ifdef HAVE_OVIRT
+#include "virt-viewer-session-ovirt.h"
+#endif
 #ifdef HAVE_SPICE_GTK
 #include "virt-viewer-session-spice.h"
 #endif
@@ -695,6 +698,14 @@ virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type)
         priv->session = virt_viewer_session_vnc_new(window);
     } else
 #endif
+#ifdef HAVE_OVIRT
+    if (g_ascii_strcasecmp(type, "ovirt") == 0) {
+        GtkWindow *window = virt_viewer_window_get_window(priv->main_window);
+        virt_viewer_app_trace(self, "Guest %s has a %s display\n",
+                              priv->guest_name, type);
+        priv->session = virt_viewer_session_ovirt_new(self, window);
+    } else
+#endif
 #ifdef HAVE_SPICE_GTK
     if (g_ascii_strcasecmp(type, "spice") == 0) {
         GtkWindow *window = virt_viewer_window_get_window(priv->main_window);
diff --git a/src/virt-viewer-session-ovirt.c b/src/virt-viewer-session-ovirt.c
new file mode 100644
index 0000000..de77306
--- /dev/null
+++ b/src/virt-viewer-session-ovirt.c
@@ -0,0 +1,241 @@
+/*
+ * Virt Viewer: A virtual machine console viewer
+ *
+ * Copyright (C) 2007-2012 Red Hat, Inc.
+ * Copyright (C) 2009-2012 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: Daniel P. Berrange <berrange at redhat.com>
+ */
+
+#include <config.h>
+
+#include <glib/gi18n.h>
+
+#include "ovirt-proxy.h"
+#include "virt-viewer-util.h"
+#include "virt-viewer-session-ovirt.h"
+
+#if !GLIB_CHECK_VERSION(2, 26, 0)
+#include "gbinding.h"
+#include "gbinding.c"
+#endif
+
+G_DEFINE_TYPE (VirtViewerSessionOvirt, virt_viewer_session_ovirt, VIRT_VIEWER_TYPE_SESSION)
+
+
+struct _VirtViewerSessionOvirtPrivate {
+    VirtViewerSession *real_session;
+    GtkWindow *main_window;
+};
+
+#define VIRT_VIEWER_SESSION_OVIRT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), VIRT_VIEWER_TYPE_SESSION_OVIRT, VirtViewerSessionOvirtPrivate))
+
+enum {
+    PROP_0,
+    PROP_SPICE_SESSION,
+};
+
+
+static void virt_viewer_session_ovirt_close(VirtViewerSession *session);
+static gboolean virt_viewer_session_ovirt_open_fd(VirtViewerSession *session, int fd);
+static gboolean virt_viewer_session_ovirt_open_host(VirtViewerSession *session, const gchar *host, const gchar *port, const gchar *tlsport);
+static gboolean virt_viewer_session_ovirt_open_uri(VirtViewerSession *session, const gchar *uri);
+static gboolean virt_viewer_session_ovirt_channel_open_fd(VirtViewerSession *session, VirtViewerSessionChannel *channel, int fd);
+static gboolean virt_viewer_session_ovirt_has_usb(VirtViewerSession *session);
+static void virt_viewer_session_ovirt_usb_device_selection(VirtViewerSession *session, GtkWindow *parent);
+static void virt_viewer_session_ovirt_smartcard_insert(VirtViewerSession *session);
+static void virt_viewer_session_ovirt_smartcard_remove(VirtViewerSession *session);
+
+
+static void
+virt_viewer_session_ovirt_dispose(GObject *obj)
+{
+    VirtViewerSessionOvirt *ovirt = VIRT_VIEWER_SESSION_OVIRT(obj);
+
+    g_clear_object(&ovirt->priv->real_session);
+    g_clear_object(&ovirt->priv->main_window);
+
+    G_OBJECT_CLASS(virt_viewer_session_ovirt_parent_class)->dispose(obj);
+}
+
+
+static void
+virt_viewer_session_ovirt_class_init(VirtViewerSessionOvirtClass *klass)
+{
+    VirtViewerSessionClass *dclass = VIRT_VIEWER_SESSION_CLASS(klass);
+    GObjectClass *oclass = G_OBJECT_CLASS(klass);
+
+    oclass->dispose = virt_viewer_session_ovirt_dispose;
+
+    dclass->close = virt_viewer_session_ovirt_close;
+    dclass->open_fd = virt_viewer_session_ovirt_open_fd;
+    dclass->open_host = virt_viewer_session_ovirt_open_host;
+    dclass->open_uri = virt_viewer_session_ovirt_open_uri;
+    dclass->channel_open_fd = virt_viewer_session_ovirt_channel_open_fd;
+    dclass->has_usb = virt_viewer_session_ovirt_has_usb;
+    dclass->usb_device_selection = virt_viewer_session_ovirt_usb_device_selection;
+    dclass->smartcard_insert = virt_viewer_session_ovirt_smartcard_insert;
+    dclass->smartcard_remove = virt_viewer_session_ovirt_smartcard_remove;
+
+    g_type_class_add_private(klass, sizeof(VirtViewerSessionOvirtPrivate));
+}
+
+static void
+virt_viewer_session_ovirt_init(VirtViewerSessionOvirt *self)
+{
+    self->priv = VIRT_VIEWER_SESSION_OVIRT_GET_PRIVATE(self);
+}
+
+static void
+virt_viewer_session_ovirt_close(VirtViewerSession *session)
+{
+    VirtViewerSessionOvirt *self = VIRT_VIEWER_SESSION_OVIRT(session);
+
+    g_return_if_fail(self != NULL);
+
+    if (self->priv->real_session) {
+        virt_viewer_session_close(self->priv->real_session);
+    }
+
+#if 0
+/*FIXME: what's up?*/
+    /* FIXME: version 0.7 of spice-gtk allows reuse of session */
+    create_spice_session(self);
+#endif
+}
+
+static gboolean
+virt_viewer_session_ovirt_open_host(VirtViewerSession *session,
+                                    const gchar *host,
+                                    const gchar *port,
+                                    const gchar *tlsport)
+{
+    /* FIXME: resolve if possible ? */
+    VirtViewerSessionOvirt *self = VIRT_VIEWER_SESSION_OVIRT(session);
+
+    g_return_val_if_fail(self != NULL, FALSE);
+    g_return_val_if_fail(self->priv->real_session != NULL, FALSE);
+
+    return virt_viewer_session_open_host(self->priv->real_session,
+                                         host, port, tlsport);
+}
+
+static gboolean
+virt_viewer_session_ovirt_open_uri(VirtViewerSession *session,
+                                   const gchar *uri)
+{
+    /* FIXME: resolve */
+    VirtViewerSessionOvirt *self = VIRT_VIEWER_SESSION_OVIRT(session);
+
+    g_return_val_if_fail(self != NULL, FALSE);
+    g_return_val_if_fail(self->priv->real_session != NULL, FALSE);
+
+    return virt_viewer_session_open_uri(self->priv->real_session, uri);
+}
+
+static gboolean
+virt_viewer_session_ovirt_open_fd(VirtViewerSession *session,
+                                  int fd)
+{
+    VirtViewerSessionOvirt *self = VIRT_VIEWER_SESSION_OVIRT(session);
+
+    g_return_val_if_fail(self != NULL, FALSE);
+    g_return_val_if_fail(self->priv->real_session != NULL, FALSE);
+
+    return virt_viewer_session_open_fd(self->priv->real_session, fd);
+}
+
+static gboolean
+virt_viewer_session_ovirt_channel_open_fd(VirtViewerSession *session,
+                                          VirtViewerSessionChannel *channel,
+                                          int fd)
+{
+    VirtViewerSessionOvirt *self = VIRT_VIEWER_SESSION_OVIRT(session);
+
+    g_return_val_if_fail(self != NULL, FALSE);
+    g_return_val_if_fail(self->priv->real_session != NULL, FALSE);
+
+    return virt_viewer_session_channel_open_fd(self->priv->real_session,
+                                               channel, fd);
+}
+
+static gboolean
+virt_viewer_session_ovirt_has_usb(VirtViewerSession *session)
+{
+    VirtViewerSessionOvirt *self = VIRT_VIEWER_SESSION_OVIRT(session);
+
+    g_return_val_if_fail(self != NULL, FALSE);
+    g_return_val_if_fail(self->priv->real_session != NULL, FALSE);
+
+    return virt_viewer_session_has_usb(self->priv->real_session);
+}
+
+static void
+virt_viewer_session_ovirt_usb_device_selection(VirtViewerSession *session,
+                                               GtkWindow *parent)
+{
+    VirtViewerSessionOvirt *self = VIRT_VIEWER_SESSION_OVIRT(session);
+
+    g_return_if_fail(self != NULL);
+    g_return_if_fail(self->priv->real_session != NULL);
+
+    virt_viewer_session_usb_device_selection(self->priv->real_session, parent);
+
+}
+
+VirtViewerSession *
+virt_viewer_session_ovirt_new(VirtViewerApp *app, GtkWindow *main_window)
+{
+    VirtViewerSessionOvirt *self;
+
+    self = g_object_new(VIRT_VIEWER_TYPE_SESSION_OVIRT, "app", app, NULL);
+
+    self->priv->main_window = g_object_ref(main_window);
+
+    return VIRT_VIEWER_SESSION(self);
+}
+
+static void
+virt_viewer_session_ovirt_smartcard_insert(VirtViewerSession *session)
+{
+    VirtViewerSessionOvirt *self = VIRT_VIEWER_SESSION_OVIRT(session);
+
+    g_return_if_fail(self != NULL);
+    g_return_if_fail(self->priv->real_session != NULL);
+
+    virt_viewer_session_smartcard_insert(self->priv->real_session);
+}
+
+static void
+virt_viewer_session_ovirt_smartcard_remove(VirtViewerSession *session)
+{
+    VirtViewerSessionOvirt *self = VIRT_VIEWER_SESSION_OVIRT(session);
+
+    g_return_if_fail(self != NULL);
+    g_return_if_fail(self->priv->real_session != NULL);
+
+    virt_viewer_session_smartcard_remove(self->priv->real_session);
+}
+
+/*
+ * Local variables:
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ *  indent-tabs-mode: nil
+ * End:
+ */
diff --git a/src/virt-viewer-session-ovirt.h b/src/virt-viewer-session-ovirt.h
new file mode 100644
index 0000000..e07aad1
--- /dev/null
+++ b/src/virt-viewer-session-ovirt.h
@@ -0,0 +1,77 @@
+/*
+ * Virt Viewer: A virtual machine console viewer
+ *
+ * Copyright (C) 2007-2012 Red Hat, Inc.
+ * Copyright (C) 2009-2012 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: Daniel P. Berrange <berrange at redhat.com>
+ */
+#ifndef _VIRT_VIEWER_SESSION_OVIRT_H
+#define _VIRT_VIEWER_SESSION_OVIRT_H
+
+#include <glib-object.h>
+
+#include "virt-viewer-session.h"
+
+G_BEGIN_DECLS
+
+#define VIRT_VIEWER_TYPE_SESSION_OVIRT virt_viewer_session_ovirt_get_type()
+
+#define VIRT_VIEWER_SESSION_OVIRT(obj)                                        \
+    (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIRT_VIEWER_TYPE_SESSION_OVIRT, VirtViewerSessionOvirt))
+
+#define VIRT_VIEWER_SESSION_OVIRT_CLASS(klass)                                \
+    (G_TYPE_CHECK_CLASS_CAST ((klass), VIRT_VIEWER_TYPE_SESSION_OVIRT, VirtViewerSessionOvirtClass))
+
+#define VIRT_VIEWER_IS_SESSION_OVIRT(obj)                                \
+    (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIRT_VIEWER_TYPE_SESSION_OVIRT))
+
+#define VIRT_VIEWER_IS_SESSION_OVIRT_CLASS(klass)                        \
+    (G_TYPE_CHECK_CLASS_TYPE ((klass), VIRT_VIEWER_TYPE_SESSION_OVIRT))
+
+#define VIRT_VIEWER_SESSION_OVIRT_GET_CLASS(obj)                        \
+    (G_TYPE_INSTANCE_GET_CLASS ((obj), VIRT_VIEWER_TYPE_SESSION_OVIRT, VirtViewerSessionOvirtClass))
+
+typedef struct _VirtViewerSessionOvirt VirtViewerSessionOvirt;
+typedef struct _VirtViewerSessionOvirtClass VirtViewerSessionOvirtClass;
+typedef struct _VirtViewerSessionOvirtPrivate VirtViewerSessionOvirtPrivate;
+
+struct _VirtViewerSessionOvirt {
+    VirtViewerSession parent;
+
+    VirtViewerSessionOvirtPrivate *priv;
+};
+
+struct _VirtViewerSessionOvirtClass {
+    VirtViewerSessionClass parent_class;
+};
+
+GType virt_viewer_session_ovirt_get_type(void);
+
+VirtViewerSession* virt_viewer_session_ovirt_new(VirtViewerApp *app, GtkWindow *main_window);
+
+G_END_DECLS
+
+#endif /* _VIRT_VIEWER_SESSION_OVIRT_H */
+/*
+ * Local variables:
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ *  indent-tabs-mode: nil
+ * End:
+ */
-- 
1.7.10.2




More information about the virt-tools-list mailing list