[virt-tools-list] [PATCH] usbredir: Don't depend on channel ordering
Marc-André Lureau
mlureau at redhat.com
Thu Jun 27 22:20:30 UTC 2013
Is there a bug for that? Are you adding dynamic usbredir channels?
ack
----- Mensaje original -----
> Before this patch-set virt-viewer was calling spice_session_has_channel_type(
> session, SPICE_CHANNEL_USBREDIR) from the session-initialized signal handler,
>
> So as soon as the display channel gets added to the session, the check was
> done. This causes the check to return FALSE for usbredir capable vms if
> the usbredir channel(s) get added to the session after the display channed.
>
> This patch refactors things to not depend on channel creation order.
>
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
> src/virt-viewer-app.c | 18 +++++++++++++-----
> src/virt-viewer-session-spice.c | 28 +++++++++++++++-------------
> src/virt-viewer-session.c | 39 ++++++++++++++++++++++++++++++++-------
> src/virt-viewer-session.h | 5 +++--
> 4 files changed, 63 insertions(+), 27 deletions(-)
>
> diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
> index c2ecc67..69cc328 100644
> --- a/src/virt-viewer-app.c
> +++ b/src/virt-viewer-app.c
> @@ -589,8 +589,8 @@ virt_viewer_app_set_nth_window(VirtViewerApp *self, gint
> nth, VirtViewerWindow *
> virt_viewer_app_set_window_subtitle(self, win, nth);
> virt_viewer_app_update_menu_displays(self);
> if (self->priv->session) {
> - gboolean has_usb = virt_viewer_session_has_usb(self->priv->session);
> - virt_viewer_window_set_usb_options_sensitive(win, has_usb);
> + virt_viewer_window_set_usb_options_sensitive(win,
> +
> virt_viewer_session_get_has_usbredir(self->priv->session));
> }
>
> g_signal_emit(self, signals[SIGNAL_WINDOW_ADDED], 0, win);
> @@ -748,6 +748,15 @@ virt_viewer_app_display_updated(VirtViewerSession
> *session G_GNUC_UNUSED,
> virt_viewer_app_update_menu_displays(self);
> }
>
> +static void
> +virt_viewer_app_has_usbredir_updated(VirtViewerSession *session,
> + GParamSpec *pspec G_GNUC_UNUSED,
> + VirtViewerApp *self)
> +{
> + virt_viewer_app_set_usb_options_sensitive(self,
> + virt_viewer_session_get_has_usbredir(session));
> +}
> +
> int
> virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type)
> {
> @@ -800,6 +809,8 @@ virt_viewer_app_create_session(VirtViewerApp *self, const
> gchar *type)
> G_CALLBACK(virt_viewer_app_display_removed), self);
> g_signal_connect(priv->session, "session-display-updated",
> G_CALLBACK(virt_viewer_app_display_updated), self);
> + g_signal_connect(priv->session, "notify::has-usbredir",
> + G_CALLBACK(virt_viewer_app_has_usbredir_updated),
> self);
>
> g_signal_connect(priv->session, "session-cut-text",
> G_CALLBACK(virt_viewer_app_server_cut_text), self);
> @@ -1145,10 +1156,7 @@ static void
> virt_viewer_app_initialized(VirtViewerSession *session G_GNUC_UNUSED,
> VirtViewerApp *self)
> {
> - gboolean has_usb = virt_viewer_session_has_usb(self->priv->session);
> -
> virt_viewer_app_update_title(self);
> - virt_viewer_app_set_usb_options_sensitive(self, has_usb);
> }
>
> static void
> diff --git a/src/virt-viewer-session-spice.c
> b/src/virt-viewer-session-spice.c
> index 06e0005..74fa3fe 100644
> --- a/src/virt-viewer-session-spice.c
> +++ b/src/virt-viewer-session-spice.c
> @@ -51,6 +51,7 @@ struct _VirtViewerSessionSpicePrivate {
> SpiceMainChannel *main_channel;
> const SpiceAudio *audio;
> int channel_count;
> + int usbredir_channel_count;
> };
>
> #define VIRT_VIEWER_SESSION_SPICE_GET_PRIVATE(o)
> (G_TYPE_INSTANCE_GET_PRIVATE((o), VIRT_VIEWER_TYPE_SESSION_SPICE,
> VirtViewerSessionSpicePrivate))
> @@ -66,7 +67,6 @@ static gboolean
> virt_viewer_session_spice_open_fd(VirtViewerSession *session, in
> static gboolean virt_viewer_session_spice_open_host(VirtViewerSession
> *session, const gchar *host, const gchar *port, const gchar *tlsport);
> static gboolean virt_viewer_session_spice_open_uri(VirtViewerSession
> *session, const gchar *uri, GError **error);
> static gboolean virt_viewer_session_spice_channel_open_fd(VirtViewerSession
> *session, VirtViewerSessionChannel *channel, int fd);
> -static gboolean virt_viewer_session_spice_has_usb(VirtViewerSession
> *session);
> static void virt_viewer_session_spice_usb_device_selection(VirtViewerSession
> *session, GtkWindow *parent);
> static void virt_viewer_session_spice_channel_new(SpiceSession *s,
> SpiceChannel *channel,
> @@ -145,7 +145,6 @@
> virt_viewer_session_spice_class_init(VirtViewerSessionSpiceClass *klass)
> dclass->open_host = virt_viewer_session_spice_open_host;
> dclass->open_uri = virt_viewer_session_spice_open_uri;
> dclass->channel_open_fd = virt_viewer_session_spice_channel_open_fd;
> - dclass->has_usb = virt_viewer_session_spice_has_usb;
> dclass->usb_device_selection =
> virt_viewer_session_spice_usb_device_selection;
> dclass->smartcard_insert = virt_viewer_session_spice_smartcard_insert;
> dclass->smartcard_remove = virt_viewer_session_spice_smartcard_remove;
> @@ -461,17 +460,6 @@
> virt_viewer_session_spice_main_channel_event(SpiceChannel *channel
> G_GNUC_UNUSED
> g_free(password);
> }
>
> -static gboolean
> -virt_viewer_session_spice_has_usb(VirtViewerSession *session)
> -{
> - VirtViewerSessionSpice *self = VIRT_VIEWER_SESSION_SPICE(session);
> - VirtViewerSessionSpicePrivate *priv = self->priv;
> -
> - return spice_usb_device_manager_get(priv->session, NULL) &&
> - spice_session_has_channel_type(priv->session,
> - SPICE_CHANNEL_USBREDIR);
> -}
> -
> static void remove_cb(GtkContainer *container G_GNUC_UNUSED,
> GtkWidget *widget G_GNUC_UNUSED,
> void *user_data)
> @@ -645,6 +633,13 @@ virt_viewer_session_spice_channel_new(SpiceSession *s,
> self->priv->audio = spice_audio_get(s, NULL);
> }
>
> + if (SPICE_IS_USBREDIR_CHANNEL(channel)) {
> + DEBUG_LOG("new usbredir channel");
> + self->priv->usbredir_channel_count++;
> + if (spice_usb_device_manager_get(self->priv->session, NULL))
> + virt_viewer_session_set_has_usbredir(session, TRUE);
> + }
> +
> self->priv->channel_count++;
> }
>
> @@ -729,6 +724,13 @@ virt_viewer_session_spice_channel_destroy(G_GNUC_UNUSED
> SpiceSession *s,
> self->priv->audio = NULL;
> }
>
> + if (SPICE_IS_USBREDIR_CHANNEL(channel)) {
> + DEBUG_LOG("zap usbredir channel");
> + self->priv->usbredir_channel_count--;
> + if (self->priv->usbredir_channel_count == 0)
> + virt_viewer_session_set_has_usbredir(session, FALSE);
> + }
> +
> self->priv->channel_count--;
> if (self->priv->channel_count == 0)
> g_signal_emit_by_name(self, "session-disconnected");
> diff --git a/src/virt-viewer-session.c b/src/virt-viewer-session.c
> index 07e7226..690f691 100644
> --- a/src/virt-viewer-session.c
> +++ b/src/virt-viewer-session.c
> @@ -37,6 +37,7 @@ struct _VirtViewerSessionPrivate
> GList *displays;
> VirtViewerApp *app;
> gboolean auto_usbredir;
> + gboolean has_usbredir;
> gchar *uri;
> VirtViewerFile *file;
> };
> @@ -48,6 +49,7 @@ enum {
>
> PROP_APP,
> PROP_AUTO_USBREDIR,
> + PROP_HAS_USBREDIR,
> PROP_FILE
> };
>
> @@ -82,6 +84,10 @@ virt_viewer_session_set_property(GObject *object,
> virt_viewer_session_set_auto_usbredir(self,
> g_value_get_boolean(value));
> break;
>
> + case PROP_HAS_USBREDIR:
> + self->priv->has_usbredir = g_value_get_boolean(value);
> + break;
> +
> case PROP_APP:
> self->priv->app = g_value_get_object(value);
> break;
> @@ -109,6 +115,10 @@ virt_viewer_session_get_property(GObject *object,
> g_value_set_boolean(value,
> virt_viewer_session_get_auto_usbredir(self));
> break;
>
> + case PROP_HAS_USBREDIR:
> + g_value_set_boolean(value, self->priv->has_usbredir);
> + break;
> +
> case PROP_APP:
> g_value_set_object(value, self->priv->app);
> break;
> @@ -143,6 +153,16 @@ virt_viewer_session_class_init(VirtViewerSessionClass
> *class)
> G_PARAM_STATIC_STRINGS));
>
> g_object_class_install_property(object_class,
> + PROP_HAS_USBREDIR,
> + g_param_spec_boolean("has-usbredir",
> + "has USB
> redirection",
> + "has USB
> redirection",
> + FALSE,
> + G_PARAM_READWRITE |
> + G_PARAM_CONSTRUCT |
> +
> G_PARAM_STATIC_STRINGS));
> +
> + g_object_class_install_property(object_class,
> PROP_APP,
> g_param_spec_object("app",
> "VirtViewerApp",
> @@ -429,17 +449,22 @@ gboolean
> virt_viewer_session_get_auto_usbredir(VirtViewerSession *self)
> return self->priv->auto_usbredir;
> }
>
> -gboolean virt_viewer_session_has_usb(VirtViewerSession *self)
> +void virt_viewer_session_set_has_usbredir(VirtViewerSession *self, gboolean
> has_usbredir)
> {
> - VirtViewerSessionClass *klass;
> + g_return_if_fail(VIRT_VIEWER_IS_SESSION(self));
>
> - g_return_val_if_fail(VIRT_VIEWER_IS_SESSION(self), FALSE);
> + if (self->priv->has_usbredir == has_usbredir)
> + return;
>
> - klass = VIRT_VIEWER_SESSION_GET_CLASS(self);
> - if (klass->has_usb == NULL)
> - return FALSE;
> + self->priv->has_usbredir = has_usbredir;
> + g_object_notify(G_OBJECT(self), "has-usbredir");
> +}
> +
> +gboolean virt_viewer_session_get_has_usbredir(VirtViewerSession *self)
> +{
> + g_return_val_if_fail(VIRT_VIEWER_IS_SESSION(self), FALSE);
>
> - return klass->has_usb(self);
> + return self->priv->has_usbredir;
> }
>
> void virt_viewer_session_usb_device_selection(VirtViewerSession *self,
> diff --git a/src/virt-viewer-session.h b/src/virt-viewer-session.h
> index 5aa748c..0467724 100644
> --- a/src/virt-viewer-session.h
> +++ b/src/virt-viewer-session.h
> @@ -70,7 +70,6 @@ struct _VirtViewerSessionClass {
> gboolean (* open_host) (VirtViewerSession* session, const gchar *host,
> const gchar *port, const gchar *tlsport);
> gboolean (* open_uri) (VirtViewerSession* session, const gchar *uri,
> GError **error);
> gboolean (* channel_open_fd) (VirtViewerSession* session,
> VirtViewerSessionChannel *channel, int fd);
> - gboolean (* has_usb) (VirtViewerSession* session);
> void (* usb_device_selection) (VirtViewerSession* session, GtkWindow
> *parent);
> void (* smartcard_insert) (VirtViewerSession* session);
> void (* smartcard_remove) (VirtViewerSession* session);
> @@ -119,7 +118,9 @@ gboolean virt_viewer_session_open_uri(VirtViewerSession
> *session, const gchar *u
> void virt_viewer_session_set_auto_usbredir(VirtViewerSession* session,
> gboolean auto_usbredir);
> gboolean virt_viewer_session_get_auto_usbredir(VirtViewerSession* session);
>
> -gboolean virt_viewer_session_has_usb(VirtViewerSession *self);
> +void virt_viewer_session_set_has_usbredir(VirtViewerSession* session,
> gboolean has_usbredir);
> +gboolean virt_viewer_session_get_has_usbredir(VirtViewerSession *self);
> +
> void virt_viewer_session_usb_device_selection(VirtViewerSession *self,
> GtkWindow *parent);
> void virt_viewer_session_smartcard_insert(VirtViewerSession *self);
> void virt_viewer_session_smartcard_remove(VirtViewerSession *self);
> --
> 1.8.3.1
>
> _______________________________________________
> virt-tools-list mailing list
> virt-tools-list at redhat.com
> https://www.redhat.com/mailman/listinfo/virt-tools-list
>
More information about the virt-tools-list
mailing list