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 <jul...@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 <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
>>>>>>>>>> 
>>> 
>> 
> 
> 


Reply via email to