I need you to test :) can you execute this:
(ConfigurationOfUnifiedFFI project version: #development) load. and then retry your example? thanks, Esteban ps: this became pharo-dev, but well… still here :) > On 01 Jul 2016, at 13:48, Julien Delplanque <jul...@tamere.eu> wrote: > > Oh, ok :p > > Can you notify me know when the bug will be resolved? > > Thanks, > > Julien > > > On 01/07/16 13:36, Esteban Lorenzano wrote: >> … 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 >>>>>>>> >>> >> > >