package uk.co.mmscomputing.device.twain;
import java.util.Enumeration;
import java.util.Vector;
public class TwainExtImageInfo implements TwainConstants{
/*
typedef struct {
TW_UINT16 InfoID;
TW_UINT16 ItemType;
TW_UINT16 NumItems;
TW_UINT16 CondCode;
TW_UINT32 Item;
}TW_INFO, FAR* pTW_INFO;
typedef struct {
TW_UINT32 NumInfos;
TW_INFO Info[1];
}TW_EXTIMAGEINFO, FAR* pTW_EXTIMAGEINFO;
*/
TwainSource source;
byte[] buf;
int[] attributes; // list of extended image info attributes
Vector extInfos;
public TwainExtImageInfo(TwainSource source,int tweiValue){
this.source=source;
attributes=new int[1];
attributes[0]=tweiValue;
initBuf();
}
public TwainExtImageInfo(TwainSource source,int[] tweiValues){
this.source=source;
attributes=tweiValues;
initBuf();
}
private void initBuf(){
int len = attributes.length;
buf=new byte[4+len*12];
jtwain.setINT32(buf,0,attributes.length);
for (int i=0,off=4;i<len;i++){
jtwain.setINT16(buf,off,attributes[i]);off+=2;
jtwain.setINT16(buf,off,0);off+=2;
jtwain.setINT16(buf,off,0);off+=2;
jtwain.setINT16(buf,off,0);off+=2;
jtwain.setINT32(buf,off,0);off+=4;
}
}
public void get()throws TwainIOException{
source.call(DG_IMAGE,DAT_EXTIMAGEINFO,MSG_GET,buf);
}
public Object getInfo()throws TwainIOException{return getInfo(attributes[0]);}
public Object getInfo(int twei)throws TwainIOException{
int i=0;
int len=attributes.length;
for(;i<len;i++){
if(attributes[i]==twei){break;}
}
if(i==len){return null;}
int off=4+i*12;
int cc =jtwain.getINT16(buf,off+6);
if(cc!=TWRC_SUCCESS){throw new TwainFailureException(cc);}
int type =jtwain.getINT16(buf,off+2);
int count =jtwain.getINT16(buf,off+4);
switch(type){
case TWTY_UINT32:
if(count==1){
return new Integer(jtwain.getINT16(buf,off+8));
}
// to do: different types
default:
System.err.println(getClass().getName()+".getInfo:\n\tDon't support type = "+type+" yet.");
}
return null;
}
public String toString(){
String s="TwainExtImageInfo\n";
int len = attributes.length;
for (int i=0,off=4;i<len;i++){
s+="InfoID = 0x"+Integer.toHexString(jtwain.getINT16(buf,off))+"\n"; off+=2;
s+="ItemType = "+jtwain.getINT16(buf,off)+"\n"; off+=2;
s+="NumItems = "+jtwain.getINT16(buf,off)+"\n"; off+=2;
s+="CondCode = "+jtwain.getINT16(buf,off)+"\n"; off+=2;
s+="Item = "+jtwain.getINT32(buf,off)+"\n"; off+=4;
}
return s;
}
}