Hi again!
I'm still stuck with the following C code (simplified):
-X-X-X-
// Now, get the locationID of this device. In order to do this, we need to create an IOUSBDeviceInterface // for our device. This will create the necessary connections between our userland application and the // kernel object for the USB Device.
kr = IOCreatePlugInInterfaceForService(usbDevice, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &plugInInterface, &score);
// Use the plugin interface to retrieve the device interface. res = (*plugInInterface)->QueryInterface( plugInInterface, CFUUIDGetUUIDBytes( kIOUSBDeviceInterfaceID ), (LPVOID*) &privateDataRef->deviceInterface );
// Now done with the plugin interface. (*plugInInterface)->Release(plugInInterface);
-X-X-X-
I have translated this to:
-X-X-X-
(let ((kr nil) (res nil) (deviceName (cffi:foreign-alloc :char :count 128)) (deviceNameAsCFString nil) (privateDataRef nil) (plugInInterface (cffi:foreign-alloc 'IOCFPlugInInterface :count 1)) (score (cffi:foreign-alloc 'SInt32 :count 1)) (locationID nil))
(setq kr (io-registry-entry-get-name usb-device deviceName))
(when (not (eql kr KERN_SUCCESS)) (setf (cffi:mem-ref deviceName 'io_name_t 0) 0))
(setq deviceNameAsCFString (cf-string-create-with-c-string *kCFAllocatorDefault* (foreign-string-to-lisp deviceName) (foreign-enum-value '__kCFStringEncoding :kCFStringEncodingASCII)))
(setq privateDataRef (cffi:foreign-alloc 'MyPrivateData :count 1))
(setf (foreign-slot-value privateDataRef 'MyPrivateData 'deviceName) deviceNameAsCFString)
(setq kr (io-create-plug-in-interface-for-service usb-device kIOUSBDeviceUserClientTypeID kIOCFPlugInInterfaceID plugInInterface score))
(if (not (eql kr kIOReturnSuccess))
(format *debug-io* "~%*** ERROR: io-create-plug-in-interface-for-service: ~s." kr)
(progn ;; else
(let ((query-interface-ptr (foreign-slot-value plugInInterface 'IOCFPlugInInterface 'ccag.osx.iokit::QueryInterface)) (kIOUSBDeviceInterfaceID-uuid-bytes (cf-uuid-get-uuid-bytes kIOUSBDeviceInterfaceID)))
(format *debug-io* "~%DEVICE-ADDED: query-interface-ptr = ~s." query-interface-ptr)
(setq res (foreign-funcall-pointer query-interface-ptr () :pointer plugInInterface CFUUIDBytes kIOUSBDeviceInterfaceID-uuid-bytes :pointer (foreign-slot-pointer privateDataRef 'MyPrivateData 'deviceInterface))) ....
-X-X-X-
I get everything ok up until I am trying to call foreign-funcall-pointer ... - for which I have no way to create a call-by-value definition using FSBV.
I am sure I am not seeing the forest for the trees ... My mind seems trying to always do direct translations from C to Lisp where another approach is required ... I am eager to hear your thoughts... Thanks a lot !
Best wishes Frank