in mail-archive/james-wrapper/src/main/java/org/apache/james/mime4j/mboxiterator/MboxIterator.java [140:185]
public CharBufferWrapper next() {
final CharBuffer message;
fromLineFound = fromLineMathcer.find();
if (fromLineFound) {
message = mboxCharBuffer.slice();
message.position(findEnd + 1);
saveFindPositions(fromLineMathcer);
message.limit(fromLineMathcer.start());
} else {
/* We didn't find other From_ lines this means either:
* - we reached end of mbox and no more messages
* - we reached end of CharBuffer and need to decode another batch.
*/
if (byteBuffer.hasRemaining()) {
// decode another batch, but remember to copy the remaining chars first
CharBuffer oldData = mboxCharBuffer.duplicate();
mboxCharBuffer.clear();
oldData.position(findStart);
while (oldData.hasRemaining()) {
mboxCharBuffer.put(oldData.get());
}
try {
decodeNextCharBuffer();
} catch (CharConversionException ex) {
throw new RuntimeException(ex);
}
fromLineMathcer = MESSAGE_START.matcher(mboxCharBuffer);
fromLineFound = fromLineMathcer.find();
if (fromLineFound) {
saveFindPositions(fromLineMathcer);
}
message = mboxCharBuffer.slice();
message.position(fromLineMathcer.end() + 1);
fromLineFound = fromLineMathcer.find();
if (fromLineFound) {
saveFindPositions(fromLineMathcer);
message.limit(fromLineMathcer.start());
}
} else {
message = mboxCharBuffer.slice();
message.position(findEnd + 1);
message.limit(message.capacity());
}
}
return new CharBufferWrapper(message);
}