[Spice-devel] [PATCH v3 02/13] Add redirecting state

Kirill Moizik kirill at daynix.com
Mon Aug 3 06:10:42 PDT 2015


From: Kirill Moizik <kmoizik at redhat.com>

Add redirecting property to UsbDeviceManager and redirecting field to GUdevCleint
---
 src/map-file             |  1 +
 src/usb-device-manager.c | 31 +++++++++++++++++++++++++++++--
 src/win-usb-dev.c        | 13 +++++++++++++
 src/win-usb-dev.h        |  1 +
 4 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/src/map-file b/src/map-file
index d5a073f..6d5a5ef 100644
--- a/src/map-file
+++ b/src/map-file
@@ -117,6 +117,7 @@ spice_uri_to_string;
 spice_usb_device_get_description;
 spice_usb_device_get_libusb_device;
 spice_usb_device_get_type;
+spice_g_udev_set_redirecting;
 spice_usb_device_manager_can_redirect_device;
 spice_usb_device_manager_connect_device_async;
 spice_usb_device_manager_connect_device_finish;
diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
index 5b8151f..adf7acc 100644
--- a/src/usb-device-manager.c
+++ b/src/usb-device-manager.c
@@ -93,6 +93,7 @@ enum {
     PROP_AUTO_CONNECT,
     PROP_AUTO_CONNECT_FILTER,
     PROP_REDIRECT_ON_CONNECT,
+    PROP_REDIRECTING,
 };
 
 enum
@@ -130,6 +131,7 @@ struct _SpiceUsbDeviceManagerPrivate {
     SpiceWinUsbDriver     *installer;
 #endif
     gboolean               use_usbclerk;
+    gboolean               redirecting;
 #endif
     GPtrArray *devices;
     GPtrArray *channels;
@@ -421,13 +423,18 @@ static void spice_usb_device_manager_get_property(GObject     *gobject,
     case PROP_REDIRECT_ON_CONNECT:
         g_value_set_string(value, priv->redirect_on_connect);
         break;
+#ifdef USE_USBREDIR
+    case PROP_REDIRECTING:
+        g_value_set_boolean(value, priv->redirecting);
+        break;
+#endif
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
         break;
     }
 }
 
-#ifdef G_OS_WIN32
+#if defined(USE_USBREDIR) && defined(G_OS_WIN32)
 static
 void _usbdk_autoredir_enable(SpiceUsbDeviceManager *manager);
 static
@@ -448,7 +455,7 @@ static void spice_usb_device_manager_set_property(GObject       *gobject,
         break;
     case PROP_AUTO_CONNECT:
         priv->auto_connect = g_value_get_boolean(value);
-#ifdef G_OS_WIN32
+#if defined(USE_USBREDIR) && defined(G_OS_WIN32)
         if (!priv->use_usbclerk) {
             if (priv->auto_connect) {
                 _usbdk_autoredir_enable(self);
@@ -504,6 +511,11 @@ static void spice_usb_device_manager_set_property(GObject       *gobject,
         priv->redirect_on_connect = g_strdup(filter);
         break;
     }
+#ifdef USE_USBREDIR
+    case PROP_REDIRECTING:
+        priv->redirecting = g_value_get_boolean(value);
+        break;
+#endif
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
         break;
@@ -595,6 +607,21 @@ static void spice_usb_device_manager_class_init(SpiceUsbDeviceManagerClass *klas
                                     pspec);
 
     /**
+     * SpiceUsbDeviceManager:redirecting:
+     *
+     * Boolean variable specifying async usb redirection flow
+     *
+     * See #SpiceUsbDeviceManager:auto-connect-filter for the filter string
+     * format.
+     */
+    pspec = g_param_spec_boolean("redirecting", "Redirecting",
+                                 "Usb redirection in progress",
+                                 FALSE,
+                                 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+    g_object_class_install_property(gobject_class, PROP_REDIRECTING,
+                                    pspec);
+
+    /**
      * SpiceUsbDeviceManager::device-added:
      * @manager: the #SpiceUsbDeviceManager that emitted the signal
      * @device: #SpiceUsbDevice boxed object corresponding to the added device
diff --git a/src/win-usb-dev.c b/src/win-usb-dev.c
index 1e4b2d6..875ef89 100644
--- a/src/win-usb-dev.c
+++ b/src/win-usb-dev.c
@@ -37,6 +37,7 @@ struct _GUdevClientPrivate {
     gssize udev_list_size;
     GList *udev_list;
     HWND hwnd;
+    gboolean redirecting;
 };
 
 #define G_UDEV_CLIENT_WINCLASS_NAME  TEXT("G_UDEV_CLIENT")
@@ -186,6 +187,7 @@ g_udev_client_initable_init(GInitable *initable, GCancellable *cancellable,
     self = G_UDEV_CLIENT(initable);
     priv = self->priv;
 
+    priv->redirecting = FALSE;
     rc = libusb_init(&priv->ctx);
     if (rc < 0) {
         const char *errstr = spice_usbutil_libusb_strerror(rc);
@@ -334,6 +336,17 @@ static gboolean gudev_devices_are_equal(GUdevDevice *a, GUdevDevice *b)
     return (same_pid && same_vid);
 }
 
+static void handle_dev_change(GUdevClient *self);
+
+void spice_g_udev_set_redirecting(gboolean val)
+{
+    GUdevClientPrivate *priv = singleton->priv;
+    gboolean redirecting_end;
+    redirecting_end = (priv->redirecting && !val);
+    priv->redirecting = val;
+    if (redirecting_end)
+        handle_dev_change(singleton);
+}
 
 /* Assumes each event stands for a single device change (at most) */
 static void handle_dev_change(GUdevClient *self)
diff --git a/src/win-usb-dev.h b/src/win-usb-dev.h
index b5c4fce..d656e73 100644
--- a/src/win-usb-dev.h
+++ b/src/win-usb-dev.h
@@ -86,6 +86,7 @@ GType g_udev_device_get_type(void) G_GNUC_CONST;
 const gchar *g_udev_device_get_property(GUdevDevice *udev, const gchar *property);
 const gchar *g_udev_device_get_sysfs_attr(GUdevDevice *udev, const gchar *attr);
 
+void   spice_g_udev_set_redirecting(gboolean val);
 GQuark g_udev_client_error_quark(void);
 #define G_UDEV_CLIENT_ERROR g_udev_client_error_quark()
 
-- 
2.4.3



More information about the Spice-devel mailing list