… and now you hit a bug. bah, an “non implemented feature” :P I never tested arrays with complex types. it should not be hard… I will provide a fix.
Esteban > On 01 Jul 2016, at 13:30, Julien Delplanque <jul...@tamere.eu> wrote: > > Ok, the ffi call is done without problem with your method thanks. :) > > But now that I have the array, when I try to access the first element using: > > array first. > > I get a exception saying I need to override a method: > > "SubclassResponsibility: FFIOpaqueObjectType had the subclass responsibility > to implement #basicHandle:at:" > > I looked at others implementors but I am not sure of how I should override > it, nor if I should. > > Thanks for the time your taking to answer me. :-) > > Julien > > On 01/07/16 12:29, Esteban Lorenzano wrote: >>> On 01 Jul 2016, at 12:27, Esteban Lorenzano <esteba...@gmail.com> wrote: >>> >>> hi, >>> >>> this is because you want to get an array with opaque objects. Do not let >>> the *** confuses you… cwhat you actually want, conceptually is something >>> like this: >>> >>> *((FFIOpaqueObject*)[]) >>> >>> means: you pass the address of an array of opaque types (who are always >>> pointers). >>> >>> So, what you need to pass is the address of an array… you will need to work >>> a bit here, since translation is not automatic. >>> >>> 1) you need to declare your type. Let’ say it will be: >>> >>> FFIOpaqueObject subclass: USBDevice. >>> >>> 2) then you need to get the pointer to this array. You need to rewrite you >>> code as this: >>> >>> arrayPtr := ExternalAddress new. >>> size := self getDevice: ctx list: arrayPtr. >>> >>> getDevice: ctx list: list >>> ^ self ffiCall: #(size_t libusb_get_device_list (libusb_context *ctx, >>> void **list)) >>> >>> NOTE that we change the type to "void **”. This is because this is what you >>> actually want: the array of devices >>> >>> 3) now you will have size and arrayPtr. Then you declare the array: >>> >>> array := FFIExternalArray fromPointer: arrayPtr type: USBDevice >> sorry, this expression (while possible) does not stops in “size”… it has to >> be like this, instead: >> >> array := FFIExternalArray fromPointer: arrayPtr type: USBDevice size: size. >> “you already has the size for the result" >> >>> … and you should be able to iterate this array normally :) >>> >>> let me know if this works for you… I’m “coding in mail client”, so it can >>> fail :P >>> >>> cheers, >>> Esteban >>> >>> >>>> On 01 Jul 2016, at 12:02, Julien Delplanque <jul...@tamere.eu> wrote: >>>> >>>> Thanks, it works I get an instance of FFIOpaqueObject. >>>> >>>> But how do I get a specific libusb_device object from the list? >>>> >>>> Thanks again for you quick answer :-). >>>> >>>> Julien >>>> >>>> On 01/07/16 11:44, Esteban Lorenzano wrote: >>>>> Hi, >>>>> >>>>> an opaque structure is not an FFIExternalObject but an FFIOpaqueObject. >>>>> in that case, something like (simplified): >>>>> >>>>> ctx := (your context). >>>>> list := FFIOpaqueObject new. >>>>> size := self getDevice: ctx list: list. >>>>> >>>>> getDevice: ctx list: list >>>>> ^ self ffiCall: #(size_t libusb_get_device_list (libusb_context *ctx, >>>>> FFIOpaqueObject ***list)) >>>>> >>>>> should work (note that of course you can make libusb_device an alias for >>>>> your type… that does not matters much, this is just a simplification). >>>>> >>>>> if this does not works, if you can provide me code to reproduce it, I can >>>>> give it a shot and see what happens :) >>>>> >>>>> Esteban >>>>> >>>>>> On 01 Jul 2016, at 11:19, Julien Delplanque <jul...@tamere.eu> wrote: >>>>>> >>>>>> Hello everyone, >>>>>> >>>>>> I have a question about the UFFI API. I have the following function: >>>>>> >>>>>> ssize_t libusb_get_device_list (libusb_context *ctx, libusb_device >>>>>> ***list) >>>>>> >>>>>> where libusb_device is an opaque structure. >>>>>> >>>>>> I made a type mapping "ssize_t" -> "int" and an object inheriting >>>>>> from FFIExternalObject for the "libusb_context" (others methods >>>>>> using it are working). >>>>>> >>>>>> I can not find how to get an array filled with libusb_device using UFFI >>>>>> from Pharo. :-( >>>>>> >>>>>> Thanks in advance, >>>>>> >>>>>> Julien >>>>>> >>>> >> > >