package uk.co.mmscomputing.device.scanner;
import java.util.Vector;
import java.util.Enumeration;
import javax.swing.JComponent;
import javax.swing.JLabel;
import java.lang.reflect.*;
//import uk.co.mmscomputing.device.twain.*;
//import uk.co.mmscomputing.device.sane.*;
abstract public class Scanner{
static protected boolean installed=false;
public abstract boolean isAPIInstalled();
protected Vector<ScannerListener> listeners=new Vector<ScannerListener>(); // list of scanner event listeners
protected ScannerIOMetadata metadata=null; // information structure
protected boolean isbusy = false; // is scanner busy
public abstract void select()throws ScannerIOException;
public abstract String[] getDeviceNames()throws ScannerIOException;
public abstract void select(String name)throws ScannerIOException;
public abstract String getSelectedDeviceName()throws ScannerIOException;
public abstract void acquire()throws ScannerIOException;
public abstract void setCancel(boolean c)throws ScannerIOException;
public boolean isBusy(){ return isbusy;}
public void waitToExit(){ // convenience method, call before System.exit
try{
while(isBusy()){ // make sure program waits for scanner to finish!
Thread.currentThread().sleep(200);
}
}catch(Exception e){
e.printStackTrace();
}
}
public void addListener(ScannerListener listener){
listeners.add(listener);
}
public void removeListener(ScannerListener listener){
listeners.remove(listener);
}
public void fireExceptionUpdate(Exception e){
metadata.setException(e);
fireListenerUpdate(metadata.EXCEPTION);
}
public void fireListenerUpdate(ScannerIOMetadata.Type type){
if(type.equals(ScannerIOMetadata.STATECHANGE)){
isbusy=metadata.getDevice().isBusy();
}
for(Enumeration e = listeners.elements(); e.hasMoreElements() ;){
ScannerListener listener=(ScannerListener)e.nextElement();
listener.update(type,metadata);
}
}
public JComponent getScanGUI()throws ScannerIOException{
return new JLabel("Dummy Scanner GUI");
}
public JComponent getScanGUI(int mode)throws ScannerIOException{
return new JLabel("Dummy Scanner GUI");
}
static public Scanner getDevice(){
String osname = System.getProperty("os.name");
String cn;
if(osname.startsWith("Linux")){
cn = "uk.co.mmscomputing.device.sane.SaneScanner";
}else if(osname.startsWith("Windows")){
cn = "uk.co.mmscomputing.device.twain.TwainScanner";
// }else if(osname.startsWith("Mac")){
}else{
return null;
} // use reflection here, because allows jar files with/out
try{ // twain and/or sane files
Scanner scanner = (Scanner)Class.forName(cn).newInstance();
if(scanner.isAPIInstalled()){
/* // doesn't work unfortunately
Thread shutdown = new Thread(){
public void run(){
scanner.waitForNotBusy();
}
};
Runtime.getRuntime().addShutdownHook(shutdown);
*/
return scanner;
}
}catch(IllegalAccessException iae){
iae.printStackTrace();
}catch(InstantiationException ie){
ie.printStackTrace();
}catch(ClassNotFoundException cnfe){
cnfe.printStackTrace();
}
return null;
}
}