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