001/****************************************************************
002 * Licensed to the Apache Software Foundation (ASF) under one   *
003 * or more contributor license agreements.  See the NOTICE file *
004 * distributed with this work for additional information        *
005 * regarding copyright ownership.  The ASF licenses this file   *
006 * to you under the Apache License, Version 2.0 (the            *
007 * "License"); you may not use this file except in compliance   *
008 * with the License.  You may obtain a copy of the License at   *
009 *                                                              *
010 *   http://www.apache.org/licenses/LICENSE-2.0                 *
011 *                                                              *
012 * Unless required by applicable law or agreed to in writing,   *
013 * software distributed under the License is distributed on an  *
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
015 * KIND, either express or implied.  See the License for the    *
016 * specific language governing permissions and limitations      *
017 * under the License.                                           *
018 ****************************************************************/
019
020package org.apache.james.mime4j.codec;
021
022import java.io.IOException;
023import java.io.InputStream;
024import java.io.OutputStream;
025
026/**
027 * Utility methods related to codecs.
028 */
029public class CodecUtil {
030
031    static final int DEFAULT_ENCODING_BUFFER_SIZE = 1024;
032
033    /**
034     * Copies the contents of one stream to the other.
035     * @param in not null
036     * @param out not null
037     * @throws IOException
038     */
039    public static void copy(final InputStream in, final OutputStream out) throws IOException {
040        final byte[] buffer = new byte[DEFAULT_ENCODING_BUFFER_SIZE];
041        int inputLength;
042        while (-1 != (inputLength = in.read(buffer))) {
043            out.write(buffer, 0, inputLength);
044        }
045    }
046
047    /**
048     * Encodes the given stream using Quoted-Printable.
049     * This assumes that stream is binary and therefore escapes
050     * all line endings.
051     * @param in not null
052     * @param out not null
053     * @throws IOException
054     */
055    public static void encodeQuotedPrintableBinary(final InputStream in, final OutputStream out) throws IOException {
056        QuotedPrintableOutputStream qpOut = new QuotedPrintableOutputStream(out, true);
057        copy(in, qpOut);
058        qpOut.close();
059    }
060
061    /**
062     * Encodes the given stream using Quoted-Printable.
063     * This assumes that stream is text and therefore does not escape
064     * all line endings.
065     * @param in not null
066     * @param out not null
067     * @throws IOException
068     */
069    public static void encodeQuotedPrintable(final InputStream in, final OutputStream out) throws IOException {
070        QuotedPrintableOutputStream qpOut = new QuotedPrintableOutputStream(out, false);
071        copy(in, qpOut);
072        qpOut.close();
073    }
074
075    /**
076     * Encodes the given stream using base64.
077     *
078     * @param in not null
079     * @param out not null
080     * @throws IOException if an I/O error occurs
081     */
082    public static void encodeBase64(final InputStream in, final OutputStream out) throws IOException {
083        Base64OutputStream b64Out = new Base64OutputStream(out);
084        copy(in, b64Out);
085        b64Out.close();
086    }
087
088    /**
089     * Wraps the given stream in a Quoted-Printable encoder.
090     * @param out not null
091     * @return encoding outputstream
092     * @throws IOException
093     */
094    public static OutputStream wrapQuotedPrintable(final OutputStream out, boolean binary) throws IOException {
095        return new QuotedPrintableOutputStream(out, binary);
096    }
097
098    /**
099     * Wraps the given stream in a Base64 encoder.
100     * @param out not null
101     * @return encoding outputstream
102     * @throws IOException
103     */
104    public static OutputStream wrapBase64(final OutputStream out) throws IOException {
105        return new Base64OutputStream(out);
106    }
107
108}