Hi, On Thu, Dec 15, 2016 at 03:20:36PM +0100, Pavel Grunt wrote: > Hi, > > On Fri, 2016-12-09 at 18:22 +0100, Victor Toso wrote: > > From: Victor Toso <me@xxxxxxxxxxxxxx> > > > > As we have UsbDk integration now which is well maintained upstream. > > yes, it makes a sense > > > > > Signed-off-by: Victor Toso <victortoso@xxxxxxxxxx> > > --- > > 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 Double checked. Indeed, seems no harm is done on removing that check. Sending v2 shortly > > #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@xxxxxxxxxx> > > - > > - 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@xxxxxxxxxx> > > - > > - 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 >
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel