package com.fsck.k9.mail.filter; import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; public class EOLConvertingOutputStream extends FilterOutputStream { private static final int CR = '\r'; private static final int LF = '\n'; private int lastByte; private boolean ignoreLf = false; public EOLConvertingOutputStream(OutputStream out) { super(out); } @Override public void write(int oneByte) throws IOException { if (oneByte == LF && ignoreLf) { ignoreLf = false; return; } if (oneByte == LF && lastByte != CR) { writeByte(CR); } else if (oneByte != LF && lastByte == CR) { writeByte(LF); } writeByte(oneByte); ignoreLf = false; } @Override public void flush() throws IOException { completeCrLf(); super.flush(); } public void endWithCrLfAndFlush() throws IOException { completeCrLf(); if (lastByte != LF) { writeByte(CR); writeByte(LF); } super.flush(); } private void completeCrLf() throws IOException { if (lastByte == CR) { writeByte(LF); // We have to ignore the next character if it is <LF>. Otherwise it // will be expanded to an additional <CR><LF> sequence although it // belongs to the one just completed. ignoreLf = true; } } private void writeByte(int oneByte) throws IOException { super.write(oneByte); lastByte = oneByte; } }