[Spice-devel] [spice-gtk v1] win-usb: remove usbclerk

Pavel Grunt pgrunt at redhat.com
Thu Dec 15 14:20:36 UTC 2016


Hi,

On Fri, 2016-12-09 at 18:22 +0100, Victor Toso wrote:
> From: Victor Toso <me at victortoso.com>
> 
> As we have UsbDk integration now which is well maintained upstream.

yes, it makes a sense

> 
> Signed-off-by: Victor Toso <victortoso at redhat.com>
> ---
>  doc/reference/Makefile.am    |   2 -
>  src/Makefile.am              |   3 -
>  src/usb-device-manager.c     | 304 +++----------------------------
>  src/win-usb-clerk.h          |  36 ----
>  src/win-usb-driver-install.c | 421 --------------------------------
> -----------
>  src/win-usb-driver-install.h | 106 -----------
>  6 files changed, 22 insertions(+), 850 deletions(-)
>  delete mode 100644 src/win-usb-clerk.h
>  delete mode 100644 src/win-usb-driver-install.c
>  delete mode 100644 src/win-usb-driver-install.h
> 
> diff --git a/doc/reference/Makefile.am b/doc/reference/Makefile.am
> index eaaf98c..999c1dc 100644
> --- a/doc/reference/Makefile.am
> +++ b/doc/reference/Makefile.am
> @@ -58,9 +58,7 @@ IGNORE_HFILES=					
> \
>  	usbutil.h				\
>  	vmcstream.h				\
>  	vncdisplaykeymap.h			\
> -	win-usb-clerk.h				\
>  	win-usb-dev.h				\
> -	win-usb-driver-install.h		\
>  	wocky-http-proxy.h			\
>  	$(NULL)
>  
> diff --git a/src/Makefile.am b/src/Makefile.am
> index 78b215f..e43cee0 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -371,9 +371,6 @@ endif
>  WIN_USB_FILES= \
>  	win-usb-dev.h			\
>  	win-usb-dev.c			\
> -	win-usb-clerk.h			\
> -	win-usb-driver-install.h	\
> -	win-usb-driver-install.c	\
>  	usbdk_api.h			\
>  	usbdk_api.c			\
>  	$(NULL)
> diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
> index 6d10daa..0ac3aae 100644
> --- a/src/usb-device-manager.c
> +++ b/src/usb-device-manager.c
> @@ -35,7 +35,6 @@
>  #include <gudev/gudev.h>
>  #elif defined(G_OS_WIN32)
>  #include "win-usb-dev.h"
> -#include "win-usb-driver-install.h"
>  #define USE_GUDEV /* win-usb-dev.h provides a fake gudev interface
> */
>  #elif !defined USE_LIBUSB_HOTPLUG
>  #error "Expecting one of USE_GUDEV or USE_LIBUSB_HOTPLUG to be
> defined"
> @@ -127,9 +126,7 @@ struct _SpiceUsbDeviceManagerPrivate {
>  #ifdef G_OS_WIN32
>      usbdk_api_wrapper     *usbdk_api;
>      HANDLE                 usbdk_hider_handle;
> -    SpiceWinUsbDriver     *installer;
>  #endif
> -    gboolean               use_usbclerk;
>  #endif
>      GPtrArray *devices;
>      GPtrArray *channels;
> @@ -188,9 +185,6 @@ static SpiceUsbDevice
> *spice_usb_device_ref(SpiceUsbDevice *device);
>  static void spice_usb_device_unref(SpiceUsbDevice *device);
>  
>  #ifdef G_OS_WIN32
> -static guint8 spice_usb_device_get_state(SpiceUsbDevice *device);
> -static void  spice_usb_device_set_state(SpiceUsbDevice *device,
> guint8 s);
> -
>  static void _usbdk_hider_update(SpiceUsbDeviceManager *manager);
>  static void _usbdk_hider_clear(SpiceUsbDeviceManager *manager);
>  #endif
> @@ -274,8 +268,11 @@ static void
> spice_usb_device_manager_init(SpiceUsbDeviceManager *self)
>      self->priv = priv;
>  
>  #if defined(G_OS_WIN32) && defined(USE_USBREDIR)
> -    priv->use_usbclerk = !usbdk_is_driver_installed() ||
> -                         !(priv->usbdk_api = usbdk_api_load());
> +    if (usbdk_is_driver_installed()) {
> +        priv->usbdk_api = usbdk_api_load();
> +    } else {
> +        spice_debug("UsbDk driver is not installed");
> +    }
>  #endif
>      priv->channels = g_ptr_array_new();
>  #ifdef USE_USBREDIR
> @@ -298,16 +295,6 @@ static gboolean
> spice_usb_device_manager_initable_init(GInitable  *initable,
>      const gchar *const subsystems[] = {"usb", NULL};
>  #endif
>  
> -#ifdef G_OS_WIN32
> -    if (priv->use_usbclerk) {
> -        priv->installer = spice_win_usb_driver_new(err);
> -        if (!priv->installer) {
> -            SPICE_DEBUG("failed to initialize winusb driver");
> -            return FALSE;
> -        }
> -    }
> -#endif
> -
>      /* Initialize libusb */
>      rc = libusb_init(&priv->context);
>      if (rc < 0) {
> @@ -425,11 +412,7 @@ static void
> spice_usb_device_manager_finalize(GObject *gobject)
>      free(priv->auto_conn_filter_rules);
>      free(priv->redirect_on_connect_rules);
>  #ifdef G_OS_WIN32
> -    if (priv->installer) {
> -        g_warn_if_fail(priv->use_usbclerk);
> -        g_object_unref(priv->installer);
> -    }
> -    if (!priv->use_usbclerk) {
> +    if (priv->usbdk_api != NULL) {

this block can be removed - at the worst case there will be a runtime
warning - which is imho fine (an user wants to use usbredir but usbdk
is not installed)

>          _usbdk_hider_clear(self);
>          usbdk_api_unload(priv->usbdk_api);
>      }
> @@ -505,9 +488,7 @@ static void
> spice_usb_device_manager_set_property(GObject       *gobject,
>      case PROP_AUTO_CONNECT:
>          priv->auto_connect = g_value_get_boolean(value);
>  #if defined(G_OS_WIN32) && defined(USE_USBREDIR)
> -        if (!priv->use_usbclerk) {
> -            _usbdk_hider_update(self);
> -        }
> +        _usbdk_hider_update(self);

like you did here

>  #endif
>          break;
>      case PROP_AUTO_CONNECT_FILTER: {
> @@ -533,9 +514,7 @@ static void
> spice_usb_device_manager_set_property(GObject       *gobject,
>          priv->auto_connect_filter = g_strdup(filter);
>  
>  #if defined(G_OS_WIN32) && defined(USE_USBREDIR)
> -        if (!priv->use_usbclerk) {
> -            _usbdk_hider_update(self);
> -        }
> +        _usbdk_hider_update(self);
and here
>  #endif
>          break;
>      }
> @@ -769,15 +748,10 @@ static gboolean
> spice_usb_device_manager_get_udev_bus_n_address(
>  
>      *bus = *address = 0;
>  
> -    if (manager->priv->use_usbclerk) {
> -       /* Windows WinUsb/UsbClerk -- request vid:pid instead */
> -        bus_str = g_udev_device_get_property(udev, "VID");
> -        address_str = g_udev_device_get_property(udev, "PID");
> -    } else {
> -       /* Linux or UsbDk backend on Windows*/
> -        bus_str = g_udev_device_get_property(udev, "BUSNUM");
> -        address_str = g_udev_device_get_property(udev, "DEVNUM");
> -    }
> +   /* Linux or UsbDk backend on Windows*/
> +    bus_str = g_udev_device_get_property(udev, "BUSNUM");
> +    address_str = g_udev_device_get_property(udev, "DEVNUM");
> +
>      if (bus_str)
>          *bus = atoi(bus_str);
>      if (address_str)
> @@ -920,13 +894,8 @@ static gboolean
>  spice_usb_device_manager_device_match(SpiceUsbDeviceManager *self,
> SpiceUsbDevice *device,
>                                        const int bus, const int
> address)
>  {
> -   if (self->priv->use_usbclerk) {
> -        return (spice_usb_device_get_vid(device) == bus &&
> -                spice_usb_device_get_pid(device) == address);
> -    } else {
> -        return (spice_usb_device_get_busnum(device) == bus &&
> -                spice_usb_device_get_devaddr(device) == address);
> -    }
> +    return (spice_usb_device_get_busnum(device) == bus &&
> +            spice_usb_device_get_devaddr(device) == address);
>  }
>  
>  #ifdef USE_GUDEV
> @@ -934,19 +903,9 @@ static gboolean
>  spice_usb_device_manager_libdev_match(SpiceUsbDeviceManager *self,
> libusb_device *libdev,
>                                        const int bus, const int
> address)
>  {
> -    if (self->priv->use_usbclerk) {
> -        /* WinUSB -- match functions for Windows -- match by
> vid:pid */
> -        int vid, pid;
> -
> -        if (!spice_usb_device_manager_get_libdev_vid_pid(libdev,
> &vid, &pid)) {
> -            return FALSE;
> -        }
> -        return (bus == vid && address == pid);
> -    } else {
> -        /* match functions for Linux/UsbDk -- match by bus.addr */
> -        return (libusb_get_bus_number(libdev) == bus &&
> -                libusb_get_device_address(libdev) == address);
> -    }
> +    /* match functions for Linux/UsbDk -- match by bus.addr */
> +    return (libusb_get_bus_number(libdev) == bus &&
> +            libusb_get_device_address(libdev) == address);
>  }
>  #endif
>  
> @@ -1026,18 +985,6 @@ static void
> spice_usb_device_manager_remove_dev(SpiceUsbDeviceManager *self,
>          return;
>      }
>  
> -#ifdef G_OS_WIN32
> -    if (priv->use_usbclerk) {
> -        const guint8 state = spice_usb_device_get_state(device);
> -        if ((state == SPICE_USB_DEVICE_STATE_INSTALLING) ||
> -            (state == SPICE_USB_DEVICE_STATE_UNINSTALLING)) {
> -            SPICE_DEBUG("skipping " DEV_ID_FMT ". It is
> un/installing its driver",
> -                        bus, address);
> -            return;
> -        }
> -    }
> -#endif
> -
>      spice_usb_device_manager_disconnect_device(self, device);
>  
>      SPICE_DEBUG("device removed %04x:%04x (%p)",
> @@ -1186,106 +1133,6 @@ static void
> spice_usb_device_manager_channel_connect_cb(
>      g_object_unref(task);
>  }
>  
> -#ifdef G_OS_WIN32
> -
> -typedef struct _UsbInstallCbInfo {
> -    SpiceUsbDeviceManager *manager;
> -    SpiceUsbDevice        *device;
> -    SpiceWinUsbDriver     *installer;
> -    GCancellable          *cancellable;
> -    GAsyncReadyCallback   callback;
> -    gpointer              user_data;
> -} UsbInstallCbInfo;
> -
> -/**
> - * spice_usb_device_manager_drv_install_cb:
> - * @gobject: #SpiceWinUsbDriver in charge of installing the driver
> - * @res: #GAsyncResult of async win usb driver installation
> - * @user_data: #SpiceUsbDeviceManager requested the installation
> - *
> - * Called when an Windows libusb driver installation completed.
> - *
> - * If the driver installation was successful, continue with USB
> - * device redirection
> - *
> - * Always call _spice_usb_device_manager_connect_device_async.
> - * When installation fails, libusb_open fails too, but cleanup
> would be better.
> - */
> -static void spice_usb_device_manager_drv_install_cb(GObject
> *gobject,
> -                                                    GAsyncResult
> *res,
> -                                                    gpointer
> user_data)
> -{
> -    SpiceUsbDeviceManager *self;
> -    SpiceWinUsbDriver *installer;
> -    GError *err = NULL;
> -    SpiceUsbDevice *device;
> -    UsbInstallCbInfo *cbinfo;
> -    GCancellable *cancellable;
> -    gpointer data;
> -
> -    g_return_if_fail(user_data != NULL);
> -
> -    cbinfo = user_data;
> -    self        = cbinfo->manager;
> -    device      = cbinfo->device;
> -    installer   = cbinfo->installer;
> -    cancellable = cbinfo->cancellable;
> -    data        = cbinfo->user_data;
> -
> -    g_free(cbinfo);
> -
> -    g_return_if_fail(SPICE_IS_USB_DEVICE_MANAGER(self));
> -    g_return_if_fail(self->priv->use_usbclerk);
> -    g_return_if_fail(SPICE_IS_WIN_USB_DRIVER(installer));
> -    g_return_if_fail(device!= NULL);
> -
> -    SPICE_DEBUG("Win USB driver install finished");
> -
> -    if (!spice_win_usb_driver_install_finish(installer, res, &err))
> {
> -        g_warning("win usb driver install failed -- %s", err-
> >message);
> -        g_error_free(err);
> -    }
> -
> -    spice_usb_device_set_state(device,
> SPICE_USB_DEVICE_STATE_INSTALLED);
> -
> -    /* device is already ref'ed */
> -    _spice_usb_device_manager_connect_device_async(self,
> -                                                   device,
> -                                                   cancellable,
> -                                                   _connect_device_
> async_cb,
> -                                                   data);
> -
> -    spice_usb_device_unref(device);
> -}
> -
> -static void spice_usb_device_manager_drv_uninstall_cb(GObject
> *gobject,
> -                                                      GAsyncResult
> *res,
> -                                                      gpointer
> user_data)
> -{
> -    GError *err = NULL;
> -
> -    UsbInstallCbInfo *cbinfo = user_data;
> -    SpiceUsbDeviceManager *self = cbinfo->manager;
> -    SpiceUsbDevice *device = cbinfo->device;
> -    SpiceWinUsbDriver *installer = cbinfo->installer;
> -
> -    g_free(cbinfo);
> -
> -    SPICE_DEBUG("Win USB driver uninstall finished");
> -    g_return_if_fail(SPICE_IS_USB_DEVICE_MANAGER(self));
> -    g_return_if_fail(self->priv->use_usbclerk);
> -
> -    if (!spice_win_usb_driver_uninstall_finish(installer, res,
> &err)) {
> -        g_warning("win usb driver uninstall failed -- %s", err-
> >message);
> -        g_clear_error(&err);
> -    }
> -
> -    spice_usb_device_set_state(device,
> SPICE_USB_DEVICE_STATE_NONE);
> -    spice_usb_device_unref(device);
> -}
> -
> -#endif
> -
>  /* ----------------------------------------------------------------
> -- */
>  /* private
> api                                                        */
>  
> @@ -1518,68 +1365,6 @@ gboolean
> spice_usb_device_manager_is_device_connected(SpiceUsbDeviceManager
> *sel
>      return !!spice_usb_device_manager_get_channel_for_dev(self,
> device);
>  }
>  
> -#if defined(USE_USBREDIR) && defined(G_OS_WIN32)
> -
> -static void
> -_spice_usb_device_manager_install_driver_async(SpiceUsbDeviceManage
> r *self,
> -                                               SpiceUsbDevice
> *device,
> -                                               GCancellable
> *cancellable,
> -                                               GAsyncReadyCallback
> callback,
> -                                               gpointer user_data)
> -{
> -    SpiceWinUsbDriver *installer;
> -    UsbInstallCbInfo *cbinfo;
> -
> -    g_return_if_fail(self->priv->installer);
> -
> -    spice_usb_device_set_state(device,
> SPICE_USB_DEVICE_STATE_INSTALLING);
> -
> -    installer = self->priv->installer;
> -    cbinfo = g_new0(UsbInstallCbInfo, 1);
> -    cbinfo->manager     = self;
> -    cbinfo->device      = spice_usb_device_ref(device);
> -    cbinfo->installer   = installer;
> -    cbinfo->cancellable = cancellable;
> -    cbinfo->callback    = callback;
> -    cbinfo->user_data   = user_data;
> -
> -    spice_win_usb_driver_install_async(installer, device,
> cancellable,
> -                                       spice_usb_device_manager_drv
> _install_cb,
> -                                       cbinfo);
> -}
> -
> -static void
> -_spice_usb_device_manager_uninstall_driver_async(SpiceUsbDeviceMana
> ger *self,
> -                                                 SpiceUsbDevice
> *device)
> -{
> -    SpiceWinUsbDriver *installer;
> -    UsbInstallCbInfo *cbinfo;
> -    guint8 state;
> -
> -    g_warn_if_fail(device != NULL);
> -    g_return_if_fail(self->priv->installer);
> -
> -    state = spice_usb_device_get_state(device);
> -    if ((state != SPICE_USB_DEVICE_STATE_INSTALLED) &&
> -        (state != SPICE_USB_DEVICE_STATE_CONNECTED)) {
> -        return;
> -    }
> -
> -    spice_usb_device_set_state(device,
> SPICE_USB_DEVICE_STATE_UNINSTALLING);
> -
> -    installer = self->priv->installer;
> -    cbinfo = g_new0(UsbInstallCbInfo, 1);
> -    cbinfo->manager     = self;
> -    cbinfo->device      = spice_usb_device_ref(device);
> -    cbinfo->installer   = installer;
> -
> -    spice_win_usb_driver_uninstall_async(installer, device, NULL,
> -                                         spice_usb_device_manager_d
> rv_uninstall_cb,
> -                                         cbinfo);
> -}
> -
> -#endif
> -
>  #ifdef USE_USBREDIR
>  
>  static gboolean
> @@ -1691,21 +1476,11 @@ void
> spice_usb_device_manager_connect_device_async(SpiceUsbDeviceManager
> *self,
>          g_task_new(G_OBJECT(self), cancellable, callback,
> user_data);
>  
>      _set_redirecting(self, TRUE);
> -
> -#ifdef G_OS_WIN32
> -    if (self->priv->use_usbclerk) {
> -        _spice_usb_device_manager_install_driver_async(self,
> device, cancellable,
> -                                                       callback,
> task);
> -        return;
> -    }
> -#endif
> -
>      _spice_usb_device_manager_connect_device_async(self,
>                                                     device,
>                                                     cancellable,
>                                                     _connect_device_
> async_cb,
>                                                     task);
> -
>  #endif
>  }
>  
> @@ -1791,11 +1566,6 @@ void
> spice_usb_device_manager_disconnect_device(SpiceUsbDeviceManager
> *self,
>      if (channel)
>          spice_usbredir_channel_disconnect_device(channel);
>  
> -#ifdef G_OS_WIN32
> -    if(self->priv->use_usbclerk)
> -        _spice_usb_device_manager_uninstall_driver_async(self,
> device);
> -#endif
> -
>  #endif
>  }
>  
> @@ -1817,12 +1587,6 @@ void _disconnect_device_async_cb(GObject
> *gobject,
>      disconnect_cb_data *data = g_task_get_task_data(task);
>      SpiceUsbDeviceManager *self = SPICE_USB_DEVICE_MANAGER(data-
> >self);
>  
> -#ifdef G_OS_WIN32
> -    if (self->priv->use_usbclerk) {
> -        _spice_usb_device_manager_uninstall_driver_async(self,
> data->device);
> -    }
> -#endif
> -
>      _set_redirecting(self, FALSE);
>  
>      spice_usbredir_channel_disconnect_device_finish(channel,
> channel_res, &err);
> @@ -2128,30 +1892,12 @@ gboolean
> spice_usb_device_is_isochronous(const SpiceUsbDevice *device)
>  }
>  
>  #ifdef G_OS_WIN32
> -void spice_usb_device_set_state(SpiceUsbDevice *device, guint8
> state)
> -{
> -    SpiceUsbDeviceInfo *info = (SpiceUsbDeviceInfo *)device;
> -
> -    g_return_if_fail(info != NULL);
> -
> -    info->state = state;
> -}
> -
> -guint8 spice_usb_device_get_state(SpiceUsbDevice *device)
> -{
> -    SpiceUsbDeviceInfo *info = (SpiceUsbDeviceInfo *)device;
> -
> -    g_return_val_if_fail(info != NULL, 0);
> -
> -    return info->state;
> -}
> -
>  static
>  gboolean _usbdk_hider_prepare(SpiceUsbDeviceManager *manager)
>  {
>      SpiceUsbDeviceManagerPrivate *priv = manager->priv;
>  
> -    g_return_val_if_fail(!priv->use_usbclerk, FALSE);
> +    g_return_val_if_fail(priv->usbdk_api != NULL, FALSE);
>  
>      if (priv->usbdk_hider_handle == NULL) {
>          priv->usbdk_hider_handle = usbdk_create_hider_handle(priv-
> >usbdk_api);
> @@ -2169,7 +1915,7 @@ void _usbdk_hider_clear(SpiceUsbDeviceManager
> *manager)
>  {
>      SpiceUsbDeviceManagerPrivate *priv = manager->priv;
>  
> -    g_return_if_fail(!priv->use_usbclerk);
> +    g_return_if_fail(priv->usbdk_api != NULL);
>  
>      if (priv->usbdk_hider_handle != NULL) {
>          usbdk_clear_hide_rules(priv->usbdk_api, priv-
> >usbdk_hider_handle);
> @@ -2183,7 +1929,7 @@ void _usbdk_hider_update(SpiceUsbDeviceManager
> *manager)
>  {
>      SpiceUsbDeviceManagerPrivate *priv = manager->priv;
>  
> -    g_return_if_fail(!priv->use_usbclerk);
> +    g_return_if_fail(priv->usbdk_api != NULL);
>  
>      if (priv->auto_connect_filter == NULL) {
>          SPICE_DEBUG("No autoredirect rules, no hider setup
> needed");
> @@ -2256,14 +2002,8 @@
> spice_usb_manager_device_equal_libdev(SpiceUsbDeviceManager
> *manager,
>      if ((device == NULL) || (libdev == NULL))
>          return FALSE;
>  
> -    if (manager->priv->use_usbclerk) {
> -        busnum = spice_usb_device_get_vid(device);
> -        devaddr = spice_usb_device_get_pid(device);
> -    } else {
> -        busnum = spice_usb_device_get_busnum(device);
> -        devaddr = spice_usb_device_get_devaddr(device);
> -    }
> -
> +    busnum = spice_usb_device_get_busnum(device);
> +    devaddr = spice_usb_device_get_devaddr(device);
>      return spice_usb_device_manager_libdev_match(manager, libdev,
>                                                   busnum, devaddr);
>  }
> diff --git a/src/win-usb-clerk.h b/src/win-usb-clerk.h
> deleted file mode 100644
> index a17980d..0000000
> --- a/src/win-usb-clerk.h
> +++ /dev/null
> @@ -1,36 +0,0 @@
> -#ifndef _H_USBCLERK
> -#define _H_USBCLERK
> -
> -#include <windows.h>
> -
> -#define USB_CLERK_PIPE_NAME     TEXT("\\\\.\\pipe\\usbclerkpipe")
> -#define USB_CLERK_MAGIC         0xDADAu
> -#define USB_CLERK_VERSION       0x0003u
> -
> -typedef struct USBClerkHeader {
> -    UINT16 magic;
> -    UINT16 version;
> -    UINT16 type;
> -    UINT16 size;
> -} USBClerkHeader;
> -
> -enum {
> -    USB_CLERK_DRIVER_INSTALL = 1,
> -    USB_CLERK_DRIVER_REMOVE,
> -    USB_CLERK_REPLY,
> -    USB_CLERK_DRIVER_SESSION_INSTALL,
> -    USB_CLERK_END_MESSAGE,
> -};
> -
> -typedef struct USBClerkDriverOp {
> -    USBClerkHeader hdr;
> -    UINT16 vid;
> -    UINT16 pid;
> -} USBClerkDriverOp;
> -
> -typedef struct USBClerkReply {
> -    USBClerkHeader hdr;
> -    UINT32 status;
> -} USBClerkReply;
> -
> -#endif
> diff --git a/src/win-usb-driver-install.c b/src/win-usb-driver-
> install.c
> deleted file mode 100644
> index a72fcb8..0000000
> --- a/src/win-usb-driver-install.c
> +++ /dev/null
> @@ -1,421 +0,0 @@
> -/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> -/*
> -   Copyright (C) 2011 Red Hat, Inc.
> -
> -   Red Hat Authors:
> -   Uri Lublin <uril at redhat.com>
> -
> -   This library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later
> version.
> -
> -   This library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with this library; if not, see <http://www.gnu.org
> /licenses/>.
> -*/
> -
> -/*
> - * Some notes:
> - * Each installer (instance) opens a named-pipe to talk with win-
> usb-clerk.
> - * Each installer (instance) requests driver installation for a
> single device.
> - */
> -
> -#include "config.h"
> -
> -#include <windows.h>
> -#include <gio/gio.h>
> -#include <gio/gwin32inputstream.h>
> -#include <gio/gwin32outputstream.h>
> -#include "spice-util.h"
> -#include "win-usb-clerk.h"
> -#include "win-usb-driver-install.h"
> -#include "usb-device-manager-priv.h"
> -
> -/* ----------------------------------------------------------------
> -- */
> -/* gobject
> glue                                                       */
> -
> -#define SPICE_WIN_USB_DRIVER_GET_PRIVATE(obj)     \
> -    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), SPICE_TYPE_WIN_USB_DRIVER,
> SpiceWinUsbDriverPrivate))
> -
> -struct _SpiceWinUsbDriverPrivate {
> -    USBClerkReply         reply;
> -    GTask                 *task;
> -    HANDLE                handle;
> -    SpiceUsbDevice        *device;
> -};
> -
> -
> -static void spice_win_usb_driver_initable_iface_init(GInitableIface
> *iface);
> -
> -G_DEFINE_TYPE_WITH_CODE(SpiceWinUsbDriver, spice_win_usb_driver,
> G_TYPE_OBJECT,
> -    G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
> spice_win_usb_driver_initable_iface_init));
> -
> -static void spice_win_usb_driver_init(SpiceWinUsbDriver *self)
> -{
> -    self->priv = SPICE_WIN_USB_DRIVER_GET_PRIVATE(self);
> -}
> -
> -static gboolean
> spice_win_usb_driver_initable_init(GInitable     *initable,
> -                                                   GCancellable  *c
> ancellable,
> -                                                   GError        **
> err)
> -{
> -    SpiceWinUsbDriver *self = SPICE_WIN_USB_DRIVER(initable);
> -    SpiceWinUsbDriverPrivate *priv = self->priv;
> -
> -    SPICE_DEBUG("win-usb-driver-install: connecting to usbclerk
> named pipe");
> -    priv->handle = CreateFile(USB_CLERK_PIPE_NAME,
> -                              GENERIC_READ | GENERIC_WRITE,
> -                              0, NULL,
> -                              OPEN_EXISTING,
> -                              FILE_ATTRIBUTE_NORMAL |
> FILE_FLAG_OVERLAPPED,
> -                              NULL);
> -    if (priv->handle == INVALID_HANDLE_VALUE) {
> -        DWORD errval  = GetLastError();
> -        gchar *errstr = g_win32_error_message(errval);
> -        g_set_error(err, SPICE_CLIENT_ERROR,
> SPICE_CLIENT_ERROR_USB_SERVICE,
> -                    "Failed to create service named pipe (%lu) %s",
> errval, errstr);
> -        g_free(errstr);
> -        return FALSE;
> -    }
> -
> -    return TRUE;
> -}
> -
> -static void spice_win_usb_driver_finalize(GObject *gobject)
> -{
> -    SpiceWinUsbDriver *self = SPICE_WIN_USB_DRIVER(gobject);
> -    SpiceWinUsbDriverPrivate *priv = self->priv;
> -
> -    if (priv->handle)
> -        CloseHandle(priv->handle);
> -
> -    g_clear_object(&priv->task);
> -
> -    if (G_OBJECT_CLASS(spice_win_usb_driver_parent_class)-
> >finalize)
> -        G_OBJECT_CLASS(spice_win_usb_driver_parent_class)-
> >finalize(gobject);
> -}
> -
> -static void spice_win_usb_driver_class_init(SpiceWinUsbDriverClass
> *klass)
> -{
> -    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
> -
> -    gobject_class->finalize     = spice_win_usb_driver_finalize;
> -
> -    g_type_class_add_private(klass,
> sizeof(SpiceWinUsbDriverPrivate));
> -}
> -
> -static void spice_win_usb_driver_initable_iface_init(GInitableIface
> *iface)
> -{
> -    iface->init = spice_win_usb_driver_initable_init;
> -}
> -
> -/* ----------------------------------------------------------------
> -- */
> -/*
> callbacks                                                          *
> /
> -
> -static
> -void win_usb_driver_handle_reply_cb(GObject *gobject,
> -                                    GAsyncResult *read_res,
> -                                    gpointer user_data)
> -{
> -    SpiceWinUsbDriver *self;
> -    SpiceWinUsbDriverPrivate *priv;
> -
> -    GInputStream *istream;
> -    GError *err = NULL;
> -    gssize bytes;
> -
> -    g_return_if_fail(SPICE_IS_WIN_USB_DRIVER(user_data));
> -    self = SPICE_WIN_USB_DRIVER(user_data);
> -    priv = self->priv;
> -    istream = G_INPUT_STREAM(gobject);
> -
> -    bytes = g_input_stream_read_finish(istream, read_res, &err);
> -
> -    SPICE_DEBUG("Finished reading reply-msg from usbclerk:
> bytes=%ld "
> -                "err_exist?=%d", (long)bytes, err!=NULL);
> -
> -    g_warn_if_fail(g_input_stream_close(istream, NULL, NULL));
> -    g_clear_object(&istream);
> -
> -    if (err) {
> -        g_warning("failed to read reply from usbclerk (%s)", err-
> >message);
> -        g_task_return_error(priv->task, err);
> -        goto failed_reply;
> -    }
> -
> -    if (bytes == 0) {
> -        g_warning("unexpected EOF from usbclerk");
> -        g_task_return_new_error(priv->task,
> -                                SPICE_WIN_USB_DRIVER_ERROR,
> -                                SPICE_WIN_USB_DRIVER_ERROR_FAILED,
> -                                "unexpected EOF from usbclerk");
> -        goto failed_reply;
> -    }
> -
> -    if (bytes != sizeof(priv->reply)) {
> -        g_warning("usbclerk size mismatch: read %"G_GSSIZE_FORMAT"
> bytes,expected "
> -                  "%"G_GSSIZE_FORMAT" (header %"G_GSSIZE_FORMAT",
> size in header %d)",
> -                  bytes, sizeof(priv->reply), sizeof(priv-
> >reply.hdr), priv->reply.hdr.size);
> -        /* For now just warn, do not fail */
> -    }
> -
> -    if (priv->reply.hdr.magic != USB_CLERK_MAGIC) {
> -        g_warning("usbclerk magic mismatch:
> mine=0x%04x  server=0x%04x",
> -                  USB_CLERK_MAGIC, priv->reply.hdr.magic);
> -        g_task_return_new_error(priv->task,
> -                                SPICE_WIN_USB_DRIVER_ERROR,
> -                                SPICE_WIN_USB_DRIVER_ERROR_MESSAGE,
> -                                "usbclerk magic mismatch");
> -        goto failed_reply;
> -    }
> -
> -    if (priv->reply.hdr.version != USB_CLERK_VERSION) {
> -        g_warning("usbclerk version mismatch:
> mine=0x%04x  server=0x%04x",
> -                  USB_CLERK_VERSION, priv->reply.hdr.version);
> -        g_task_return_new_error(priv->task,
> -                                SPICE_WIN_USB_DRIVER_ERROR,
> -                                SPICE_WIN_USB_DRIVER_ERROR_MESSAGE,
> -                                "usbclerk version mismatch");
> -    }
> -
> -    if (priv->reply.hdr.type != USB_CLERK_REPLY) {
> -        g_warning("usbclerk message with unexpected type %d",
> -                  priv->reply.hdr.type);
> -        g_task_return_new_error(priv->task,
> -                                SPICE_WIN_USB_DRIVER_ERROR,
> -                                SPICE_WIN_USB_DRIVER_ERROR_MESSAGE,
> -                                "usbclerk message with unexpected
> type");
> -        goto failed_reply;
> -    }
> -
> -    if (priv->reply.hdr.size != bytes) {
> -        g_warning("usbclerk message size mismatch: read
> %"G_GSSIZE_FORMAT" bytes  hdr.size=%d",
> -                  bytes, priv->reply.hdr.size);
> -        g_task_return_new_error(priv->task,
> -                                SPICE_WIN_USB_DRIVER_ERROR,
> -                                SPICE_WIN_USB_DRIVER_ERROR_MESSAGE,
> -                                "usbclerk message with unexpected
> size");
> -        goto failed_reply;
> -    }
> -
> -    if (priv->reply.status == 0) {
> -        g_task_return_new_error(priv->task,
> -                                SPICE_WIN_USB_DRIVER_ERROR,
> -                                SPICE_WIN_USB_DRIVER_ERROR_MESSAGE,
> -                                "usbclerk error reply");
> -        goto failed_reply;
> -    }
> -
> -    g_task_return_boolean (priv->task, TRUE);
> -
> - failed_reply:
> -    g_clear_object(&priv->task);
> -}
> -
> -/* ----------------------------------------------------------------
> -- */
> -/* helper
> functions                                                   */
> -
> -static
> -gboolean spice_win_usb_driver_send_request(SpiceWinUsbDriver *self,
> guint16 op,
> -                                           guint16 vid, guint16
> pid, GError **err)
> -{
> -    USBClerkDriverOp req;
> -    GOutputStream *ostream;
> -    SpiceWinUsbDriverPrivate *priv;
> -    gsize bytes;
> -    gboolean ret;
> -
> -    SPICE_DEBUG("sending a request to usbclerk service (op=%d
> vid=0x%04x pid=0x%04x",
> -                op, vid, pid);
> -
> -    g_return_val_if_fail(SPICE_IS_WIN_USB_DRIVER(self), FALSE);
> -    priv = self->priv;
> -
> -    memset(&req, 0, sizeof(req));
> -    req.hdr.magic   = USB_CLERK_MAGIC;
> -    req.hdr.version = USB_CLERK_VERSION;
> -    req.hdr.type    = op;
> -    req.hdr.size    = sizeof(req);
> -    req.vid = vid;
> -    req.pid = pid;
> -
> -    ostream = g_win32_output_stream_new(priv->handle, FALSE);
> -
> -    ret = g_output_stream_write_all(ostream, &req, sizeof(req),
> &bytes, NULL, err);
> -    g_warn_if_fail(g_output_stream_close(ostream, NULL, NULL));
> -    g_object_unref(ostream);
> -    SPICE_DEBUG("write_all request returned %d written bytes
> %"G_GSIZE_FORMAT
> -                " expecting %"G_GSIZE_FORMAT,
> -                ret, bytes, sizeof(req));
> -    return ret;
> -}
> -
> -static
> -void spice_win_usb_driver_read_reply_async(SpiceWinUsbDriver *self)
> -{
> -    SpiceWinUsbDriverPrivate *priv;
> -    GInputStream  *istream;
> -
> -    g_return_if_fail(SPICE_IS_WIN_USB_DRIVER(self));
> -    priv = self->priv;
> -
> -    SPICE_DEBUG("waiting for a reply from usbclerk");
> -
> -    istream = g_win32_input_stream_new(priv->handle, FALSE);
> -
> -    g_input_stream_read_async(istream, &priv->reply, sizeof(priv-
> >reply),
> -                              G_PRIORITY_DEFAULT,
> -                              g_task_get_cancellable(priv->task),
> -                              win_usb_driver_handle_reply_cb,
> self);
> -}
> -
> -
> -/* ----------------------------------------------------------------
> -- */
> -/* private
> api                                                        */
> -
> -
> -G_GNUC_INTERNAL
> -SpiceWinUsbDriver *spice_win_usb_driver_new(GError **err)
> -{
> -    GObject *self;
> -
> -    g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
> -
> -    self = g_initable_new(SPICE_TYPE_WIN_USB_DRIVER, NULL, err,
> NULL);
> -
> -    return SPICE_WIN_USB_DRIVER(self);
> -}
> -
> -static
> -void spice_win_usb_driver_op(SpiceWinUsbDriver *self,
> -                             SpiceUsbDevice *device,
> -                             guint16 op_type,
> -                             GCancellable *cancellable,
> -                             GAsyncReadyCallback callback,
> -                             gpointer user_data)
> -{
> -    guint16 vid, pid;
> -    GError *err = NULL;
> -    GTask *task;
> -    SpiceWinUsbDriverPrivate *priv;
> -
> -    g_return_if_fail(SPICE_IS_WIN_USB_DRIVER(self));
> -    g_return_if_fail(device != NULL);
> -
> -    priv = self->priv;
> -
> -    task = g_task_new(self, cancellable, callback, user_data);
> -
> -    if (priv->task) { /* allow one install/uninstall request at a
> time */
> -        g_warning("Another request exists -- try later");
> -        g_task_return_new_error(task,
> -                  SPICE_WIN_USB_DRIVER_ERROR,
> SPICE_WIN_USB_DRIVER_ERROR_FAILED,
> -                  "Another request exists -- try later");
> -        goto failed_request;
> -    }
> -
> -
> -    vid = spice_usb_device_get_vid(device);
> -    pid = spice_usb_device_get_pid(device);
> -
> -    if (!spice_win_usb_driver_send_request(self, op_type,
> -                                           vid, pid, &err)) {
> -        g_warning("failed to send a request to usbclerk %s", err-
> >message);
> -        g_task_return_error(task, err);
> -        goto failed_request;
> -    }
> -
> -    /* set up for async read */
> -    priv->task = task;
> -    priv->device = device;
> -
> -    spice_win_usb_driver_read_reply_async(self);
> -
> -    return;
> -
> - failed_request:
> -    g_clear_object(&task);
> -}
> -
> -/*
> - * Returns: currently returns 0 (failure) and 1 (success)
> - * possibly later we'll add error-codes
> - */
> -static gboolean
> -spice_win_usb_driver_op_finish(SpiceWinUsbDriver *self,
> -                               GAsyncResult *res, GError **err)
> -{
> -    GTask *task = G_TASK(res);
> -
> -    g_return_val_if_fail(SPICE_IS_WIN_USB_DRIVER(self), 0);
> -    g_return_val_if_fail(g_task_is_valid(task, self), FALSE);
> -
> -    return g_task_propagate_boolean(task, err);
> -}
> -
> -/**
> - * spice_win_usb_driver_install_async:
> - * Start libusb driver installation for @device
> - *
> - * A new NamedPipe is created for each request.
> - *
> - * Returns: TRUE if a request was sent to usbclerk
> - *          FALSE upon failure to send a request.
> - */
> -G_GNUC_INTERNAL
> -void spice_win_usb_driver_install_async(SpiceWinUsbDriver *self,
> -                                        SpiceUsbDevice *device,
> -                                        GCancellable *cancellable,
> -                                        GAsyncReadyCallback
> callback,
> -                                        gpointer user_data)
> -{
> -    SPICE_DEBUG("Win usb driver installation started");
> -
> -    spice_win_usb_driver_op(self, device,
> USB_CLERK_DRIVER_SESSION_INSTALL,
> -                            cancellable, callback, user_data);
> -}
> -
> -G_GNUC_INTERNAL
> -void spice_win_usb_driver_uninstall_async(SpiceWinUsbDriver *self,
> -                                          SpiceUsbDevice *device,
> -                                          GCancellable
> *cancellable,
> -                                          GAsyncReadyCallback
> callback,
> -                                          gpointer user_data)
> -{
> -    SPICE_DEBUG("Win usb driver uninstall operation started");
> -
> -    spice_win_usb_driver_op(self, device, USB_CLERK_DRIVER_REMOVE,
> cancellable,
> -                            callback, user_data);
> -}
> -
> -G_GNUC_INTERNAL
> -gboolean spice_win_usb_driver_install_finish(SpiceWinUsbDriver
> *self,
> -                                          GAsyncResult *res, GError
> **err)
> -{
> -    return spice_win_usb_driver_op_finish(self, res, err);
> -}
> -
> -G_GNUC_INTERNAL
> -gboolean spice_win_usb_driver_uninstall_finish(SpiceWinUsbDriver
> *self,
> -                                           GAsyncResult *res,
> GError **err)
> -{
> -    return spice_win_usb_driver_op_finish(self, res, err);
> -}
> -
> -G_GNUC_INTERNAL
> -SpiceUsbDevice *spice_win_usb_driver_get_device(SpiceWinUsbDriver
> *self)
> -{
> -    g_return_val_if_fail(SPICE_IS_WIN_USB_DRIVER(self), 0);
> -
> -    return self->priv->device;
> -}
> -
> -GQuark spice_win_usb_driver_error_quark(void)
> -{
> -    return g_quark_from_static_string("spice-win-usb-driver-error-
> quark");
> -}
> diff --git a/src/win-usb-driver-install.h b/src/win-usb-driver-
> install.h
> deleted file mode 100644
> index f9afedc..0000000
> --- a/src/win-usb-driver-install.h
> +++ /dev/null
> @@ -1,106 +0,0 @@
> -/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> -/*
> -   Copyright (C) 2011 Red Hat, Inc.
> -
> -   Red Hat Authors:
> -   Uri Lublin <uril at redhat.com>
> -
> -   This library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later
> version.
> -
> -   This library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with this library; if not, see <http://www.gnu.org
> /licenses/>.
> -*/
> -
> -#ifndef SPICE_WIN_USB_DRIVER_H
> -#define SPICE_WIN_USB_DRIVER_H
> -
> -#include "usb-device-manager.h"
> -
> -G_BEGIN_DECLS
> -
> -GQuark win_usb_driver_error_quark(void);
> -
> -
> -#define
> SPICE_TYPE_WIN_USB_DRIVER      (spice_win_usb_driver_get_type ())
> -#define SPICE_WIN_USB_DRIVER(obj)      (G_TYPE_CHECK_INSTANCE_CAST
> ((obj),    \
> -            SPICE_TYPE_WIN_USB_DRIVER, SpiceWinUsbDriver))
> -#define SPICE_IS_WIN_USB_DRIVER(obj)   (G_TYPE_CHECK_INSTANCE_TYPE
> ((obj),    \
> -            SPICE_TYPE_WIN_USB_DRIVER))
> -#define SPICE_WIN_USB_DRIVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST
> ((klass),  \
> -            SPICE_TYPE_WIN_USB_DRIVER, SpiceWinUsbDriverClass))
> -#define SPICE_IS_WIN_USB_DRIVER_CLASS(klass)
> (G_TYPE_CHECK_CLASS_TYPE ((klass),\
> -            SPICE_TYPE_WIN_USB_DRIVER))
> -#define SPICE_WIN_USB_DRIVER_GET_CLASS(obj)
> (G_TYPE_INSTANCE_GET_CLASS ((obj),\
> -            SPICE_TYPE_WIN_USB_DRIVER, SpiceWinUsbDriverClass))
> -
> -typedef struct _SpiceWinUsbDriver          SpiceWinUsbDriver;
> -typedef struct _SpiceWinUsbDriverClass     SpiceWinUsbDriverClass;
> -typedef struct
> _SpiceWinUsbDriverPrivate   SpiceWinUsbDriverPrivate;
> -
> -struct _SpiceWinUsbDriver
> -{
> -    GObject parent;
> -
> -    /*< private >*/
> -    SpiceWinUsbDriverPrivate *priv;
> -    /* Do not add fields to this struct */
> -};
> -
> -struct _SpiceWinUsbDriverClass
> -{
> -    GObjectClass parent_class;
> -};
> -
> -GType spice_win_usb_driver_get_type(void);
> -
> -SpiceWinUsbDriver *spice_win_usb_driver_new(GError **err);
> -
> -
> -void spice_win_usb_driver_install_async(SpiceWinUsbDriver *self,
> -                                        SpiceUsbDevice *device,
> -                                        GCancellable *cancellable,
> -                                        GAsyncReadyCallback
> callback,
> -                                        gpointer user_data);
> -gboolean spice_win_usb_driver_install_finish(SpiceWinUsbDriver
> *self,
> -                                             GAsyncResult *res,
> GError **err);
> -
> -void spice_win_usb_driver_uninstall_async(SpiceWinUsbDriver *self,
> -                                          SpiceUsbDevice *device,
> -                                          GCancellable
> *cancellable,
> -                                          GAsyncReadyCallback
> callback,
> -                                          gpointer user_data);
> -gboolean spice_win_usb_driver_uninstall_finish(SpiceWinUsbDriver
> *self,
> -                                               GAsyncResult *res,
> GError **err);
> -
> -
> -
> -SpiceUsbDevice *spice_win_usb_driver_get_device(SpiceWinUsbDriver
> *self);
> -
> -#define SPICE_WIN_USB_DRIVER_ERROR
> spice_win_usb_driver_error_quark()
> -
> -/**
> - * SpiceWinUsbDriverError:
> - * @SPICE_WIN_USB_DRIVER_ERROR_FAILED: generic error code
> - * @SPICE_WIN_USB_DRIVER_ERROR_MESSAGE: bad message read from clerk
> - *
> - * Error codes returned by spice-client API.
> - */
> -typedef enum
> -{
> -    SPICE_WIN_USB_DRIVER_ERROR_FAILED,
> -    SPICE_WIN_USB_DRIVER_ERROR_MESSAGE,
> -} SpiceWinUsbDriverError;
> -
> -GQuark spice_win_usb_driver_error_quark(void);
> -
> -G_END_DECLS
> -
> -#endif /* SPICE_WIN_USB_DRIVER_H */

it looks good to me.

Pavel



More information about the Spice-devel mailing list