Author: bago Date: Tue Jul 15 04:20:38 2008 New Revision: 676874 URL: http://svn.apache.org/viewvc?rev=676874&view=rev Log: Remove .reset() hack from the parsing stream classes tree (MIME4J-56) Patch provided by Oleg Kalnichevski.
Modified: james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferedLineReaderInputStream.java james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/LineReaderInputStream.java james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/LineReaderInputStreamAdaptor.java james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeBoundaryInputStream.java james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeEntity.java Modified: james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferedLineReaderInputStream.java URL: http://svn.apache.org/viewvc/james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferedLineReaderInputStream.java?rev=676874&r1=676873&r2=676874&view=diff ============================================================================== --- james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferedLineReaderInputStream.java (original) +++ james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferedLineReaderInputStream.java Tue Jul 15 04:20:38 2008 @@ -1,286 +1,283 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ - -package org.apache.james.mime4j; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Input buffer that can be used to search for patterns using Quick Search - * algorithm in data read from an [EMAIL PROTECTED] InputStream}. - */ -public class BufferedLineReaderInputStream extends LineReaderInputStream { - - private final byte[] buffer; - - private int bufpos; - private int buflen; - - public BufferedLineReaderInputStream(final InputStream instream, int buffersize) { - super(instream); - if (instream == null) { - throw new IllegalArgumentException("Input stream may not be null"); - } - if (buffersize <= 0) { - throw new IllegalArgumentException("Buffer size may not be negative or zero"); - } - this.buffer = new byte[buffersize]; - this.bufpos = 0; - this.buflen = 0; - } - - public int fillBuffer() throws IOException { - // compact the buffer if necessary - if (this.bufpos > 0) { - int len = this.buflen - this.bufpos; - if (len > 0) { - System.arraycopy(this.buffer, this.bufpos, this.buffer, 0, len); - } - this.bufpos = 0; - this.buflen = len; - } - int l; - int off = this.buflen; - int len = this.buffer.length - off; - l = in.read(this.buffer, off, len); - if (l == -1) { - return -1; - } else { - this.buflen = off + l; - return l; - } - } - - public boolean hasBufferedData() { - return this.bufpos < this.buflen; - } - - public int read() throws IOException { - int noRead = 0; - while (!hasBufferedData()) { - noRead = fillBuffer(); - if (noRead == -1) { - return -1; - } - } - return this.buffer[this.bufpos++] & 0xff; - } - - public int read(final byte[] b, int off, int len) throws IOException { - if (b == null) { - return 0; - } - int noRead = 0; - while (!hasBufferedData()) { - noRead = fillBuffer(); - if (noRead == -1) { - return -1; - } - } - int chunk = this.buflen - this.bufpos; - if (chunk > len) { - chunk = len; - } - System.arraycopy(this.buffer, this.bufpos, b, off, chunk); - this.bufpos += chunk; - return chunk; - } - - public int read(final byte[] b) throws IOException { - if (b == null) { - return 0; - } - return read(b, 0, b.length); - } - - public boolean markSupported() { - return false; - } - - - public int readLine(final ByteArrayBuffer linebuf) throws IOException { - if (linebuf == null) { - throw new IllegalArgumentException("Buffer may not be null"); - } - int total = 0; - boolean found = false; - int bytesRead = 0; - while (!found) { - if (!hasBufferedData()) { - bytesRead = fillBuffer(); - if (bytesRead == -1) { - break; - } - } - int i = indexOf((byte)'\n'); - int chunk; - if (i != -1) { - found = true; - chunk = i + 1 - pos(); - } else { - chunk = length(); - } - if (chunk > 0) { - linebuf.append(buf(), pos(), chunk); - skip(chunk); - total += chunk; - } - } - if (total == 0 && bytesRead == -1) { - return -1; - } else { - return total; - } - } - - /** - * Implements quick search algorithm as published by - * <p> - * SUNDAY D.M., 1990, - * A very fast substring search algorithm, - * Communications of the ACM . 33(8):132-142. - * </p> - */ - public int indexOf(final byte[] pattern, int off, int len) { - if (pattern == null) { - throw new IllegalArgumentException("Pattern may not be null"); - } - if (off < this.bufpos || len < 0 || off + len > this.buflen) { - throw new IndexOutOfBoundsException(); - } - if (len < pattern.length) { - return -1; - } - - int[] shiftTable = new int[255]; - for (int i = 0; i < shiftTable.length; i++) { - shiftTable[i] = pattern.length + 1; - } - for (int i = 0; i < pattern.length; i++) { - int x = pattern[i] & 0xff; - shiftTable[x] = pattern.length - i; - } - - int j = 0; - while (j <= len - pattern.length) { - int cur = this.bufpos + j; - boolean match = true; - for (int i = 0; i < pattern.length; i++) { - if (this.buffer[cur + i] != pattern[i]) { - match = false; - break; - } - } - if (match) { - return cur; - } - - int pos = cur + pattern.length; - if (pos >= this.buffer.length) { - break; - } - int x = this.buffer[pos] & 0xff; - j += shiftTable[x]; - } - return -1; - } - - /** - * Implements quick search algorithm as published by - * <p> - * SUNDAY D.M., 1990, - * A very fast substring search algorithm, - * Communications of the ACM . 33(8):132-142. - * </p> - */ - public int indexOf(final byte[] pattern) { - return indexOf(pattern, this.bufpos, this.buflen - this.bufpos); - } - - public int indexOf(byte b, int off, int len) { - if (off < this.bufpos || len < 0 || off + len > this.buflen) { - throw new IndexOutOfBoundsException(); - } - for (int i = off; i < off + len; i++) { - if (this.buffer[i] == b) { - return i; - } - } - return -1; - } - - public int indexOf(byte b) { - return indexOf(b, this.bufpos, this.buflen - this.bufpos); - } - - public byte charAt(int pos) { - if (pos < this.bufpos || pos > this.buflen) { - throw new IndexOutOfBoundsException(); - } - return this.buffer[pos]; - } - - public byte[] buf() { - return this.buffer; - } - - public int pos() { - return this.bufpos; - } - - public int limit() { - return this.buflen; - } - - public int length() { - return this.buflen - this.bufpos; - } - - public int skip(int n) { - int chunk = Math.min(n, this.buflen - this.bufpos); - this.bufpos += chunk; - return chunk; - } - - public void clear() { - this.bufpos = 0; - this.buflen = 0; - } - - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("[pos: "); - buffer.append(this.bufpos); - buffer.append("]"); - buffer.append("[limit: "); - buffer.append(this.buflen); - buffer.append("]"); - buffer.append("["); - for (int i = this.bufpos; i < this.buflen; i++) { - buffer.append((char) this.buffer[i]); - } - buffer.append("]"); - return buffer.toString(); - } - - public void reset() { - } - -} +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.mime4j; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Input buffer that can be used to search for patterns using Quick Search + * algorithm in data read from an [EMAIL PROTECTED] InputStream}. + */ +public class BufferedLineReaderInputStream extends LineReaderInputStream { + + private final byte[] buffer; + + private int bufpos; + private int buflen; + + public BufferedLineReaderInputStream(final InputStream instream, int buffersize) { + super(instream); + if (instream == null) { + throw new IllegalArgumentException("Input stream may not be null"); + } + if (buffersize <= 0) { + throw new IllegalArgumentException("Buffer size may not be negative or zero"); + } + this.buffer = new byte[buffersize]; + this.bufpos = 0; + this.buflen = 0; + } + + public int fillBuffer() throws IOException { + // compact the buffer if necessary + if (this.bufpos > 0) { + int len = this.buflen - this.bufpos; + if (len > 0) { + System.arraycopy(this.buffer, this.bufpos, this.buffer, 0, len); + } + this.bufpos = 0; + this.buflen = len; + } + int l; + int off = this.buflen; + int len = this.buffer.length - off; + l = in.read(this.buffer, off, len); + if (l == -1) { + return -1; + } else { + this.buflen = off + l; + return l; + } + } + + public boolean hasBufferedData() { + return this.bufpos < this.buflen; + } + + public int read() throws IOException { + int noRead = 0; + while (!hasBufferedData()) { + noRead = fillBuffer(); + if (noRead == -1) { + return -1; + } + } + return this.buffer[this.bufpos++] & 0xff; + } + + public int read(final byte[] b, int off, int len) throws IOException { + if (b == null) { + return 0; + } + int noRead = 0; + while (!hasBufferedData()) { + noRead = fillBuffer(); + if (noRead == -1) { + return -1; + } + } + int chunk = this.buflen - this.bufpos; + if (chunk > len) { + chunk = len; + } + System.arraycopy(this.buffer, this.bufpos, b, off, chunk); + this.bufpos += chunk; + return chunk; + } + + public int read(final byte[] b) throws IOException { + if (b == null) { + return 0; + } + return read(b, 0, b.length); + } + + public boolean markSupported() { + return false; + } + + + public int readLine(final ByteArrayBuffer linebuf) throws IOException { + if (linebuf == null) { + throw new IllegalArgumentException("Buffer may not be null"); + } + int total = 0; + boolean found = false; + int bytesRead = 0; + while (!found) { + if (!hasBufferedData()) { + bytesRead = fillBuffer(); + if (bytesRead == -1) { + break; + } + } + int i = indexOf((byte)'\n'); + int chunk; + if (i != -1) { + found = true; + chunk = i + 1 - pos(); + } else { + chunk = length(); + } + if (chunk > 0) { + linebuf.append(buf(), pos(), chunk); + skip(chunk); + total += chunk; + } + } + if (total == 0 && bytesRead == -1) { + return -1; + } else { + return total; + } + } + + /** + * Implements quick search algorithm as published by + * <p> + * SUNDAY D.M., 1990, + * A very fast substring search algorithm, + * Communications of the ACM . 33(8):132-142. + * </p> + */ + public int indexOf(final byte[] pattern, int off, int len) { + if (pattern == null) { + throw new IllegalArgumentException("Pattern may not be null"); + } + if (off < this.bufpos || len < 0 || off + len > this.buflen) { + throw new IndexOutOfBoundsException(); + } + if (len < pattern.length) { + return -1; + } + + int[] shiftTable = new int[255]; + for (int i = 0; i < shiftTable.length; i++) { + shiftTable[i] = pattern.length + 1; + } + for (int i = 0; i < pattern.length; i++) { + int x = pattern[i] & 0xff; + shiftTable[x] = pattern.length - i; + } + + int j = 0; + while (j <= len - pattern.length) { + int cur = this.bufpos + j; + boolean match = true; + for (int i = 0; i < pattern.length; i++) { + if (this.buffer[cur + i] != pattern[i]) { + match = false; + break; + } + } + if (match) { + return cur; + } + + int pos = cur + pattern.length; + if (pos >= this.buffer.length) { + break; + } + int x = this.buffer[pos] & 0xff; + j += shiftTable[x]; + } + return -1; + } + + /** + * Implements quick search algorithm as published by + * <p> + * SUNDAY D.M., 1990, + * A very fast substring search algorithm, + * Communications of the ACM . 33(8):132-142. + * </p> + */ + public int indexOf(final byte[] pattern) { + return indexOf(pattern, this.bufpos, this.buflen - this.bufpos); + } + + public int indexOf(byte b, int off, int len) { + if (off < this.bufpos || len < 0 || off + len > this.buflen) { + throw new IndexOutOfBoundsException(); + } + for (int i = off; i < off + len; i++) { + if (this.buffer[i] == b) { + return i; + } + } + return -1; + } + + public int indexOf(byte b) { + return indexOf(b, this.bufpos, this.buflen - this.bufpos); + } + + public byte charAt(int pos) { + if (pos < this.bufpos || pos > this.buflen) { + throw new IndexOutOfBoundsException(); + } + return this.buffer[pos]; + } + + public byte[] buf() { + return this.buffer; + } + + public int pos() { + return this.bufpos; + } + + public int limit() { + return this.buflen; + } + + public int length() { + return this.buflen - this.bufpos; + } + + public int skip(int n) { + int chunk = Math.min(n, this.buflen - this.bufpos); + this.bufpos += chunk; + return chunk; + } + + public void clear() { + this.bufpos = 0; + this.buflen = 0; + } + + public String toString() { + StringBuffer buffer = new StringBuffer(); + buffer.append("[pos: "); + buffer.append(this.bufpos); + buffer.append("]"); + buffer.append("[limit: "); + buffer.append(this.buflen); + buffer.append("]"); + buffer.append("["); + for (int i = this.bufpos; i < this.buflen; i++) { + buffer.append((char) this.buffer[i]); + } + buffer.append("]"); + return buffer.toString(); + } + +} Modified: james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/LineReaderInputStream.java URL: http://svn.apache.org/viewvc/james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/LineReaderInputStream.java?rev=676874&r1=676873&r2=676874&view=diff ============================================================================== --- james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/LineReaderInputStream.java (original) +++ james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/LineReaderInputStream.java Tue Jul 15 04:20:38 2008 @@ -43,9 +43,4 @@ */ public abstract int readLine(final ByteArrayBuffer dst) throws IOException; - /** - * Resets the internal state. - */ - public abstract void reset(); - } Modified: james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/LineReaderInputStreamAdaptor.java URL: http://svn.apache.org/viewvc/james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/LineReaderInputStreamAdaptor.java?rev=676874&r1=676873&r2=676874&view=diff ============================================================================== --- james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/LineReaderInputStreamAdaptor.java (original) +++ james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/LineReaderInputStreamAdaptor.java Tue Jul 15 04:20:38 2008 @@ -1,104 +1,98 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ - -package org.apache.james.mime4j; - -import java.io.IOException; -import java.io.InputStream; - -/** - * <code>InputStream</code> used by the MIME parser to detect whether the - * underlying data stream was used (read from) and whether the end of the - * stream was reached. - * - * @version $Id$ - */ -class LineReaderInputStreamAdaptor extends LineReaderInputStream { - - private final LineReaderInputStream bis; - private boolean used = false; - private boolean eof = false; - - public LineReaderInputStreamAdaptor(final InputStream is) { - super(is); - if (is instanceof LineReaderInputStream) { - this.bis = (LineReaderInputStream) is; - } else { - this.bis = null; - } - } - - public int read() throws IOException { - int i = in.read(); - this.eof = i == -1; - this.used = true; - return i; - } - - public int read(byte[] b, int off, int len) throws IOException { - int i = in.read(b, off, len); - this.eof = i == -1; - this.used = true; - return i; - } - - public int readLine(final ByteArrayBuffer dst) throws IOException { - int i; - if (this.bis != null) { - i = this.bis.readLine(dst); - } else { - i = doReadLine(dst); - } - this.eof = i == -1; - this.used = true; - return i; - } - - private int doReadLine(final ByteArrayBuffer dst) throws IOException { - int total = 0; - int ch; - while ((ch = in.read()) != -1) { - dst.append(ch); - total++; - if (ch == '\n') { - break; - } - } - if (total == 0 && ch == -1) { - return -1; - } else { - return total; - } - } - - public boolean eof() { - return this.eof; - } - - public boolean isUsed() { - return this.used; - } - - public void reset() { - if (this.bis != null) { - this.bis.reset(); - } - } - -} +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.mime4j; + +import java.io.IOException; +import java.io.InputStream; + +/** + * <code>InputStream</code> used by the MIME parser to detect whether the + * underlying data stream was used (read from) and whether the end of the + * stream was reached. + * + * @version $Id$ + */ +class LineReaderInputStreamAdaptor extends LineReaderInputStream { + + private final LineReaderInputStream bis; + private boolean used = false; + private boolean eof = false; + + public LineReaderInputStreamAdaptor(final InputStream is) { + super(is); + if (is instanceof LineReaderInputStream) { + this.bis = (LineReaderInputStream) is; + } else { + this.bis = null; + } + } + + public int read() throws IOException { + int i = in.read(); + this.eof = i == -1; + this.used = true; + return i; + } + + public int read(byte[] b, int off, int len) throws IOException { + int i = in.read(b, off, len); + this.eof = i == -1; + this.used = true; + return i; + } + + public int readLine(final ByteArrayBuffer dst) throws IOException { + int i; + if (this.bis != null) { + i = this.bis.readLine(dst); + } else { + i = doReadLine(dst); + } + this.eof = i == -1; + this.used = true; + return i; + } + + private int doReadLine(final ByteArrayBuffer dst) throws IOException { + int total = 0; + int ch; + while ((ch = in.read()) != -1) { + dst.append(ch); + total++; + if (ch == '\n') { + break; + } + } + if (total == 0 && ch == -1) { + return -1; + } else { + return total; + } + } + + public boolean eof() { + return this.eof; + } + + public boolean isUsed() { + return this.used; + } + +} Modified: james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeBoundaryInputStream.java URL: http://svn.apache.org/viewvc/james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeBoundaryInputStream.java?rev=676874&r1=676873&r2=676874&view=diff ============================================================================== --- james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeBoundaryInputStream.java (original) +++ james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeBoundaryInputStream.java Tue Jul 15 04:20:38 2008 @@ -23,51 +23,51 @@ /** * Stream that constrains itself to a single MIME body part. - * After the stream ends (i.e. read() returns -1) [EMAIL PROTECTED] #isLastPart()} + * After the stream ends (i.e. read() returns -1) [EMAIL PROTECTED] #isLastPart()} * can be used to determine if a final boundary has been seen or not. * * @version $Id: MimeBoundaryInputStream.java,v 1.2 2004/11/29 13:15:42 ntherning Exp $ */ public class MimeBoundaryInputStream extends LineReaderInputStream { - + private final byte[] boundary; private boolean eof; - private int limit; - private boolean atBoundary; - private int boundaryLen; - private boolean lastPart; + private int limit; + private boolean atBoundary; + private int boundaryLen; + private boolean lastPart; private boolean completed; - private BufferedLineReaderInputStream buffer; + private BufferedLineReaderInputStream buffer; /** * Creates a new MimeBoundaryInputStream. * @param s The underlying stream. * @param boundary Boundary string (not including leading hyphens). */ - public MimeBoundaryInputStream(BufferedLineReaderInputStream inbuffer, String boundary) + public MimeBoundaryInputStream(BufferedLineReaderInputStream inbuffer, String boundary) throws IOException { super(inbuffer); this.buffer = (BufferedLineReaderInputStream) in; - this.eof = false; - this.limit = -1; - this.atBoundary = false; - this.boundaryLen = 0; - this.lastPart = false; + this.eof = false; + this.limit = -1; + this.atBoundary = false; + this.boundaryLen = 0; + this.lastPart = false; this.completed = false; - this.boundary = new byte[boundary.length() + 2]; - this.boundary[0] = (byte) '-'; - this.boundary[1] = (byte) '-'; - for (int i = 0; i < boundary.length(); i++) { - byte ch = (byte) boundary.charAt(i); - if (ch == '\r' || ch == '\n') { - throw new IllegalArgumentException("Boundary may not contain CR or LF"); - } - this.boundary[i + 2] = ch; + this.boundary = new byte[boundary.length() + 2]; + this.boundary[0] = (byte) '-'; + this.boundary[1] = (byte) '-'; + for (int i = 0; i < boundary.length(); i++) { + byte ch = (byte) boundary.charAt(i); + if (ch == '\r' || ch == '\n') { + throw new IllegalArgumentException("Boundary may not contain CR or LF"); + } + this.boundary[i + 2] = ch; } - fillBuffer(); + fillBuffer(); } /** @@ -79,59 +79,50 @@ } /** - * @see java.io.InputStream#markSupported() + * @see java.io.InputStream#markSupported() */ - public boolean markSupported() { - return false; + public boolean markSupported() { + return false; } /** - * @see java.io.InputStream#read() + * @see java.io.InputStream#read() */ - public int read() throws IOException { - if (completed) { - return -1; - } + public int read() throws IOException { + if (completed) { + return -1; + } if (endOfStream() && !hasData()) { - skipBoundary(); - return -1; - } - for (;;) { - if (hasData()) { - return buffer.read(); - } else if (endOfStream()) { - skipBoundary(); - return -1; - } - fillBuffer(); - } + skipBoundary(); + return -1; + } + for (;;) { + if (hasData()) { + return buffer.read(); + } else if (endOfStream()) { + skipBoundary(); + return -1; + } + fillBuffer(); + } } - public int read(byte[] b, int off, int len) throws IOException { - if (completed) { - return -1; - } - if (endOfStream() && !hasData()) { - skipBoundary(); - return -1; - } - fillBuffer(); - if (!hasData()) { - return read(b, off, len); - } - int chunk = Math.min(len, limit - buffer.pos()); - return buffer.read(b, off, chunk); - } - - /** - * Resets the internal state. This will force the boundary to be rescanned. - */ - public void reset() { - atBoundary = false; - limit = -1; - eof = false; + public int read(byte[] b, int off, int len) throws IOException { + if (completed) { + return -1; + } + if (endOfStream() && !hasData()) { + skipBoundary(); + return -1; + } + fillBuffer(); + if (!hasData()) { + return read(b, off, len); + } + int chunk = Math.min(len, limit - buffer.pos()); + return buffer.read(b, off, chunk); } - + public int readLine(final ByteArrayBuffer dst) throws IOException { if (dst == null) { throw new IllegalArgumentException("Destination buffer may not be null"); @@ -177,83 +168,83 @@ return total; } } - - private boolean endOfStream() { - return eof || atBoundary; + + private boolean endOfStream() { + return eof || atBoundary; + } + + private boolean hasData() { + return limit > buffer.pos() && limit <= buffer.limit(); } - private boolean hasData() { - return limit > buffer.pos() && limit <= buffer.limit(); - } - private int fillBuffer() throws IOException { if (eof) { return -1; } - int bytesRead; + int bytesRead; if (!hasData()) { - bytesRead = buffer.fillBuffer(); - } else { - bytesRead = 0; - } - eof = bytesRead == -1; + bytesRead = buffer.fillBuffer(); + } else { + bytesRead = 0; + } + eof = bytesRead == -1; - int i = buffer.indexOf(boundary); - if (i != -1) { - limit = i; - atBoundary = true; - calculateBoundaryLen(); - } else { - if (eof) { - limit = buffer.limit(); - } else { - limit = buffer.limit() - (boundary.length + 1); - // \r\n + (boundary - one char) + int i = buffer.indexOf(boundary); + if (i != -1) { + limit = i; + atBoundary = true; + calculateBoundaryLen(); + } else { + if (eof) { + limit = buffer.limit(); + } else { + limit = buffer.limit() - (boundary.length + 1); + // \r\n + (boundary - one char) } } - return bytesRead; - } - - private void calculateBoundaryLen() throws IOException { - boundaryLen = boundary.length; - int len = limit - buffer.pos(); - if (len > 0) { - if (buffer.charAt(limit - 1) == '\n') { - boundaryLen++; - limit--; + return bytesRead; + } + + private void calculateBoundaryLen() throws IOException { + boundaryLen = boundary.length; + int len = limit - buffer.pos(); + if (len > 0) { + if (buffer.charAt(limit - 1) == '\n') { + boundaryLen++; + limit--; } } - if (len > 1) { - if (buffer.charAt(limit - 1) == '\r') { - boundaryLen++; - limit--; - } + if (len > 1) { + if (buffer.charAt(limit - 1) == '\r') { + boundaryLen++; + limit--; + } } } private void skipBoundary() throws IOException { - if (!completed) { - completed = true; - buffer.skip(boundaryLen); + if (!completed) { + completed = true; + buffer.skip(boundaryLen); for (;;) { - if (buffer.length() > 1) { - int ch1 = buffer.charAt(buffer.pos()); - int ch2 = buffer.charAt(buffer.pos() + 1); + if (buffer.length() > 1) { + int ch1 = buffer.charAt(buffer.pos()); + int ch2 = buffer.charAt(buffer.pos() + 1); if (ch1 == '-' && ch2 == '-') { - this.lastPart = true; - buffer.skip(2); + this.lastPart = true; + buffer.skip(2); } skipLineDelimiter(); - break; - } else { - fillBuffer(); + break; + } else { + fillBuffer(); } - if (eof) { - break; + if (eof) { + break; } } } - } + } private void skipLineDelimiter() { int ch1 = 0; @@ -271,13 +262,13 @@ buffer.skip(1); } } - - public boolean isLastPart() { - return lastPart; - } - - public boolean eof() { - return eof && !buffer.hasBufferedData(); + + public boolean isLastPart() { + return lastPart; + } + + public boolean eof() { + return eof && !buffer.hasBufferedData(); } public String toString() { Modified: james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeEntity.java URL: http://svn.apache.org/viewvc/james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeEntity.java?rev=676874&r1=676873&r2=676874&view=diff ============================================================================== --- james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeEntity.java (original) +++ james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeEntity.java Tue Jul 15 04:20:38 2008 @@ -168,9 +168,6 @@ mimeStream = new MimeBoundaryInputStream(inbuffer, body.getBoundary()); } dataStream = new LineReaderInputStreamAdaptor(mimeStream); - // If multipart message is embedded into another multipart message - // make sure to reset parent's mime stream - inbuffer.reset(); } private void clearMimeStream() { --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]