1 17 package org.columba.mail.parser; 18 19 import java.io.FilterInputStream ; 20 import java.io.IOException ; 21 import java.io.InputStream ; 22 23 import org.columba.core.base.Barrier; 24 import org.columba.core.base.Mutex; 25 import org.columba.ristretto.io.CharSequenceSource; 26 import org.columba.ristretto.message.Header; 27 import org.columba.ristretto.parser.HeaderParser; 28 import org.columba.ristretto.parser.ParserException; 29 30 36 public class PassiveHeaderParserInputStream extends FilterInputStream { 37 38 private static final int READING = 0; 39 private static final int DONE = 1; 40 private static final String HEADER_END = "\r\n\r\n"; 41 42 43 private StringBuffer buffer; 44 private int mode; 45 private Header header; 46 47 private Mutex mutex; 48 private Barrier barrier; 49 50 55 public PassiveHeaderParserInputStream(InputStream arg0) { 56 super(arg0); 57 58 buffer = new StringBuffer (); 59 60 mutex= new Mutex(); 61 barrier = new Barrier(); 62 } 63 64 public int read() throws IOException { 65 int character = super.read(); 66 67 if( mode == READING ) { 68 if( character == -1 ) { 69 72 header = new Header(); 74 barrier.open(); 75 } else { 76 buffer.append((char)character); 77 checkHeaderReadComplete(); 78 } 79 } 80 81 return character; 82 } 83 84 private void checkHeaderReadComplete() { 85 mutex.lock(); 86 if( buffer.indexOf(HEADER_END) != -1) { 87 mode = DONE; 88 try { 89 header = HeaderParser.parse(new CharSequenceSource(buffer)); 91 } catch (ParserException e) { 92 } 94 barrier.open(); 95 buffer = null; 96 } 97 mutex.release(); 98 } 99 100 public int read(byte[] arg0, int arg1, int arg2) throws IOException { 101 int read = super.read(arg0, arg1, arg2); 102 103 if( mode == READING ) { 104 if( read == -1 ) { 105 108 header = new Header(); 110 barrier.open(); 111 } else { 112 buffer.append(new String (arg0,0,read,"US-ASCII")); 113 checkHeaderReadComplete(); 114 } 115 } 116 117 return read; 118 } 119 120 121 126 public boolean isHeaderAvailable() { 127 return mode == DONE; 128 } 129 130 135 public Header getHeader() { 136 barrier.join(); 137 138 return header; 139 } 140 } 141 | Popular Tags |