[virt-tools-list] [PATCH virt-viewer 13/17] Add error dialog for USB redirection failure
Marc-André Lureau
marcandre.lureau at gmail.com
Fri Jan 27 13:51:32 UTC 2012
---
src/virt-viewer-app.c | 18 +++++++++++---
src/virt-viewer-session-spice.c | 50 ++++++++++++++++++++++++++++-----------
src/virt-viewer-session.c | 10 +++++++
src/virt-viewer-session.h | 1 +
4 files changed, 61 insertions(+), 18 deletions(-)
diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
index 352f206..f340917 100644
--- a/src/virt-viewer-app.c
+++ b/src/virt-viewer-app.c
@@ -81,6 +81,9 @@ static void virt_viewer_app_auth_refused(VirtViewerSession *session,
static void virt_viewer_app_auth_failed(VirtViewerSession *session,
const char *msg,
VirtViewerApp *self);
+static void virt_viewer_app_usb_failed(VirtViewerSession *session,
+ const char *msg,
+ VirtViewerApp *self);
static void virt_viewer_app_server_cut_text(VirtViewerSession *session,
const gchar *text,
@@ -632,6 +635,8 @@ virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type)
G_CALLBACK(virt_viewer_app_auth_refused), self);
g_signal_connect(priv->session, "session-auth-failed",
G_CALLBACK(virt_viewer_app_auth_failed), self);
+ g_signal_connect(priv->session, "session-usb-failed",
+ G_CALLBACK(virt_viewer_app_usb_failed), self);
g_signal_connect(priv->session, "session-display-added",
G_CALLBACK(virt_viewer_app_display_added), self);
g_signal_connect(priv->session, "session-display-removed",
@@ -987,11 +992,16 @@ static void virt_viewer_app_auth_failed(VirtViewerSession *session G_GNUC_UNUSED
const char *msg,
VirtViewerApp *self)
{
- VirtViewerAppPrivate *priv = self->priv;
-
virt_viewer_app_simple_message_dialog(self,
- _("Unable to authenticate with remote desktop server at %s"),
- priv->pretty_address, msg);
+ _("Unable to authenticate with remote desktop server: %s"),
+ msg);
+}
+
+static void virt_viewer_app_usb_failed(VirtViewerSession *session G_GNUC_UNUSED,
+ const gchar *msg,
+ VirtViewerApp *self)
+{
+ virt_viewer_app_simple_message_dialog(self, _("USB redirection error: %s"), msg);
}
static void
diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c
index de2da3d..763b28d 100644
--- a/src/virt-viewer-session-spice.c
+++ b/src/virt-viewer-session-spice.c
@@ -137,6 +137,39 @@ virt_viewer_session_spice_init(VirtViewerSessionSpice *self G_GNUC_UNUSED)
}
static void
+usb_auto_connect_failed(SpiceUsbDeviceManager *manager G_GNUC_UNUSED,
+ SpiceUsbDevice *device G_GNUC_UNUSED,
+ GError *error, VirtViewerSessionSpice *self)
+{
+ if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
+
+ g_signal_emit_by_name(self, "session-usb-failed", error->message);
+}
+
+static void
+create_spice_session(VirtViewerSessionSpice *self)
+{
+ SpiceUsbDeviceManager *manager;
+
+ g_return_if_fail(self != NULL);
+ g_return_if_fail(self->priv->session == NULL);
+
+ self->priv->session = spice_session_new();
+ spice_set_session_option(self->priv->session);
+
+ g_signal_connect(self->priv->session, "channel-new",
+ G_CALLBACK(virt_viewer_session_spice_channel_new), self);
+ g_signal_connect(self->priv->session, "channel-destroy",
+ G_CALLBACK(virt_viewer_session_spice_channel_destroy), self);
+
+ manager = spice_usb_device_manager_get(self->priv->session, NULL);
+ if (manager)
+ g_signal_connect(manager, "auto-connect-failed",
+ G_CALLBACK(usb_auto_connect_failed), self);
+}
+
+static void
virt_viewer_session_spice_close(VirtViewerSession *session)
{
VirtViewerSessionSpice *self = VIRT_VIEWER_SESSION_SPICE(session);
@@ -148,6 +181,7 @@ virt_viewer_session_spice_close(VirtViewerSession *session)
if (self->priv->session) {
spice_session_disconnect(self->priv->session);
g_object_unref(self->priv->session);
+ self->priv->session = NULL;
if (self->priv->audio)
g_object_unref(self->priv->audio);
@@ -155,13 +189,7 @@ virt_viewer_session_spice_close(VirtViewerSession *session)
}
/* FIXME: version 0.7 of spice-gtk allows reuse of session */
- self->priv->session = spice_session_new();
- spice_set_session_option(self->priv->session);
- g_signal_connect(self->priv->session, "channel-new",
- G_CALLBACK(virt_viewer_session_spice_channel_new), self);
- g_signal_connect(self->priv->session, "channel-destroy",
- G_CALLBACK(virt_viewer_session_spice_channel_destroy), self);
-
+ create_spice_session(self);
}
static gboolean
@@ -352,13 +380,7 @@ virt_viewer_session_spice_new(void)
self = g_object_new(VIRT_VIEWER_TYPE_SESSION_SPICE, NULL);
- self->priv->session = spice_session_new();
- spice_set_session_option(self->priv->session);
-
- g_signal_connect(self->priv->session, "channel-new",
- G_CALLBACK(virt_viewer_session_spice_channel_new), self);
- g_signal_connect(self->priv->session, "channel-destroy",
- G_CALLBACK(virt_viewer_session_spice_channel_destroy), self);
+ create_spice_session(self);
return VIRT_VIEWER_SESSION(self);
}
diff --git a/src/virt-viewer-session.c b/src/virt-viewer-session.c
index 8dfa1ee..c794c0b 100644
--- a/src/virt-viewer-session.c
+++ b/src/virt-viewer-session.c
@@ -120,6 +120,16 @@ virt_viewer_session_class_init(VirtViewerSessionClass *class)
1,
G_TYPE_STRING);
+ g_signal_new("session-usb-failed",
+ G_OBJECT_CLASS_TYPE(object_class),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_NO_HOOKS,
+ G_STRUCT_OFFSET(VirtViewerSessionClass, session_usb_failed),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
g_signal_new("session-display-added",
G_OBJECT_CLASS_TYPE(object_class),
diff --git a/src/virt-viewer-session.h b/src/virt-viewer-session.h
index 28c2c26..2856b5c 100644
--- a/src/virt-viewer-session.h
+++ b/src/virt-viewer-session.h
@@ -77,6 +77,7 @@ struct _VirtViewerSessionClass {
void (*session_disconnected)(VirtViewerSession *session);
void (*session_auth_refused)(VirtViewerSession *session, const char *msg);
void (*session_auth_failed)(VirtViewerSession *session, const char *msg);
+ void (*session_usb_failed)(VirtViewerSession *session, const char *msg);
void (*session_channel_open)(VirtViewerSession *session, VirtViewerSessionChannel *channel);
--
1.7.7.6
More information about the virt-tools-list
mailing list