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

… 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