diff options
author | Marc-André Lureau <marcandre.lureau@gmail.com> | 2014-11-12 12:32:07 +0100 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@gmail.com> | 2014-11-25 13:00:49 +0100 |
commit | 5a444f106dd869473db15fa7952f0a2ea5a09091 (patch) | |
tree | 3965b16a213ad9be18ee60e7534c9682dbe23161 /src/virt-viewer.c | |
parent | dbbd72676a359e25df6cf73c1e898ff0ef763ba0 (diff) | |
download | virt-viewer-5a444f106dd869473db15fa7952f0a2ea5a09091.tar.gz virt-viewer-5a444f106dd869473db15fa7952f0a2ea5a09091.tar.xz virt-viewer-5a444f106dd869473db15fa7952f0a2ea5a09091.zip |
Move libvirt reconnect polling to VirtViewer
This is libvirt specific, no need to share it in the VirtViewerApp base
class.
Diffstat (limited to 'src/virt-viewer.c')
-rw-r--r-- | src/virt-viewer.c | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/src/virt-viewer.c b/src/virt-viewer.c index 231d1a8..b4691eb 100644 --- a/src/virt-viewer.c +++ b/src/virt-viewer.c @@ -59,6 +59,7 @@ struct _VirtViewerPrivate { gboolean reconnect; gboolean auth_cancelled; gint domain_event; + guint reconnect_poll; /* source id */ }; G_DEFINE_TYPE (VirtViewer, virt_viewer, VIRT_VIEWER_TYPE_APP) @@ -116,6 +117,39 @@ virt_viewer_init(VirtViewer *self) self->priv->domain_event = -1; } +static gboolean +virt_viewer_connect_timer(void *opaque) +{ + VirtViewer *self = VIRT_VIEWER(opaque); + VirtViewerApp *app = VIRT_VIEWER_APP(self); + + g_debug("Connect timer fired"); + + if (!virt_viewer_app_is_active(app) && + !virt_viewer_app_initial_connect(app, NULL)) + gtk_main_quit(); + + if (virt_viewer_app_is_active(app)) { + self->priv->reconnect_poll = 0; + return FALSE; + } + + return TRUE; +} + +static void +virt_viewer_start_reconnect_poll(VirtViewer *self) +{ + VirtViewerPrivate *priv = self->priv; + + g_debug("reconnect_poll: %d", priv->reconnect_poll); + + if (priv->reconnect_poll != 0) + return; + + priv->reconnect_poll = g_timeout_add(500, virt_viewer_connect_timer, self); +} + static void virt_viewer_deactivated(VirtViewerApp *app, gboolean connect_error) { @@ -130,7 +164,7 @@ virt_viewer_deactivated(VirtViewerApp *app, gboolean connect_error) if (priv->reconnect) { if (priv->domain_event < 0) { g_debug("No domain events, falling back to polling"); - virt_viewer_app_start_reconnect_poll(app); + virt_viewer_start_reconnect_poll(self); } virt_viewer_app_show_status(app, _("Waiting for guest domain to re-start")); @@ -513,7 +547,6 @@ virt_viewer_conn_event(virConnectPtr conn G_GNUC_UNUSED, void *opaque) { VirtViewer *self = opaque; - VirtViewerApp *app = VIRT_VIEWER_APP(self); VirtViewerPrivate *priv = self->priv; g_debug("Got connection event %d", reason); @@ -521,7 +554,7 @@ virt_viewer_conn_event(virConnectPtr conn G_GNUC_UNUSED, virConnectClose(priv->conn); priv->conn = NULL; - virt_viewer_app_start_reconnect_poll(app); + virt_viewer_start_reconnect_poll(self); } static void @@ -836,7 +869,7 @@ virt_viewer_connect(VirtViewerApp *app) if (priv->domain_event < 0 && !virt_viewer_app_is_active(app)) { g_debug("No domain events, falling back to polling"); - virt_viewer_app_start_reconnect_poll(app); + virt_viewer_start_reconnect_poll(self); } if (virConnectRegisterCloseCallback(priv->conn, |