[Spice-devel] [spice-gtk Win32 v3 04/12] Add implementation of SpiceUsbDevice as a gobject (new files spice-usb-device*)

Uri Lublin uril at redhat.com
Thu Jun 28 02:18:30 PDT 2012


Hi Arnon,

Thanks for reviewing.

On 06/28/2012 09:45 AM, Arnon Gilboa wrote:
> See notes below.
> I guess you defined it only for ref counting, otherwise you would have 
> used simply a struct (similar to _SpiceUsbDevicePrivate) ?
> btw, why define Private and getters and not putting it all public? 
> Is it the the right gobject-way? no shorter way to do it? (see 
> spice_msg_in_ref(SpiceMsgIn *in) in spice-channel.c) 

You are correct, we need ref-counting (or otherwise copy those structures).
I think using a gobject is better than self-implementing inc_ref, 
dec_ref and destroy.

IIUC, the <class-name>-priv.h file is only included in code inside the 
library,
while <class-name>.h can be included in code outside of the library too.

Another option is to add those calls to usb-device-manager-priv.h

>
> Uri Lublin wrote:
>> ---
>>
>> +
>> +SpiceUsbDevice *spice_usb_device_new(void)
>> +{
>> +    GObject *obj;
>> +    SpiceUsbDevice *device;
>> +
>> +    obj =  g_object_new(SPICE_TYPE_USB_DEVICE, NULL);
>> +
> why obj is good for?

Creating a new object can be done with or without obj.

>> +    device = SPICE_USB_DEVICE(obj);
>> +
>> +    return device;
>> +}
>> +
>> +void spice_usb_device_set_info(SpiceUsbDevice *self, libusb_device 
>> *libdev)
>> +{
>> +    SpiceUsbDevicePrivate *priv;
>> +
>> +    g_return_if_fail(SPICE_IS_USB_DEVICE(self));
>> +    priv = self->priv;
>> +
>> +    g_warn_if_fail(libdev != NULL);
>> +
>> +#ifdef USE_USBREDIR
> isn't all of this is used only #ifdef USE_USBREDIR ?

Some is compiled with no USE_USBREDIR.
I think at least the class itself should be defined, but did not try 
without it.

>> +    if (libdev) {
>> +        struct libusb_device_descriptor desc;
>> +        int errcode;
>> +        const gchar *errstr;
>> +
>> +        priv->bus  = libusb_get_bus_number(libdev);
>> +        priv->addr = libusb_get_device_address(libdev);
>> +
>> +        errcode = libusb_get_device_descriptor(libdev, &desc);
>> +        if (errcode < 0) {
>> +            errstr = spice_usbutil_libusb_strerror(errcode);
>> +            g_warning("cannot get device descriptor for (%p) %d.%d 
>> -- %s(%d)",
>> +                      libdev, priv->bus, priv->addr, errstr, errcode);
>> +            priv->vid = -1;
>> +            priv->pid = -1;
>> +        } else {
>> +            priv->vid = desc.idVendor;
>> +            priv->pid = desc.idProduct;
>> +        }
>> +    }
>> +#endif
> I prefer returning the errorcode.

Existing code used -1 values here.

>
> Do we really need all the 
> g_return_val_if_fail(SPICE_IS_USB_DEVICE(device), 0) calls when we get 
> (SpiceUsbDevice *device) ?
> I guess we assume here 0 is illegitimate busnum/devaddr/vid/pid. Is it 
> acceptable?

Previous review comments suggest we do need the g_return_val_if_fail.
I too assume 0 is illegitimate.

>> +guint8 spice_usb_device_get_busnum(SpiceUsbDevice *device)
>> +{
>> +    g_return_val_if_fail(SPICE_IS_USB_DEVICE(device), 0);
>> +    return device->priv->bus;
>> +}
>> +
>> +guint8 spice_usb_device_get_devaddr(SpiceUsbDevice *device)
>> +{
>> +    g_return_val_if_fail(SPICE_IS_USB_DEVICE(device), 0);
>> +    return device->priv->addr;
>> +}
>> +
>> +guint16 spice_usb_device_get_vid(SpiceUsbDevice *device)
>> +{
>> +    g_return_val_if_fail(SPICE_IS_USB_DEVICE(device), 0);
>> +    return device->priv->vid;
>> +}
>> +
>> +guint16 spice_usb_device_get_pid(SpiceUsbDevice *device)
>> +{
>> +    g_return_val_if_fail(SPICE_IS_USB_DEVICE(device), 0);
>> +    return device->priv->pid;
>> +}



More information about the Spice-devel mailing list