2013/3/25 Hans de Goede <hdego...@redhat.com>:
> Hi,
>
>
> On 03/23/2013 12:05 PM, Ludovic Rousseau wrote:
>>
>> 2013/3/23 Hans de Goede <hdego...@redhat.com>:
>>>
>>> We all seem to agree on that, which is good :)  So it would be helpful
>>> to get some feedback on my proposed API for the opting in before I
>>> actually start coding this. Let me quote my own API proposal from
>>> another mail:
>>>
>>> Assuming all platforms will do auto-detach on interface claim (which
>>> makes sense given that drivers are usually per interface), we could
>>> make this a device_handle property, so then an app would do something
>>> like:
>>>
>>> libusb_device_handle *handle;
>>>
>>> libusb_open(dev, &handle);
>>> libusb_set_auto_detach(handle, 1);
>>> libusb_claim_interface(handle, x);
>>>
>>> With:
>>> void libusb_set_auto_detach(libusb_device_handle *dev, int auto_detach);
>>
>>
>> I propose to rename the function in libusb_set_auto_detach_kernel_driver()
>
>
> Ack.
>
>
>>
>> I also propose to give a symbolic name to the parameter value instead
>> of using 1.
>> Something like LIBUSB_AUTO_DETACH_KERNEL_DRIVER_ENABLE
>>
>> I don't know if we also need a LIBUSB_AUTO_DETACH_KERNEL_DRIVER_DISABLE
>> If not maybe the parameter can be removed.
>> Or maybe the function can be named:
>> libusb_set_parameter(handle, LIBUSB_AUTO_DETACH_KERNEL_DRIVER_ENABLE)
>
>
> I've been thinking about something more generic, ie:
> int libusb_set_parameter(libusb_device_handle *dev, int parameter,
>                          int value);
>
> But it seems better to me to just add per parameter set functions, these
> kind of multiplex functions are needlessly hard to use, and need demultiplex
> code in the implementation, which as ioctl code in the kernel shows, is
> easy at first but gets hard pretty quickly.
>
> Thinking more about this I propose to simply add a:
>
> void libusb_enable_auto_detach_kernel_driver(libusb_device_handle *dev);
>
> Function, this solves the whole needing defines for the argument problem,
> and the name makes it clear at once what the function does.

The problem with a new function for each new parameter is that it is
hard to use in a program. If you want to support different (older)
versions of libusbx you will have to use something like:

#ifdef HAVE_LIBUSB_ENABLE_AUTO_DETACH_KERNEL_DRIVER
libusb_enable_auto_detach_kernel_driver(device);
#else
libusb_enable_detach_kernel_driver(device);
#endif

And add the corresponding test in configure.ac

Maybe it is simpler to just always and only use
libusb_enable_detach_kernel_driver()

For each new function added to libusbx the API and ABI version needs
to be increased. A program compiled with version N of the library
cannot be used with a previous version of the library (unless the
library is linked statically but that not the way to use on Linux).


On the contrary, a generic function libusb_set_parameter() would
always be available and just return LIBUSB_ERROR_NOT_SUPPORTED for
unknown parameter. No more #ifdef dance and ABI issue.


I still do not know what the best solution is.

-- 
 Dr. Ludovic Rousseau

------------------------------------------------------------------------------
Own the Future-Intel&reg; Level Up Game Demo Contest 2013
Rise to greatness in Intel's independent game demo contest.
Compete for recognition, cash, and the chance to get your game 
on Steam. $5K grand prize plus 10 genre and skill prizes. 
Submit your demo by 6/6/13. http://p.sf.net/sfu/intel_levelupd2d
_______________________________________________
libusbx-devel mailing list
libusbx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libusbx-devel

Reply via email to