|
|
e8160e |
From c90ceeab44a7c5db9c35965c3f7c3ec245fab65f Mon Sep 17 00:00:00 2001
|
|
|
e8160e |
From: Victor Toso <me@victortoso.com>
|
|
|
e8160e |
Date: Thu, 6 Sep 2018 15:37:46 +0200
|
|
|
e8160e |
Subject: [PATCH] usb-device-manager: Handle connectionless channel
|
|
|
e8160e |
|
|
|
e8160e |
As we are not able to redirect anything in case that usbredir channel
|
|
|
e8160e |
is not connected.
|
|
|
e8160e |
|
|
|
e8160e |
Related: https://bugzilla.redhat.com/show_bug.cgi?id=1625550
|
|
|
e8160e |
|
|
|
e8160e |
Signed-off-by: Victor Toso <victortoso@gnome.org>
|
|
|
e8160e |
Acked-by: Frediano Ziglio <fziglio@redhat.com>
|
|
|
e8160e |
(cherry picked from commit bd195d3f76f115b5ef5d1ad0e83e9ccea5a04d18)
|
|
|
e8160e |
---
|
|
|
e8160e |
src/usb-device-manager.c | 32 ++++++++++++++++++++++++++++++++
|
|
|
e8160e |
1 file changed, 32 insertions(+)
|
|
|
e8160e |
|
|
|
e8160e |
diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
|
|
|
e8160e |
index 35b1eb7..8ac5fda 100644
|
|
|
e8160e |
--- a/src/usb-device-manager.c
|
|
|
e8160e |
+++ b/src/usb-device-manager.c
|
|
|
e8160e |
@@ -158,6 +158,8 @@ static void channel_new(SpiceSession *session, SpiceChannel *channel,
|
|
|
e8160e |
gpointer user_data);
|
|
|
e8160e |
static void channel_destroy(SpiceSession *session, SpiceChannel *channel,
|
|
|
e8160e |
gpointer user_data);
|
|
|
e8160e |
+static void channel_event(SpiceChannel *channel, SpiceChannelEvent event,
|
|
|
e8160e |
+ gpointer user_data);
|
|
|
e8160e |
#ifdef USE_GUDEV
|
|
|
e8160e |
static void spice_usb_device_manager_uevent_cb(GUdevClient *client,
|
|
|
e8160e |
const gchar *action,
|
|
|
e8160e |
@@ -843,6 +845,8 @@ static void channel_new(SpiceSession *session, SpiceChannel *channel,
|
|
|
e8160e |
spice_channel_connect(channel);
|
|
|
e8160e |
g_ptr_array_add(self->priv->channels, channel);
|
|
|
e8160e |
|
|
|
e8160e |
+ g_signal_connect(channel, "channel-event", G_CALLBACK(channel_event), self);
|
|
|
e8160e |
+
|
|
|
e8160e |
spice_usb_device_manager_check_redir_on_connect(self, channel);
|
|
|
e8160e |
|
|
|
e8160e |
/*
|
|
|
e8160e |
@@ -865,6 +869,34 @@ static void channel_destroy(SpiceSession *session, SpiceChannel *channel,
|
|
|
e8160e |
g_ptr_array_remove(self->priv->channels, channel);
|
|
|
e8160e |
}
|
|
|
e8160e |
|
|
|
e8160e |
+static void channel_event(SpiceChannel *channel, SpiceChannelEvent event,
|
|
|
e8160e |
+ gpointer user_data)
|
|
|
e8160e |
+
|
|
|
e8160e |
+{
|
|
|
e8160e |
+ SpiceUsbDeviceManager *self = user_data;
|
|
|
e8160e |
+
|
|
|
e8160e |
+ switch (event) {
|
|
|
e8160e |
+ case SPICE_CHANNEL_NONE:
|
|
|
e8160e |
+ case SPICE_CHANNEL_OPENED:
|
|
|
e8160e |
+ return;
|
|
|
e8160e |
+
|
|
|
e8160e |
+ case SPICE_CHANNEL_SWITCHING:
|
|
|
e8160e |
+ case SPICE_CHANNEL_CLOSED:
|
|
|
e8160e |
+ case SPICE_CHANNEL_ERROR_CONNECT:
|
|
|
e8160e |
+ case SPICE_CHANNEL_ERROR_TLS:
|
|
|
e8160e |
+ case SPICE_CHANNEL_ERROR_LINK:
|
|
|
e8160e |
+ case SPICE_CHANNEL_ERROR_AUTH:
|
|
|
e8160e |
+ case SPICE_CHANNEL_ERROR_IO:
|
|
|
e8160e |
+ g_signal_handlers_disconnect_by_func(channel, channel_event, user_data);
|
|
|
e8160e |
+ g_ptr_array_remove(self->priv->channels, channel);
|
|
|
e8160e |
+ return;
|
|
|
e8160e |
+ default:
|
|
|
e8160e |
+ g_warning("Unhandled SpiceChannelEvent %d, disconnecting usbredir %p", event, channel);
|
|
|
e8160e |
+ g_signal_handlers_disconnect_by_func(channel, channel_event, user_data);
|
|
|
e8160e |
+ g_ptr_array_remove(self->priv->channels, channel);
|
|
|
e8160e |
+ }
|
|
|
e8160e |
+}
|
|
|
e8160e |
+
|
|
|
e8160e |
static void spice_usb_device_manager_auto_connect_cb(GObject *gobject,
|
|
|
e8160e |
GAsyncResult *res,
|
|
|
e8160e |
gpointer user_data)
|
|
|
e8160e |
--
|
|
|
e8160e |
2.20.1
|
|
|
e8160e |
|