package uk.co.mmscomputing.device.twain;
import java.util.Enumeration;
import java.util.Vector;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import java.util.Iterator;
import javax.imageio.*;
import javax.imageio.stream.*;
import uk.co.mmscomputing.device.scanner.*;
public class TwainScanner extends Scanner implements TwainConstants{
public TwainScanner(){
metadata=new TwainIOMetadata();
// jtwain.setScanner(this);
}
// call native routine; TwainScanner -> jtwain.class -> jtwain.dll
public void select()throws ScannerIOException{ // select twain source
jtwain.select(this);
}
public TwainIdentity[] getIdentities(){
Vector<TwainIdentity> identities=new Vector<TwainIdentity>();
try{
jtwain.getIdentities(this,identities);
}catch(Exception e){
metadata.setException(e);
fireListenerUpdate(metadata.EXCEPTION);
}
return identities.toArray(new TwainIdentity[identities.size()]);
}
public String[] getDeviceNames()throws ScannerIOException{
Vector identities=new Vector();
jtwain.getIdentities(this,identities);
String[] names = new String[identities.size()];
Enumeration ids = identities.elements();
for(int i=0;ids.hasMoreElements();i++){
TwainIdentity id = (TwainIdentity)ids.nextElement();
names[i]= id.getProductName();
}
return names;
}
public void select(String name)throws ScannerIOException{ // select twain source
jtwain.select(this,name);
}
public String getSelectedDeviceName()throws ScannerIOException{
return jtwain.getSource().getProductName();
}
public void acquire()throws ScannerIOException{ // initiate scan
jtwain.acquire(this);
}
public void setCancel(boolean c)throws ScannerIOException{
jtwain.setCancel(this,c);
}
// callback function jtwain.dll -> jtwain.class -> TwainScanner.class
void setImage(BufferedImage image){ // received an image
try{
metadata.setImage(image);
fireListenerUpdate(metadata.ACQUIRED);
}catch(Exception e){
metadata.setException(e);
fireListenerUpdate(metadata.EXCEPTION);
}
}
void setImage(File file){ // received an image using file transfer
try{
metadata.setFile(file);
fireListenerUpdate(metadata.FILE);
}catch(Exception e){
metadata.setException(e);
fireListenerUpdate(metadata.EXCEPTION);
}
}
void setImageBuffer(TwainTransfer.MemoryTransfer.Info info){
// System.out.println(info.toString());
try{
((TwainIOMetadata)metadata).setMemory(info);
fireListenerUpdate(metadata.MEMORY);
}catch(Exception e){
metadata.setException(e);
fireListenerUpdate(metadata.EXCEPTION);
}
}
protected void negotiateCapabilities(TwainSource source){
// Called in jtwain when source is in state 4: negotiate capabilities
((TwainIOMetadata)metadata).setSource(source);
fireListenerUpdate(metadata.NEGOTIATE);
if(metadata.getCancel()){ // application wants us to abort scan
try{
source.close();
}catch(Exception e){
metadata.setException(e);
fireListenerUpdate(metadata.EXCEPTION);
}
}
}
void setState(TwainSource source){
metadata.setState(source.getState());
((TwainIOMetadata)metadata).setSource(source);
fireListenerUpdate(metadata.STATECHANGE);
}
void signalInfo(String msg,int val){
metadata.setInfo(msg+" [0x"+Integer.toHexString(val)+"]");
fireListenerUpdate(metadata.INFO);
}
void signalException(String msg){
Exception e=new TwainIOException(getClass().getName()+".setException:\n "+msg);
metadata.setException(e);
fireListenerUpdate(metadata.EXCEPTION);
}
public boolean isAPIInstalled(){return jtwain.isInstalled();}
public JComponent getScanGUI()throws ScannerIOException{
return getScanGUI(4);
}
public JComponent getScanGUI(int mode)throws ScannerIOException{
return new TwainPanel(this,mode);
}
// protected void finalize()throws Throwable{
// System.err.println(getClass().getName()+".finalize:");
// }
static public Scanner getDevice(){
return new TwainScanner();
}
}