001 /** 002 * 003 * Copyright 2003-2006 The Apache Software Foundation 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.geronimo.mail.util; 019 020 import java.io.IOException; 021 import java.io.OutputStream; 022 import java.io.FilterOutputStream; 023 024 /** 025 * An implementation of a FilterOutputStream that encodes the 026 * stream data in Q-P encoding format. This version does the 027 * encoding "on the fly" rather than encoding a single block of 028 * data. Since this version is intended for use by the MimeUtilty class, 029 * it also handles line breaks in the encoded data. 030 */ 031 public class QuotedPrintableEncoderStream extends FilterOutputStream { 032 // our hex encoder utility class. 033 protected QuotedPrintableEncoder encoder; 034 035 // our default for line breaks 036 protected static final int DEFAULT_LINEBREAK = 76; 037 038 // the instance line break value 039 protected int lineBreak; 040 041 /** 042 * Create a Base64 encoder stream that wraps a specifed stream 043 * using the default line break size. 044 * 045 * @param out The wrapped output stream. 046 */ 047 public QuotedPrintableEncoderStream(OutputStream out) { 048 this(out, DEFAULT_LINEBREAK); 049 } 050 051 052 public QuotedPrintableEncoderStream(OutputStream out, int lineBreak) { 053 super(out); 054 // lines are processed only in multiple of 4, so round this down. 055 this.lineBreak = (lineBreak / 4) * 4 ; 056 057 // create an encoder configured to this amount 058 encoder = new QuotedPrintableEncoder(out, this.lineBreak); 059 } 060 061 062 public void write(int ch) throws IOException { 063 // have the encoder do the heavy lifting here. 064 encoder.encode(ch); 065 } 066 067 public void write(byte [] data) throws IOException { 068 write(data, 0, data.length); 069 } 070 071 public void write(byte [] data, int offset, int length) throws IOException { 072 // the encoder does the heavy lifting here. 073 encoder.encode(data, offset, length); 074 } 075 076 public void close() throws IOException { 077 out.close(); 078 } 079 080 public void flush() throws IOException { 081 out.flush(); 082 } 083 } 084 085