1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 20 package org.apache.geronimo.mail.util; 21 22 import java.io.IOException; 23 import java.io.OutputStream; 24 import java.io.FilterOutputStream; 25 26 /** 27 * An implementation of a FilterOutputStream that encodes the 28 * stream data in Q-P encoding format. This version does the 29 * encoding "on the fly" rather than encoding a single block of 30 * data. Since this version is intended for use by the MimeUtilty class, 31 * it also handles line breaks in the encoded data. 32 */ 33 public class QuotedPrintableEncoderStream extends FilterOutputStream { 34 // our hex encoder utility class. 35 protected QuotedPrintableEncoder encoder; 36 37 // our default for line breaks 38 protected static final int DEFAULT_LINEBREAK = 76; 39 40 // the instance line break value 41 protected int lineBreak; 42 43 /** 44 * Create a Base64 encoder stream that wraps a specifed stream 45 * using the default line break size. 46 * 47 * @param out The wrapped output stream. 48 */ 49 public QuotedPrintableEncoderStream(OutputStream out) { 50 this(out, DEFAULT_LINEBREAK); 51 } 52 53 54 public QuotedPrintableEncoderStream(OutputStream out, int lineBreak) { 55 super(out); 56 // lines are processed only in multiple of 4, so round this down. 57 this.lineBreak = (lineBreak / 4) * 4 ; 58 59 // create an encoder configured to this amount 60 encoder = new QuotedPrintableEncoder(out, this.lineBreak); 61 } 62 63 64 public void write(int ch) throws IOException { 65 // have the encoder do the heavy lifting here. 66 encoder.encode(ch); 67 } 68 69 public void write(byte [] data) throws IOException { 70 write(data, 0, data.length); 71 } 72 73 public void write(byte [] data, int offset, int length) throws IOException { 74 // the encoder does the heavy lifting here. 75 encoder.encode(data, offset, length); 76 } 77 78 public void close() throws IOException { 79 out.close(); 80 } 81 82 public void flush() throws IOException { 83 out.flush(); 84 } 85 } 86 87