On 04 Jul 2016, at 12:15, Ben Coman <btc@openinworld.com> wrote:

How does it compare with the result you get in pure C?
e.g. using this code...
http://libusb.org/browser/libusb/examples/lsusb.c?rev=efc29733ad31f81883a7ac51a6cc6cda9ad4feb9&order=name

yes, this is a good approach since I cannot know what is happening��� and basically arrays just take the pointer and do ���address+offset��� to give you another pointer. 
but of course, it can fail��� if somewhere there is a problem in function translation���

Esteban



On Mon, Jul 4, 2016 at 4:24 PM, Julien Delplanque <julien@tamere.eu> wrote:
Hello again Esteban, all others,

I am still experiencing strange behaviors with the objects in the external
array.

I get a lot of NULL pointers and some strange addresses (I guess, I am not a
C expert) that are close to NULL
(see the screenshot attached). These objects make the VM crash (segmentation
fault) when I call a function
from the libusb binding (for NULL objects it may be ok but what about
others?). Some other objects (those with
a normal address in the screenshot) work finely with the functions calls
using UFFI...

This kind of bug is not reported in libusb discussions I found on the
internet and I tried an example in C,
there is no NULL pointer received from the function (they are not even
considered in official examples).

So I guess the problem may come from Pharo?

Do you have any idea of what it could be?

I will be available on Slack all the day if you want. :)

Thanks in advance,

Julien

On 01/07/16 14:03, Esteban Lorenzano wrote:

ok, can you reload development version and try again?

ps: this is easier on slack ;)

On 01 Jul 2016, at 14:00, Esteban Lorenzano <estebanlm@gmail.com> wrote:

yes, I made a mistake��� the problem of not being capable of test here :(

1 minute.

Esteban

On 01 Jul 2016, at 13:56, Julien Delplanque <julien@tamere.eu> wrote:

Ok, now I get a different exception! :-)

"MessageNotUnderstood: LUDevice class>>fromHandle:"

when executing: "array first."

Where LUDevice is defined like this:

FFIOpaqueObject subclass: #LUDevice
  instanceVariableNames: ''
  classVariableNames: ''
  package: 'LibUsb-Kernel'

Julien


On 01/07/16 13:51, Esteban Lorenzano wrote:

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