From a94100eaebd9ac23a164640e270a7ffaea98943e Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 31 Jan 2012 14:10:05 +0000 Subject: [PATCH] Make VNC support opening connections based on URI --- src/virt-viewer-session-vnc.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/virt-viewer-session-vnc.c b/src/virt-viewer-session-vnc.c index ad3002a..eac712c 100644 --- a/src/virt-viewer-session-vnc.c +++ b/src/virt-viewer-session-vnc.c @@ -27,6 +27,7 @@ #include "virt-viewer-display-vnc.h" #include +#include G_DEFINE_TYPE(VirtViewerSessionVnc, virt_viewer_session_vnc, VIRT_VIEWER_TYPE_SESSION) @@ -40,6 +41,7 @@ struct _VirtViewerSessionVncPrivate { static void virt_viewer_session_vnc_close(VirtViewerSession* session); static gboolean virt_viewer_session_vnc_open_fd(VirtViewerSession* session, int fd); static gboolean virt_viewer_session_vnc_open_host(VirtViewerSession* session, char *host, char *port); +static gboolean virt_viewer_session_vnc_open_uri(VirtViewerSession* session, char *uri); static gboolean virt_viewer_session_vnc_channel_open_fd(VirtViewerSession* session, VirtViewerSessionChannel* channel, int fd); @@ -69,6 +71,7 @@ virt_viewer_session_vnc_class_init(VirtViewerSessionVncClass *klass) dclass->close = virt_viewer_session_vnc_close; dclass->open_fd = virt_viewer_session_vnc_open_fd; dclass->open_host = virt_viewer_session_vnc_open_host; + dclass->open_uri = virt_viewer_session_vnc_open_uri; dclass->channel_open_fd = virt_viewer_session_vnc_channel_open_fd; g_type_class_add_private(oclass, sizeof(VirtViewerSessionVncPrivate)); @@ -180,6 +183,29 @@ virt_viewer_session_vnc_open_host(VirtViewerSession* session, return vnc_display_open_host(self->priv->vnc, host, port); } +static gboolean +virt_viewer_session_vnc_open_uri(VirtViewerSession* session, + char *uristr) +{ + VirtViewerSessionVnc *self = VIRT_VIEWER_SESSION_VNC(session); + xmlURIPtr uri = NULL; + gchar *portstr; + gboolean ret; + + g_return_val_if_fail(self != NULL, FALSE); + g_return_val_if_fail(self->priv->vnc != NULL, FALSE); + + if (!(uri = xmlParseURI(uristr))) + return FALSE; + + portstr = g_strdup_printf("%d", uri->port); + + ret = vnc_display_open_host(self->priv->vnc, uri->server, portstr); + g_free(portstr); + xmlFreeURI(uri); + return ret; +} + static void virt_viewer_session_vnc_close(VirtViewerSession* session) {