[virt-tools-list] [virt-viewer 16/20] Add oVirt URI parsing

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


---
 src/virt-viewer-session-ovirt.c |   60 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 58 insertions(+), 2 deletions(-)

diff --git a/src/virt-viewer-session-ovirt.c b/src/virt-viewer-session-ovirt.c
index de77306..3fc7c62 100644
--- a/src/virt-viewer-session-ovirt.c
+++ b/src/virt-viewer-session-ovirt.c
@@ -41,6 +41,8 @@ G_DEFINE_TYPE (VirtViewerSessionOvirt, virt_viewer_session_ovirt, VIRT_VIEWER_TY
 struct _VirtViewerSessionOvirtPrivate {
     VirtViewerSession *real_session;
     GtkWindow *main_window;
+    char *rest_uri;
+    char *vm_name;
 };
 
 #define VIRT_VIEWER_SESSION_OVIRT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), VIRT_VIEWER_TYPE_SESSION_OVIRT, VirtViewerSessionOvirtPrivate))
@@ -70,6 +72,12 @@ virt_viewer_session_ovirt_dispose(GObject *obj)
     g_clear_object(&ovirt->priv->real_session);
     g_clear_object(&ovirt->priv->main_window);
 
+    g_free(ovirt->priv->rest_uri);
+    ovirt->priv->rest_uri = NULL;
+
+    g_free(ovirt->priv->vm_name);
+    ovirt->priv->vm_name = NULL;
+
     G_OBJECT_CLASS(virt_viewer_session_ovirt_parent_class)->dispose(obj);
 }
 
@@ -136,16 +144,64 @@ virt_viewer_session_ovirt_open_host(VirtViewerSession *session,
 }
 
 static gboolean
+parse_uri(VirtViewerSession *session, const gchar *uri)
+{
+    VirtViewerSessionOvirt *self = VIRT_VIEWER_SESSION_OVIRT(session);
+    char *pos;
+    char *vm_name;
+    char *tmp_uri;
+
+    /* extract VM name from URI */
+    pos = strrchr(uri, '/');
+    if (pos == NULL)
+        return FALSE;
+
+    pos++;
+    if (*pos == '\0')
+        return FALSE;
+    vm_name = pos;
+
+    /* remove vm_name and trailing / from uri */
+    pos = pos - 1;
+    g_assert(*pos == '/');
+
+    while ((pos != uri) && (*pos == '/'))
+        pos--;
+    if (pos == uri)
+        return FALSE;
+    if (pos - uri + 1 < strlen("ovirt://")) {
+        /* we trimmed too much */
+        return FALSE;
+    }
+
+    tmp_uri = g_strndup(uri, pos - uri + 1);
+    g_assert(g_str_has_prefix(tmp_uri, "ovirt://"));
+    /* FIXME: how to decide between http and https? */
+    self->priv->rest_uri = g_strdup_printf("http://%s/api/",
+                                           tmp_uri + strlen("ovirt://"));
+    g_free(tmp_uri);
+    self->priv->vm_name = g_strdup(vm_name);
+    g_message("oVirt base URI: %s", self->priv->rest_uri);
+    g_message("oVirt VM name: %s", self->priv->vm_name);
+
+    return TRUE;
+}
+
+static gboolean
 virt_viewer_session_ovirt_open_uri(VirtViewerSession *session,
                                    const gchar *uri)
 {
     /* FIXME: resolve */
     VirtViewerSessionOvirt *self = VIRT_VIEWER_SESSION_OVIRT(session);
+    OvirtProxy *proxy;
 
     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);
+    g_warning("open_uri: %s", uri);
+    if (!parse_uri(session, uri))
+        return FALSE;
+
+    return FALSE;
 }
 
 static gboolean
-- 
1.7.10.2




More information about the virt-tools-list mailing list