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.OutputStream;
025
026 /**
027 * Encoder for RFC1891 xtext.
028 *
029 * xtext strings are defined as
030 *
031 * xtext = *( xchar / hexchar )
032 *
033 * where
034 *
035 * xchar is any ASCII character in the range 33-126, EXCEPT
036 * the characters "+" and "=".
037 *
038 * hexchar is an ASCII "+" followed by two upper case
039 * hexadecimal digits.
040 */
041 public class XText
042 {
043 private static final Encoder encoder = new XTextEncoder();
044
045 /**
046 * encode the input data producing an xtext encoded byte array.
047 *
048 * @return a byte array containing the xtext encoded data.
049 */
050 public static byte[] encode(
051 byte[] data)
052 {
053 return encode(data, 0, data.length);
054 }
055
056 /**
057 * encode the input data producing an xtext encoded byte array.
058 *
059 * @return a byte array containing the xtext encoded data.
060 */
061 public static byte[] encode(
062 byte[] data,
063 int off,
064 int length)
065 {
066 ByteArrayOutputStream bOut = new ByteArrayOutputStream();
067
068 try
069 {
070 encoder.encode(data, off, length, bOut);
071 }
072 catch (IOException e)
073 {
074 throw new RuntimeException("exception encoding xtext string: " + e);
075 }
076
077 return bOut.toByteArray();
078 }
079
080 /**
081 * xtext encode the byte data writing it to the given output stream.
082 *
083 * @return the number of bytes produced.
084 */
085 public static int encode(
086 byte[] data,
087 OutputStream out)
088 throws IOException
089 {
090 return encoder.encode(data, 0, data.length, out);
091 }
092
093 /**
094 * extext encode the byte data writing it to the given output stream.
095 *
096 * @return the number of bytes produced.
097 */
098 public static int encode(
099 byte[] data,
100 int off,
101 int length,
102 OutputStream out)
103 throws IOException
104 {
105 return encoder.encode(data, 0, data.length, out);
106 }
107
108 /**
109 * decode the xtext encoded input data. It is assumed the input data is valid.
110 *
111 * @return a byte array representing the decoded data.
112 */
113 public static byte[] decode(
114 byte[] data)
115 {
116 ByteArrayOutputStream bOut = new ByteArrayOutputStream();
117
118 try
119 {
120 encoder.decode(data, 0, data.length, bOut);
121 }
122 catch (IOException e)
123 {
124 throw new RuntimeException("exception decoding xtext string: " + e);
125 }
126
127 return bOut.toByteArray();
128 }
129
130 /**
131 * decode the xtext encoded String data - whitespace will be ignored.
132 *
133 * @return a byte array representing the decoded data.
134 */
135 public static byte[] decode(
136 String data)
137 {
138 ByteArrayOutputStream bOut = new ByteArrayOutputStream();
139
140 try
141 {
142 encoder.decode(data, bOut);
143 }
144 catch (IOException e)
145 {
146 throw new RuntimeException("exception decoding xtext string: " + e);
147 }
148
149 return bOut.toByteArray();
150 }
151
152 /**
153 * decode the xtext encoded String data writing it to the given output stream,
154 * whitespace characters will be ignored.
155 *
156 * @return the number of bytes produced.
157 */
158 public static int decode(
159 String data,
160 OutputStream out)
161 throws IOException
162 {
163 return encoder.decode(data, out);
164 }
165 }
166