1 package com.quadcap.io; 2 3 40 41 import java.io.*; 42 43 import com.quadcap.util.Debug; 44 import com.quadcap.util.Util; 45 46 51 52 public class DotStuffOutputStream extends OutputStream { 53 OutputStream out; 54 55 static final int INIT = 0; 56 static final int SEENCR = 1; 57 static final int SEENLF = 2; 58 59 static final byte CR = (byte)'\r'; 60 static final byte LF = (byte)'\n'; 61 62 static final byte[] endTag = { CR, LF, (byte)'.', CR, LF }; 63 64 int state = SEENLF; 65 66 public DotStuffOutputStream(OutputStream os) { 67 this.out = os; 68 } 69 70 public void write(int b) throws IOException { 71 switch (state) { 72 case INIT: 73 if (b == CR) state = SEENCR; 74 break; 75 case SEENCR: 76 if (b == LF) state = SEENLF; 77 else if (b != CR) state = INIT; 78 break; 79 case SEENLF: 80 if (b == '.') { 81 out.write('.'); 82 state = INIT; 83 } else if (b == CR) { 84 state = SEENCR; 85 } else { 86 state = INIT; 87 } 88 break; 89 } 90 out.write(b); 91 } 92 93 public void write(byte[] buf, int offset, int len) throws IOException { 94 for (int i = 0; i < len; i++) { 95 this.write(buf[i]); 96 } 97 } 98 99 public void writeFinal() throws IOException { 100 int start = 0; 101 int cnt = endTag.length - start; 102 out.write(endTag, start, cnt); 103 out.flush(); 104 } 105 } 106 | Popular Tags |