[Spice-devel] [spice-gtk Win32 v4 06/17] Windows mingw: usb: Dynamically install a libusb driver for USB devices
Uri Lublin
uril at redhat.com
Sun Jul 8 14:07:56 PDT 2012
On 07/06/2012 09:46 AM, Hans de Goede wrote:
> Hi,
>
> On 07/05/2012 10:43 PM, Uri Lublin wrote:
>> - Added win-usb-driver-install.[ch]
>> - Added win-usb-clerk.h
>>
>> Operation (on Windows, spice-gtk point of view):
>> - After some sanity checks, just before redir'ing a USB device
>> a libusb driver needs to be installed (before libusb can open the
>> device)
>> - A connection (NamedPipe) is established with usb-clerk, a libusb
>> driver installation service, and a request for driver installation
>> is sent.
>> - Installation status is asynchronously read from the pipe, and
>> spice_usb_drv_install_finished() is called.
>> - Upon a successful intallation, usbredir continues.
>>
>> Linux operation is not changed.
>> ---
>> gtk/Makefile.am | 3 +
>> gtk/usb-device-manager.c | 150 +++++++++++++++-
>> gtk/win-usb-clerk.h | 35 ++++
>> gtk/win-usb-driver-install.c | 387
>> ++++++++++++++++++++++++++++++++++++++++++
>> gtk/win-usb-driver-install.h | 98 +++++++++++
>> 5 files changed, 663 insertions(+), 10 deletions(-)
>> create mode 100644 gtk/win-usb-clerk.h
>> create mode 100644 gtk/win-usb-driver-install.c
>> create mode 100644 gtk/win-usb-driver-install.h
>>
>
> <snip>
>
>> @@ -635,7 +649,7 @@ static void
>> spice_usb_device_manager_add_dev(SpiceUsbDeviceManager *self,
>> spice_usb_device_manager_connect_device_async(self,
>> device, NULL,
>>
>> spice_usb_device_manager_auto_connect_cb,
>> - g_object_ref(device));
>> + device);
>> }
>> }
>>
>
>
> This seems wrong as spice_usb_device_manager_auto_connect_cb will
> still do a spice_usb_device_unref, so
> we must ref it here to match, also this seems like something which
> belongs in a different patch...
OK.
>
>>
>> + */
>> +static void spice_usb_device_manager_drv_install_cb(GObject *gobject,
>> + GAsyncResult *res,
>> + gpointer user_data)
>> +{
>> + SpiceUsbDeviceManager *self;
>> + SpiceWinUsbDriver *installer;
>> + gint status;
>> + GError *err = NULL;
>> + SpiceUsbDevice *device;
>> + UsbInstallCbInfo *cbinfo;
>> + GCancellable *cancellable;
>> + GAsyncReadyCallback callback;
>> +
>> + SPICE_DEBUG("Win USB driver Installation finished");
>> +
>> + g_return_if_fail(user_data != NULL);
>> +
>> + cbinfo = user_data;
>> + self = cbinfo->manager;
>> + device = cbinfo->device;
>> + installer = cbinfo->installer;
>> + cancellable = cbinfo->cancellable;
>> + callback = cbinfo->callback;
>> + user_data = cbinfo->user_data;
>> +
>> + g_free(cbinfo);
>> +
>> + g_return_if_fail(SPICE_IS_USB_DEVICE_MANAGER(self));
>> + g_return_if_fail(SPICE_IS_WIN_USB_DRIVER(installer));
>> + g_return_if_fail(device!= NULL);
>> +
>> + status = spice_win_usb_driver_install_finish(installer, res, &err);
>> +
>> + g_object_unref(installer);
>> +
>> + if (err) {
>> + g_warning("win usb driver installation failed -- %s",
>> + err->message);
>> + g_error_free(err);
>> + spice_usb_device_unref(device);
>> + return;
>> + }
>> +
>> + if (!status) {
>> + g_warning("failed to install win usb driver (status=0)");
>> + spice_usb_device_unref(device);
>
> Can you please raise the appropriate error signal here, so that the
> user gets
> an error dialog ?
In V5, the code does not return here on error.
Instead _spice_usb_device_manager_connect_device_async is always called
(for install
operation). If the driver failed to install, libusb_open would fail, and
the error would
be propagated correctly.
>
>> + return;
>> + }
>> +
>> + /* device is already ref'ed */
>> + _spice_usb_device_manager_connect_device_async(self,
>> + device,
>> + cancellable,
>> + callback,
>> + user_data);
>> +
>> +}
>> +#endif
>> +
>> /*
>> ------------------------------------------------------------------ */
>> /* private
>> api */
>>
Thanks,
Uri.
More information about the Spice-devel
mailing list