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
020 package org.apache.geronimo.mail.util;
021
022 import java.io.ByteArrayOutputStream;
023 import java.io.IOException;
024 import java.io.InputStream;
025 import java.io.OutputStream;
026
027 public class QuotedPrintable {
028 // NOTE: the QuotedPrintableEncoder class needs to keep some active state about what's going on with
029 // respect to line breaks and significant white spaces. This makes it difficult to keep one static
030 // instance of the decode around for reuse.
031
032
033 /**
034 * encode the input data producing a Q-P encoded byte array.
035 *
036 * @return a byte array containing the Q-P encoded data.
037 */
038 public static byte[] encode(
039 byte[] data)
040 {
041 return encode(data, 0, data.length);
042 }
043
044 /**
045 * encode the input data producing a Q-P encoded byte array.
046 *
047 * @return a byte array containing the Q-P encoded data.
048 */
049 public static byte[] encode(
050 byte[] data,
051 int off,
052 int length)
053 {
054 QuotedPrintableEncoder encoder = new QuotedPrintableEncoder();
055
056 ByteArrayOutputStream bOut = new ByteArrayOutputStream();
057
058 try
059 {
060 encoder.encode(data, off, length, bOut);
061 }
062 catch (IOException e)
063 {
064 throw new RuntimeException("exception encoding Q-P encoded string: " + e);
065 }
066
067 return bOut.toByteArray();
068 }
069
070 /**
071 * Q-P encode the byte data writing it to the given output stream.
072 *
073 * @return the number of bytes produced.
074 */
075 public static int encode(
076 byte[] data,
077 OutputStream out)
078 throws IOException
079 {
080 QuotedPrintableEncoder encoder = new QuotedPrintableEncoder();
081
082 return encoder.encode(data, 0, data.length, out);
083 }
084
085 /**
086 * Q-P encode the byte data writing it to the given output stream.
087 *
088 * @return the number of bytes produced.
089 */
090 public static int encode(
091 byte[] data,
092 int off,
093 int length,
094 OutputStream out)
095 throws IOException
096 {
097 QuotedPrintableEncoder encoder = new QuotedPrintableEncoder();
098 return encoder.encode(data, 0, data.length, out);
099 }
100
101 /**
102 * decode the Q-P encoded input data. It is assumed the input data is valid.
103 *
104 * @return a byte array representing the decoded data.
105 */
106 public static byte[] decode(
107 byte[] data)
108 {
109 ByteArrayOutputStream bOut = new ByteArrayOutputStream();
110
111 QuotedPrintableEncoder encoder = new QuotedPrintableEncoder();
112 try
113 {
114 encoder.decode(data, 0, data.length, bOut);
115 }
116 catch (IOException e)
117 {
118 throw new RuntimeException("exception decoding Q-P encoded string: " + e);
119 }
120
121 return bOut.toByteArray();
122 }
123
124 /**
125 * decode the UUEncided String data.
126 *
127 * @return a byte array representing the decoded data.
128 */
129 public static byte[] decode(
130 String data)
131 {
132 QuotedPrintableEncoder encoder = new QuotedPrintableEncoder();
133 ByteArrayOutputStream bOut = new ByteArrayOutputStream();
134
135 try
136 {
137 encoder.decode(data, bOut);
138 }
139 catch (IOException e)
140 {
141 throw new RuntimeException("exception decoding Q-P encoded string: " + e);
142 }
143
144 return bOut.toByteArray();
145 }
146
147 /**
148 * decode the Q-P encoded encoded String data writing it to the given output stream.
149 *
150 * @return the number of bytes produced.
151 */
152 public static int decode(
153 String data,
154 OutputStream out)
155 throws IOException
156 {
157 QuotedPrintableEncoder encoder = new QuotedPrintableEncoder();
158 return encoder.decode(data, out);
159 }
160
161 /**
162 * decode the base Q-P encoded String data writing it to the given output stream,
163 * whitespace characters will be ignored.
164 *
165 * @param data The array data to decode.
166 * @param out The output stream for the data.
167 *
168 * @return the number of bytes produced.
169 * @exception IOException
170 */
171 public static int decode(byte [] data, OutputStream out) throws IOException
172 {
173 QuotedPrintableEncoder encoder = new QuotedPrintableEncoder();
174 return encoder.decode(data, 0, data.length, out);
175 }
176 }
177