On 01 Jul 2016, at 12:27, Esteban Lorenzano <estebanlm@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 <julien@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 <julien@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