[Spice-devel] [spice-gtk Win32 v3 05/12] Make SpiceUsbDevice a gobject, instead of a box for libusb_device

Uri Lublin uril at redhat.com
Thu Jun 28 05:42:28 PDT 2012


On 06/28/2012 01:09 PM, Christophe Fergeau wrote:
> On Thu, Jun 28, 2012 at 04:46:34AM +0300, Uri Lublin wrote:
>> Note that this change may affect performance a bit, as we now need to look
>> for the libusb_device if we need it. Likely it's negligible.
>> ---
>>   gtk/Makefile.am               |    4 +
>>   gtk/channel-usbredir-priv.h   |    4 +-
>>   gtk/channel-usbredir.c        |   46 +++++-----
>>   gtk/map-file                  |    7 ++
>>   gtk/usb-device-manager-priv.h |    3 +
>>   gtk/usb-device-manager.c      |  194 +++++++++++++++++++++++++++++------------
>>   gtk/usb-device-manager.h      |    5 +-
>>   gtk/usb-device-widget.c       |    9 +--
>>   spice-common                  |    2 +-
>>   9 files changed, 182 insertions(+), 92 deletions(-)
>>
>> @@ -395,7 +396,7 @@ static void spice_usb_device_manager_class_init(SpiceUsbDeviceManagerClass *klas
>>                        g_cclosure_marshal_VOID__BOXED,
>>                        G_TYPE_NONE,
>>                        1,
>> -                     SPICE_TYPE_USB_DEVICE);
>> +                     G_TYPE_POINTER);
> Why are you not keeping SPICE_TYPE_USB_DEVICE here and in the calls below?

I'll put them back.

>>       /**
>>        * SpiceUsbDeviceManager::device-removed:
>> @@ -414,7 +415,7 @@ static void spice_usb_device_manager_class_init(SpiceUsbDeviceManagerClass *klas
>>                        g_cclosure_marshal_VOID__BOXED,
>>                        G_TYPE_NONE,
>>                        1,
>> -                     SPICE_TYPE_USB_DEVICE);
>> +                     G_TYPE_POINTER);
>>
>>       /**
>>        * SpiceUsbDeviceManager::auto-connect-failed:
>> @@ -435,7 +436,7 @@ static void spice_usb_device_manager_class_init(SpiceUsbDeviceManagerClass *klas
>>                        g_cclosure_user_marshal_VOID__BOXED_BOXED,
>>                        G_TYPE_NONE,
>>                        2,
>> -                     SPICE_TYPE_USB_DEVICE,
>> +                     G_TYPE_POINTER,
>>                        G_TYPE_ERROR);
>>
>>       /**
>> @@ -457,7 +458,7 @@ static void spice_usb_device_manager_class_init(SpiceUsbDeviceManagerClass *klas
>>                        g_cclosure_user_marshal_VOID__BOXED_BOXED,
>>                        G_TYPE_NONE,
>>                        2,
>> -                     SPICE_TYPE_USB_DEVICE,
>> +                     G_TYPE_POINTER,
>>                        G_TYPE_ERROR);
>>
>>       g_type_class_add_private(klass, sizeof(SpiceUsbDeviceManagerPrivate));
>> @@ -1009,34 +1019,32 @@ spice_usb_device_manager_can_redirect_device(SpiceUsbDeviceManager  *self,
>>    *
>>    * Returns: a newly-allocated string holding the description, or %NULL if failed
>>    */
>> -gchar *spice_usb_device_get_description(SpiceUsbDevice *_device, const gchar *format)
>> +gchar *spice_usb_device_get_description(SpiceUsbDevice *device, const gchar *format)
>>   {
>>   #ifdef USE_USBREDIR
>> -    libusb_device *device = (libusb_device *)_device;
>> -    struct libusb_device_descriptor desc;
>> -    int bus, address;
>> +    int bus, addr, vid, pid;
>>       gchar *description, *descriptor, *manufacturer = NULL, *product = NULL;
>>
>> -    g_return_val_if_fail(device != NULL, NULL);
>> +    g_return_val_if_fail(SPICE_IS_USB_DEVICE(device), NULL);
>>
>> -    bus     = libusb_get_bus_number(device);
>> -    address = libusb_get_device_address(device);
>> +    bus  = spice_usb_device_get_busnum(device);
>> +    addr = spice_usb_device_get_devaddr(device);
>> +    vid  = spice_usb_device_get_vid(device);
>> +    pid  = spice_usb_device_get_pid(device);
>>
>> -    if (libusb_get_device_descriptor(device,&desc) == LIBUSB_SUCCESS) {
>> -        spice_usb_util_get_device_strings(bus, address,
>> -                                          desc.idVendor, desc.idProduct,
>> -&manufacturer,&product);
>> -        descriptor = g_strdup_printf("[%04x:%04x]", desc.idVendor, desc.idProduct);
>> +    if ((vid>  0)&&  (pid>  0)) {
>> +        descriptor = g_strdup_printf("[%04x:%04x]", vid, pid);
> I don't think this will do the right thing in error cases, get_vid returns
> an uint16_t which value is 0xffff when there's an error, it will be turned
> into 65535 when it's cast to int, it won't be -1. I haven't looked at the
> rest of the patch for similar issues.

I'll change vid, pid values to 0 on error.


Thanks,
     Uri.



More information about the Spice-devel mailing list