package uk.co.mmscomputing.device.sane; import java.awt.image.BufferedImage; import java.lang.ref.WeakReference; public class jsane{ // sane functions static private SaneDeviceManager manager; // applet: this object will live as long as browser window is open static private WeakReference scanner; // applet: set to new object if applet reloads static public native void init()throws SaneIOException; static public native void exit(); static public native String[] getDevices(boolean localOnly)throws SaneIOException; static public native int open(String device)throws SaneIOException; static public native void close(int handle); static public native OptionDescriptor getOptionDescriptor(int handle,int option); static public native void getControlOption(int handle,int option,byte[] value)throws SaneIOException; static public native int setControlOption(int handle,int option,byte[] value)throws SaneIOException; static public native void setAutoControlOption(int handle,int option)throws SaneIOException; static public native void getParameters(int handle,Parameters p)throws SaneIOException; static public native void start(int handle)throws SaneIOException; static public native int read(int handle,byte[] b,int off,int len)throws SaneIOException; static public native void cancel(int handle); // next two functions are implemented but have never been tested. Not really necessary. static public native void setIOMode(int handle,boolean mode)throws SaneIOException; static public native int getSelectFD(int handle)throws SaneIOException; static public native String strStatus(int status); // mmsc functions static private boolean isinstalled; static public boolean isInstalled(){return isinstalled;} static public native int getVersion(); // control options : added special Word/Int/String getter/setter static public native int getWordControlOption(int handle,int option)throws SaneIOException; static public native int setWordControlOption(int handle,int option,int value)throws SaneIOException; static protected native void getWordArrayControlOption(int handle,int option,int[] values)throws SaneIOException; static protected native int setWordArrayControlOption(int handle,int option,int[] values)throws SaneIOException; static protected native String getStringControlOption(int handle,int option,int strlen)throws SaneIOException; static protected native int setStringControlOption(int handle,int option,int strlen,String str)throws SaneIOException; static public int getNumberOfOptions(int handle)throws SaneIOException{ return getWordControlOption(handle,0); // [1] p.26 4.3.6 } static public void setScanner(SaneScanner s){ scanner=new WeakReference(s); } static private SaneScanner getScanner(){ return (SaneScanner)scanner.get(); } static SaneDeviceManager getDeviceManager(){return manager;} static void checkInstalled()throws SaneIOException{ if(!isinstalled){ throw new SaneIOException(jsane.class,"checkInstalled","jsane.err.isnotinstalled"); } } static public void select(SaneScanner sc)throws SaneIOException{ checkInstalled(); manager.getDevice().checkBusy(); setScanner(sc); manager.selectDevice(); } static public void select(SaneScanner sc, String name)throws SaneIOException{ checkInstalled(); manager.getDevice().checkBusy(); setScanner(sc); manager.selectDevice(name); } static public void acquire(SaneScanner sc)throws SaneIOException{ checkInstalled(); manager.getDevice().checkBusy(); setScanner(sc); final SaneDevice device=manager.getDevice(); new Thread(){public void run(){device.acquire();}}.start(); } static public void setCancel(SaneScanner sc,boolean c)throws SaneIOException{ SaneDevice device = manager.getDevice(); if(device==null){return;} checkInstalled(); setScanner(sc); device.setCancel(c); } static void negotiateOptions(SaneDevice source){ SaneScanner scanner=getScanner(); if(scanner!=null){scanner.negotiateOptions(source);} } static void signalImage(BufferedImage image){ if(image!=null){ SaneScanner scanner=getScanner(); if(scanner!=null){scanner.setImage(image);} } } static void signalStateChange(SaneDevice device){ SaneScanner scanner=getScanner(); if(scanner!=null){scanner.setState(device);} } static void signalException(Exception e){ SaneScanner scanner=getScanner(); if(scanner!=null){scanner.signalException(e);} } // simple internationalization static private uk.co.mmscomputing.util.UtilResources resources; static public String getResource(String id){return resources.getString(id);} static public String getResource(String id,String arg0){return resources.getString(id,arg0);} static public String getResource(String id,String[] args){return resources.getString(id,args);} static{ resources=new uk.co.mmscomputing.util.UtilResources(jsane.class); // linux : load library 'libjsane.so' isinstalled=uk.co.mmscomputing.util.JarLib.load(jsane.class,"jsane"); if(isinstalled){ manager=new SaneDeviceManager(); } } } /* [1] SANE Standard Version 1.03 (Scanner Access Now Easy) 2002-10-10 http://www.sane-project.org */