I understand that as of v10.2, OS-X has the TWAIN data source manager pre-installed. Could this be used directly, or would some other interface (eg. SANE) be required?
Any help will be much appreciated.

Hi wilbert. Thanks for your answer.wilbert wrote:Maybe you can use the IKScannerDeviceView class from the ImageKit framework.
Understand perfectly.wilbert wrote:Unfortunately it's hard for me to help out.
My scanner is so old that OSX Yosemite doesn't recognize it![]()
I can't test anything.
Code: Select all
ICDeviceBrowser *mDeviceBrowser = [[ICDeviceBrowser alloc] init];
mDeviceBrowser.delegate = self;
mDeviceBrowser.browsedDeviceTypeMask = ICDeviceLocationTypeMaskLocal|ICDeviceLocationTypeMaskRemote|ICDeviceTypeMaskScanner;
[mDeviceBrowser start];
- (void)scannerDeviceDidBecomeAvailable:(ICScannerDevice*)scanner {
[scanner requestOpenSession];
}
- (void)deviceBrowser:(ICDeviceBrowser*)browser didAddDevice:(ICDevice*)addedDevice moreComing:(BOOL)moreComing {
if ( (addedDevice.type & ICDeviceTypeMaskScanner) == ICDeviceTypeScanner ) {
[scannerView setScannerDevice:(ICScannerDevice*)addedDevice];
}
}
- (void)didRemoveDevice:(ICDevice*)removedDevice {
[removedDevice requestCloseSession];
}
Me too since March 30th...TI-994A wrote:
Still nowhere after ten head-banging days.![]()
Dear! Oh Dear!Shardik wrote:Me too since March 30th...
This is a pretty peculiar pickle. My experience with Apple Mac's have always been a pleasant one, but for some reason, scanning has been the one exception (so far).Shardik wrote:...as long as MacOS isn't able to detect the scanners, it's unfortunately not possible to use the awesome classes IKDeviceBrowserView and IKScannerDeviceView...
...
Is your scanner detected by Apple's capture app? If not I don't see a way for you to realize a PB scanning app with PureBasic...
Code: Select all
EnableExplicit
ImportC "/System/Library/Frameworks/ImageCaptureCore.framework/ImageCaptureCore"
EndImport
ImportC "/System/Library/Frameworks/Quartz.framework/Quartz"
EndImport
Define DeviceBrowserView.I
OpenWindow(0, 270, 100, 200, 150, "Available scanners")
DeviceBrowserView = CocoaMessage(0, 0, "IKDeviceBrowserView new")
If DeviceBrowserView
CocoaMessage(0, DeviceBrowserView, "setDisplaysLocalScanners:", #YES)
CocoaMessage(0, DeviceBrowserView, "setDisplaysNetworkScanners:", #YES)
CocoaMessage(0, DeviceBrowserView, "setDisplaysLocalCameras:", #NO)
CocoaMessage(0, DeviceBrowserView, "setDisplaysNetworkCameras:", #NO)
CocoaMessage(0, WindowID(0), "setContentView:", DeviceBrowserView)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Code: Select all
EnableExplicit
#DeviceBrowserWidth = 180
; ----- Defined in ICDevice.h
#ICDeviceLocationTypeMaskBluetooth = $00000800
#ICDeviceLocationTypeMaskBonjour = $00000400
#ICDeviceLocationTypeMaskLocal = $00000100
#ICDeviceLocationTypeMaskRemote = $0000FE00
#ICDeviceLocationTypeMaskShared = $00000200
#ICDeviceTypeMaskCamera = $00000001
#ICDeviceTypeMaskScanner = $00000002
ImportC ""
class_addMethod(Class.I, Selector.I, *Callback, Types.P-ASCII)
class_createInstance(Class.I, ExtraBytes.I)
objc_allocateClassPair(ModelClass.I, NewClassName.P-ASCII, ExtraBytes.I)
objc_lookUpClass(ClassName.P-ASCII)
object_setClass(ObjectToModify.I, NewClass.I)
objc_registerClassPair(NewClass.I)
sel_registerName(MethodName.P-ASCII)
EndImport
ImportC "/System/Library/Frameworks/ImageCaptureCore.framework/ImageCaptureCore"
EndImport
ImportC "/System/Library/Frameworks/Quartz.framework/Quartz"
EndImport
Define CameraView.I
Define DelegateClass.I
Define DeviceArray.I
Define DeviceBrowser.I
Define DeviceView.I
Define SubclassedDeviceBrowser.I
Procedure AddView(WindowID.I, View.I, x.I, y.I, Width.I, Height.I)
Protected ContentView.I
Protected Frame.NSRect
Frame\origin\x = x
Frame\origin\y = y
Frame\size\width = Width
Frame\size\height = Height
CocoaMessage(0, View, "initWithFrame:@", @Frame)
ContentView = CocoaMessage(0, WindowID(WindowID), "contentView")
If ContentView
CocoaMessage(0, ContentView, "addSubview:", View)
EndIf
EndProcedure
ProcedureC DeviceAddedCallback(Object.I, Selector.I, DeviceBrowser.I,
AddedDevice.I, MoreComing.I)
Static DeviceView.I
Protected CameraView.I
Protected DeviceType.I = CocoaMessage(0, AddedDevice, "type")
Protected ScannerView.I
CocoaMessage(0, AddedDevice, "setDelegate:", AddedDevice)
If MoreComing = #NO And DeviceView = 0
DeviceView = CocoaMessage(0, 0, "IKDeviceBrowserView new")
If DeviceView
If DeviceType & #ICDeviceTypeMaskCamera
; ----- New camera was detected
Debug "DeviceAddedCallback: new camera detected"
SetWindowTitle(0, "Camera image viewer")
AddView(0, DeviceView, 5, 5, #DeviceBrowserWidth, WindowHeight(0) - 10)
CameraView = CocoaMessage(0, 0, "IKCameraDeviceView new")
If CameraView
AddView(0, CameraView, #DeviceBrowserWidth + 1, 5,
WindowWidth(0) - #DeviceBrowserWidth - 10, WindowHeight(0) - 10)
CocoaMessage(0, CameraView, "setCameraDevice:", AddedDevice)
EndIf
ElseIf DeviceType & #ICDeviceTypeMaskScanner
; ----- New scanner was detected
Debug "DeviceAddedCallback: new scanner detected"
SetWindowTitle(0, "Scanner")
AddView(0, DeviceView, 5, 5, #DeviceBrowserWidth, WindowHeight(0) - 10)
ScannerView = CocoaMessage(0, 0, "IKScannerDeviceView new")
If ScannerView
AddView(0, ScannerView, #DeviceBrowserWidth + 1, 5,
WindowWidth(0) - #DeviceBrowserWidth - 10, WindowHeight(0) - 10)
CocoaMessage(0, ScannerView, "setScannerDevice:", AddedDevice)
EndIf
Else
Debug "DeviceAddedCallback: new other device detected"
EndIf
EndIf
EndIf
EndProcedure
ProcedureC DeviceRemovedCallback(Object.I, Selector.I,
DeviceBrowser.I, RemovedDevice.I, MoreGoing.I)
CocoaMessage(0, RemovedDevice, "setDelegate:", 0)
Debug "DeviceRemovedCallback: Device was removed"
EndProcedure
ProcedureC DeviceSelectedCallback(Object.I, Selector.I, Device.I)
Debug "DeviceSelectedCallback: Button was pressed"
EndProcedure
OpenWindow(0, 90, 100, 900, 600, "",
#PB_Window_SystemMenu | #PB_Window_SizeGadget)
DeviceBrowser = CocoaMessage(0, 0, "ICDeviceBrowser new")
If DeviceBrowser
DelegateClass = objc_allocateClassPair(objc_lookUpClass("NSObject"),
"PB_Delegate", 0)
class_addMethod(DelegateClass,
sel_registerName("deviceBrowser:didAddDevice:moreComing:"),
@DeviceAddedCallback(), "v@:@@@")
class_addMethod(DelegateClass,
sel_registerName("deviceBrowser:didRemoveDevice:moreGoing:"),
@DeviceRemovedCallback(), "v@:@@@")
class_addMethod(DelegateClass,
sel_registerName("deviceBrowser:requestsSelectDevice:"),
@DeviceSelectedCallback(), "v@:@@")
objc_registerClassPair(DelegateClass)
CocoaMessage(0, DeviceBrowser, "setDelegate:",
class_createInstance(DelegateClass, 0))
CocoaMessage(0, DeviceBrowser, "setBrowsedDeviceTypeMask:",
#ICDeviceLocationTypeMaskLocal | #ICDeviceLocationTypeMaskShared |
#ICDeviceTypeMaskCamera | #ICDeviceTypeMaskScanner)
CocoaMessage(0, DeviceBrowser, "start")
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
CocoaMessage(0, DeviceBrowser, "stop")
CocoaMessage(0, DeviceBrowser, "release")
EndIf
Hi Shardik. Just thought that I'd share some updates with you.Shardik wrote:- It should detect the connection of a scanner and should display the scanner view. It should also detect a button click like clicking the scan button.
Code: Select all
ProcedureC DeviceAddedCallback(Object.I, Selector.I, DeviceBrowser.I,
AddedDevice.I, MoreComing.I)
Static DeviceView.I
Protected CameraView.I
Protected DeviceType.I = CocoaMessage(0, AddedDevice, "type")
Protected ScannerView.I
CocoaMessage(0, AddedDevice, "setDelegate:", AddedDevice)
If MoreComing = #NO And DeviceView = 0
DeviceView = CocoaMessage(0, 0, "IKDeviceBrowserView new")
If DeviceView
If DeviceType & #ICDeviceTypeMaskCamera
; ----- New camera was detected
Debug "DeviceAddedCallback: new camera detected"
SetWindowTitle(0, "Camera image viewer")
AddView(0, DeviceView, 5, 5, #DeviceBrowserWidth, WindowHeight(0) - 10)
CameraView = CocoaMessage(0, 0, "IKCameraDeviceView new")
If CameraView
AddView(0, CameraView, #DeviceBrowserWidth + 1, 5,
WindowWidth(0) - #DeviceBrowserWidth - 10, WindowHeight(0) - 10)
CocoaMessage(0, CameraView, "setCameraDevice:", AddedDevice)
EndIf
ElseIf DeviceType & #ICDeviceTypeMaskScanner
; ----- New scanner was detected
Debug "DeviceAddedCallback: new scanner detected"
SetWindowTitle(0, "Scanner")
AddView(0, DeviceView, 5, 5, #DeviceBrowserWidth, WindowHeight(0) - 10)
ScannerView = CocoaMessage(0, 0, "IKScannerDeviceView new")
If ScannerView
;AddView(0, CameraView, #DeviceBrowserWidth + 1, 5, ;<--- should be ScannerView
AddView(0, ScannerView, #DeviceBrowserWidth + 1, 5,
WindowWidth(0) - #DeviceBrowserWidth - 10, WindowHeight(0) - 10)
;CocoaMessage(0, CameraView, "setScannerDevice:", AddedDevice) ;<--- should be ScannerView
CocoaMessage(0, ScannerView, "setScannerDevice:", AddedDevice)
EndIf
Else
Debug "DeviceAddedCallback: new other device detected"
EndIf
EndIf
EndIf
EndProcedure
Code: Select all
Until WaitWindowEvent() = #PB_Event_CloseWindow
Code: Select all
CocoaMessage(0, ScannerView, "setDelegate:",
class_createInstance(DelegateClass, 0))
Code: Select all
class_addMethod(DelegateClass,
sel_registerName("scannerDeviceView:didEncounterError:"),
@ErrorCallback(), "v@:@@")
class_addMethod(DelegateClass,
sel_registerName("scannerDeviceView:didScanToURL:fileData:error:"),
@ScanCompleteCallback(), "v@:@@@")
Code: Select all
ProcedureC ErrorCallback(ScannerView.I, *NSError)
Debug "Error occurred during scan!"
EndProcedure
ProcedureC ScanCompleteCallback(ScannerView.I, *SaveURL, *FileData, *NSError)
Debug "Scan was completed!"
EndProcedure
Code: Select all
CocoaMessage(0, ScannerView, "setDisplaysDownloadsDirectoryControl:", #YES)
Code: Select all
CocoaMessage(0, ScannerView, "setDocumentName:$", @"MyScanDocumentName")
Hi Shardik. I understand perfectly. Peripheral programming is hard enough without having to work blindly - simply impossible.Shardik wrote:...consequence of being not able to test with a scanner recognized by MacOS...
Wow! That's great news. I've not even been able to get the scan button to show on Lion or Mavericks.Shardik wrote:I was able to do my first successful scan with a Brother ADS-2100 using just my code example from above on Snow Leopard 10.6.8...![]()
After starting my code example from above I only had to click onto the "Scan" button and the scan was done perfectly and displayed at once and saved into my image folder.
I then tried the same on Mavericks and although the scanner is detected and selected (as Debug proves) there aren't any buttons displayed (empty scan window), so there is no possibility to start the scan...