> 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
>>>> 
>>> 
>> 
>> 
> 


Reply via email to