package uk.co.mmscomputing.device.twain;
import java.awt.geom.*;
public abstract class TwainContainer implements TwainConstants{
protected int cap;
protected int type;
TwainContainer(int cap,byte[] container){
this.cap=cap;
this.type=jtwain.getINT16(container,0);
}
TwainContainer(int cap,int type){
this.cap=cap;
this.type=type;
}
public int getCapabilityId(){return cap;}
abstract int getType();
abstract byte[] getBytes();
public int getItemType(){return type;}
abstract public Object[] getItems();
private boolean booleanValue(Object obj)throws TwainIOException{
if(obj instanceof Number){
return (((Number)obj).intValue()!=0);
}else if(obj instanceof Boolean){
return ((Boolean)obj).booleanValue();
}else if(obj instanceof String){
return Boolean.valueOf((String)obj).booleanValue();
}
throw new TwainIOException(getClass().getName()+".booleanValue:\n\tUnsupported data type: "+obj.getClass().getName());
}
private int intValue(Object obj)throws TwainIOException{
if(obj instanceof Number){
return ((Number)obj).intValue();
}else if(obj instanceof Boolean){
return ((((Boolean)obj).booleanValue())?1:0);
}else if(obj instanceof String){
String s=(String)obj;
try{
return Integer.parseInt(s);
}catch(Exception e){
throw new TwainIOException(getClass().getName()+".intValue:\n\tCannot convert string [\""+s+"\"] to int.");
}
}
throw new TwainIOException(getClass().getName()+".intValue:\n\tUnsupported data type: "+obj.getClass().getName());
}
private double doubleValue(Object obj)throws TwainIOException{
if(obj instanceof Number){
return ((Number)obj).doubleValue();
}else if(obj instanceof Boolean){
return ((((Boolean)obj).booleanValue())?1:0);
}else if(obj instanceof String){
String s=(String)obj;
try{
return Double.parseDouble(s);
}catch(Exception e){
throw new TwainIOException(getClass().getName()+".doubleValue:\n\tCannot convert string [\""+s+"\"] to double.");
}
}
throw new TwainIOException(getClass().getName()+".doubleValue:\n\tUnsupported data type: "+obj.getClass().getName());
}
// Current Value
abstract public Object getCurrentValue()throws TwainIOException;
public boolean booleanValue()throws TwainIOException{ return booleanValue(getCurrentValue());}
public int intValue()throws TwainIOException{ return intValue(getCurrentValue());}
public double doubleValue()throws TwainIOException{ return doubleValue(getCurrentValue());}
abstract public void setCurrentValue(Object v)throws TwainIOException;
public void setCurrentValue(boolean v)throws TwainIOException{ setCurrentValue(new Boolean(v));}
public void setCurrentValue(int v)throws TwainIOException{ setCurrentValue(new Integer(v));}
public void setCurrentValue(double v)throws TwainIOException{ setCurrentValue(new Double(v));}
// Default Value
abstract public Object getDefaultValue()throws TwainIOException;
public boolean booleanDefaultValue()throws TwainIOException{ return booleanValue(getDefaultValue());}
public int intDefaultValue()throws TwainIOException{ return intValue(getDefaultValue());}
public double doubleDefaultValue()throws TwainIOException{ return doubleValue(getDefaultValue());}
abstract public void setDefaultValue(Object v)throws TwainIOException;
public void setDefaultValue(boolean v)throws TwainIOException{ setDefaultValue(new Boolean(v));}
public void setDefaultValue(int v)throws TwainIOException{ setDefaultValue(new Integer(v));}
public void setDefaultValue(double v)throws TwainIOException{ setDefaultValue(new Double(v));}
// Object to byte conversion, vice versa
protected Object get32BitObjectAt(byte[] container,int index){
switch(type){
case TWTY_INT8:
case TWTY_INT16:
case TWTY_INT32: return new Integer(jtwain.getINT32(container,index));
case TWTY_UINT8: return new Integer(jtwain.getINT32(container,index)&0x000000FF);
case TWTY_UINT16: return new Integer(jtwain.getINT32(container,index)&0x0000FFFF);
case TWTY_UINT32: return new Long(((long)jtwain.getINT32(container,index))&0x00000000FFFFFFFFL);
case TWTY_BOOL: return new Boolean((jtwain.getINT32(container,index)==0)?false:true);
case TWTY_FIX32: return new Double(jtwain.getFIX32(container,index));
// only null !
case TWTY_FRAME: // ICAP_FRAMES
case TWTY_STR32:
case TWTY_STR64:
case TWTY_STR128:
case TWTY_STR255:
case TWTY_STR1024:
case TWTY_UNI512:
return new Integer(jtwain.getINT32(container,index));
default:
// System.out.println(getClass().getName()+".get32BitObjectAt:\n\tUnsupported type = "+type);
new TwainIOException(getClass().getName()+".get32BitObjectAt:\n\tUnsupported type = "+type).printStackTrace();
}
return null;
}
protected void set32BitObjectAt(byte[] container,int index,Object item){
int buf=0;
if(item instanceof Integer){
int v=((Integer)item).intValue();
if(type==TWTY_FIX32){
jtwain.setFIX32(container,index,v);
}else if(type==TWTY_BOOL){
jtwain.setINT32(container,index,(v==0)?0:1);
}else{
jtwain.setINT32(container,index,v);
}
}else if(item instanceof Double){
double v=((Double)item).doubleValue();
if(type==TWTY_FIX32){
jtwain.setFIX32(container,index,v);
}else if(type==TWTY_BOOL){
jtwain.setINT32(container,index,(v==0)?0:1);
}else{
jtwain.setINT32(container,index,(int)v);
}
}else if(item instanceof Boolean){
int v=(((Boolean)item).booleanValue())?1:0;
if(type==TWTY_FIX32){
jtwain.setFIX32(container,index,v);
}else{
jtwain.setINT32(container,index,v);
}
}else if(item instanceof String){
if(type==TWTY_FIX32){
this.set32BitObjectAt(container,index,new Double((String)item));
}else{
this.set32BitObjectAt(container,index,new Integer((String)item));
}
}else{
System.out.println(getClass().getName()+".set32BitObjectAt:\n\tUnsupported type = "+type);
}
}
protected Object getObjectAt(byte[] container,int index){
switch(type){
case TWTY_INT8: return new Integer(container[index]);
case TWTY_INT16: return new Integer(jtwain.getINT16(container,index));
case TWTY_INT32: return new Integer(jtwain.getINT32(container,index));
case TWTY_UINT8: return new Integer(container[index]&0x000000FF);
case TWTY_UINT16: return new Integer(jtwain.getINT16(container,index)&0x0000FFFF);
case TWTY_UINT32: return new Long(((long)jtwain.getINT32(container,index))&0x00000000FFFFFFFFL);
case TWTY_BOOL: return new Boolean((jtwain.getINT16(container,index)==0)?false:true);
case TWTY_FIX32: return new Double(jtwain.getFIX32(container,index));
case TWTY_FRAME:
double x=jtwain.getFIX32(container,index); // left
double y=jtwain.getFIX32(container,index+4); // top
double w=jtwain.getFIX32(container,index+8)-x; // right
double h=jtwain.getFIX32(container,index+12)-y; // bottom
return new Rectangle2D.Double(x,y,w,h);
case TWTY_STR32:
case TWTY_STR64:
case TWTY_STR128:
case TWTY_STR255:
String s="";
for(int i=0;(container[index+i]!=0)&&(i<typeSizes[type]);i++){
s+=(char)container[index+i];
}
return s;
default: System.out.println(getClass().getName()+".getObjectAt:\n\tUnsupported type = "+type);
}
return null;
}
private void set16BitObjectAt(byte[] container,int index,Object item){
if(item instanceof Number){
int v=(((Number)item).intValue());
jtwain.setINT16(container,index,v);
}else if(item instanceof Boolean){
int v=(((Boolean)item).booleanValue())?1:0;
jtwain.setINT16(container,index,v);
}else{
System.out.println("3\b"+getClass().getName()+".set16BitObjectAt:\n\tUnsupported type = "+item.getClass().getName());
}
}
protected void setObjectAt(byte[] container,int index,Object item){
switch(type){
case TWTY_INT16:
case TWTY_UINT16: set16BitObjectAt(container,index,item);break;
case TWTY_FIX32:
case TWTY_INT32:
case TWTY_UINT32: set32BitObjectAt(container,index,item);break;
default: System.out.println("3\b"+getClass().getName()+".setObjectAt:\n\tUnsupported type = "+type);
}
}
public String toString(){
String s=getClass().getName()+"\n";
s+="cap = 0x"+Integer.toHexString(cap)+"\n";
s+="type = 0x"+Integer.toHexString(type)+"\n";
return s;
}
static String[] hexs={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
static public String toString(byte[] data){
int v;
String s="\n";
int i=0;
while(i<data.length){
s+=" ";
s+=hexs[(data[i]>>4)&0x0F];
s+=hexs[(data[i] )&0x0F];
if(((i+1)%8)==0){s+="\n";}
i++;
}
if(((i+1)%8)!=0){s+="\n";}
return s;
}
}