package uk.co.mmscomputing.device.printmonitor;
import java.io.*;
abstract public class PMOutputStream extends FilterOutputStream{
private String cmd; // buffer for current command sent by printer driver
private int count; // count of scan line data still to come
protected int pagewidth=0; // physical page width
protected int pageheight=0; // physical page height
protected int graphicsxres=0;
protected int graphicsyres=0;
protected int numofdatabytes=0; // number of data send in one block
// print driver sends only one scanline per block
// =>(numofdatabytes*8<=pagewidth)has to be true
public PMOutputStream(OutputStream out){
super(out);cmd="";count=0;
}
abstract protected void startDoc()throws IOException;
abstract protected void startPage()throws IOException;
protected void sendBlockData()throws IOException{
count=numofdatabytes; // what follows now is 'numofdatabytes' of image data
}
abstract protected void writeDataByte(int code)throws IOException;
protected void endBlockData()throws IOException{
int len=pagewidth>>3;
for(int i=numofdatabytes;i<len;i++){writeDataByte(0x00);}
}
abstract protected void endPage()throws IOException;
abstract protected void endJob()throws IOException;
private int getValue(String cmd){
try{
String[] strs=cmd.split("=");
return Integer.parseInt(strs[1]);
}catch(Exception e){
System.err.println(getClass().getName()+".getValue:\n\t"+e);
return -1;
}
}
private void processCmd(String cmd)throws IOException{
if(cmd.startsWith("StartDoc")){ // StartDoc
startDoc();
}else if(cmd.startsWith("PhysPaperWidth")){
pagewidth=getValue(cmd); // System.out.println("Page Width "+pagewidth);
}else if(cmd.startsWith("PhysPaperLength")){
pageheight=getValue(cmd); // System.out.println("Page Height "+pageheight);
}else if(cmd.startsWith("GraphicsXRes")){
graphicsxres=getValue(cmd); // System.out.println("X-Resolution in dpi "+graphicsxres);
}else if(cmd.startsWith("GraphicsYRes")){
graphicsyres=getValue(cmd); // System.out.println("Y-Resolution in dpi "+graphicsyres);
}else if(cmd.startsWith("StartPage")){ // StartPage
startPage();
}else if(cmd.startsWith("NumOfDataBytes")){
numofdatabytes=getValue(cmd); // number of bytes to expect in next scan line
if((numofdatabytes<<3)>pagewidth){
System.err.println("Number of data bytes ["+numofdatabytes+"*8] is greater than pagewidth ["+pagewidth+"]");
}
}else if(cmd.startsWith("SendBlockData")){
sendBlockData();
}else if(cmd.startsWith("EndBlockData")){
endBlockData();
}else if(cmd.startsWith("EndPage")){ // EndPage
endPage();
}else if(cmd.startsWith("EndJob")){ // EndJob
endJob();
}
}
protected void addCmdChar(int code)throws IOException{
code&=0x00FF; // otherwise have printer commands
if(code==';'){
processCmd(cmd);cmd=""; // System.out.println(new String(cmd.getBytes()));
}else{
cmd+=(char)code;
}
}
public void write(int code)throws IOException{
if(count>0){ // if have data bytes write image data
if(count<=(pagewidth>>3)){ // if we have more bytes per line than space then skip first bytes of data
writeDataByte(code);
}
count--;
}else{
addCmdChar(code);
}
}
}