1069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/*
2069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Copyright 2001-2004 The Apache Software Foundation.
3069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
4069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * you may not use this file except in compliance with the License.
6069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * You may obtain a copy of the License at
7069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
8069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
10069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * See the License for the specific language governing permissions and
14069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * limitations under the License.
15069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */
16069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
17069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpackage org.apache.commons.codec.net;
18069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
19069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.io.UnsupportedEncodingException;
20069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.BitSet;
21069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
22069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.DecoderException;
23069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.EncoderException;
24069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.StringDecoder;
25069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.StringEncoder;
26069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
27069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/**
28069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <p>
29069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Similar to the Quoted-Printable content-transfer-encoding defined in <a
30069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * href="http://www.ietf.org/rfc/rfc1521.txt">RFC 1521</a> and designed to allow text containing mostly ASCII
31069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * characters to be decipherable on an ASCII terminal without decoding.
32069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * </p>
33069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
34069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <p>
35069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <a href="http://www.ietf.org/rfc/rfc1522.txt">RFC 1522</a> describes techniques to allow the encoding of non-ASCII
36069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * text in various portions of a RFC 822 [2] message header, in a manner which is unlikely to confuse existing message
37069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * handling software.
38069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * </p>
39069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
40069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @see <a href="http://www.ietf.org/rfc/rfc1522.txt">MIME (Multipurpose Internet Mail Extensions) Part Two: Message
41069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *          Header Extensions for Non-ASCII Text</a>
42069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
43069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @author Apache Software Foundation
44069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @since 1.3
45069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @version $Id: QCodec.java,v 1.6 2004/05/24 00:24:32 ggregory Exp $
46d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath *
47d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath * @deprecated Please use {@link java.net.URL#openConnection} instead.
48d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath *     Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
49d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath *     for further details.
50069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */
51d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath@Deprecated
52069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpublic class QCodec extends RFC1522Codec implements StringEncoder, StringDecoder {
53069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
54069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * The default charset used for string decoding and encoding.
55069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
56069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private String charset = StringEncodings.UTF8;
57069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
58069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
59069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * BitSet of printable characters as defined in RFC 1522.
60069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
61069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private static final BitSet PRINTABLE_CHARS = new BitSet(256);
62069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    // Static initializer for printable chars collection
63069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    static {
64069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // alpha characters
65069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set(' ');
66069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('!');
67069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('"');
68069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('#');
69069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('$');
70069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('%');
71069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('&');
72069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('\'');
73069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('(');
74069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set(')');
75069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('*');
76069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('+');
77069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set(',');
78069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('-');
79069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('.');
80069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('/');
81069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = '0'; i <= '9'; i++) {
82069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            PRINTABLE_CHARS.set(i);
83069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
84069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set(':');
85069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set(';');
86069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('<');
87069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('>');
88069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('@');
89069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = 'A'; i <= 'Z'; i++) {
90069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            PRINTABLE_CHARS.set(i);
91069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
92069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('[');
93069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('\\');
94069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set(']');
95069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('^');
96069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('`');
97069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = 'a'; i <= 'z'; i++) {
98069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            PRINTABLE_CHARS.set(i);
99069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
100069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('{');
101069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('|');
102069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('}');
103069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        PRINTABLE_CHARS.set('~');
104069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
105069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
106069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private static byte BLANK = 32;
107069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
108069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private static byte UNDERSCORE = 95;
109069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
110069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private boolean encodeBlanks = false;
111069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
112069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
113069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Default constructor.
114069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
115069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public QCodec() {
116069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        super();
117069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
118069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
119069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
120069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Constructor which allows for the selection of a default charset
121069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
122069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param charset
123069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                  the default string charset to use.
124069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
125069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see <a href="http://java.sun.com/j2se/1.3/docs/api/java/lang/package-summary.html#charenc">JRE character
126069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *          encoding names</a>
127069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
128069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public QCodec(final String charset) {
129069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        super();
130069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.charset = charset;
131069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
132069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
133069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    protected String getEncoding() {
134069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return "Q";
135069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
136069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
137069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    protected byte[] doEncoding(byte[] bytes) throws EncoderException {
138069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (bytes == null) {
139069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
140069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
141069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        byte[] data = QuotedPrintableCodec.encodeQuotedPrintable(PRINTABLE_CHARS, bytes);
142069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (this.encodeBlanks) {
143069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            for (int i = 0; i < data.length; i++) {
144069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                if (data[i] == BLANK) {
145069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    data[i] = UNDERSCORE;
146069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                }
147069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
148069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
149069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return data;
150069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
151069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
152069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    protected byte[] doDecoding(byte[] bytes) throws DecoderException {
153069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (bytes == null) {
154069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
155069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
156069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        boolean hasUnderscores = false;
157069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = 0; i < bytes.length; i++) {
158069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            if (bytes[i] == UNDERSCORE) {
159069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                hasUnderscores = true;
160069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                break;
161069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
162069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
163069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (hasUnderscores) {
164069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            byte[] tmp = new byte[bytes.length];
165069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            for (int i = 0; i < bytes.length; i++) {
166069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                byte b = bytes[i];
167069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                if (b != UNDERSCORE) {
168069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    tmp[i] = b;
169069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                } else {
170069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    tmp[i] = BLANK;
171069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                }
172069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
173069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return QuotedPrintableCodec.decodeQuotedPrintable(tmp);
174069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
175069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return QuotedPrintableCodec.decodeQuotedPrintable(bytes);
176069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
177069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
178069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
179069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Encodes a string into its quoted-printable form using the specified charset. Unsafe characters are escaped.
180069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
181069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param pString
182069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                  string to convert to quoted-printable form
183069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param charset
184069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                  the charset for pString
185069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return quoted-printable string
186069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
187069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws EncoderException
188069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                  thrown if a failure condition is encountered during the encoding process.
189069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
190069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String encode(final String pString, final String charset) throws EncoderException {
191069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (pString == null) {
192069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
193069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
194069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        try {
195069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return encodeText(pString, charset);
196069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } catch (UnsupportedEncodingException e) {
197069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new EncoderException(e.getMessage());
198069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
199069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
200069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
201069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
202069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Encodes a string into its quoted-printable form using the default charset. Unsafe characters are escaped.
203069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
204069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param pString
205069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                  string to convert to quoted-printable form
206069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return quoted-printable string
207069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
208069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws EncoderException
209069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                  thrown if a failure condition is encountered during the encoding process.
210069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
211069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String encode(String pString) throws EncoderException {
212069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (pString == null) {
213069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
214069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
215069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return encode(pString, getDefaultCharset());
216069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
217069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
218069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
219069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Decodes a quoted-printable string into its original form. Escaped characters are converted back to their original
220069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * representation.
221069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
222069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param pString
223069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                  quoted-printable string to convert into its original form
224069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
225069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return original string
226069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
227069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws DecoderException
228069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                  A decoder exception is thrown if a failure condition is encountered during the decode process.
229069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
230069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String decode(String pString) throws DecoderException {
231069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (pString == null) {
232069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
233069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
234069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        try {
235069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return decodeText(pString);
236069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } catch (UnsupportedEncodingException e) {
237069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new DecoderException(e.getMessage());
238069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
239069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
240069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
241069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
242069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Encodes an object into its quoted-printable form using the default charset. Unsafe characters are escaped.
243069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
244069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param pObject
245069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                  object to convert to quoted-printable form
246069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return quoted-printable object
247069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
248069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws EncoderException
249069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                  thrown if a failure condition is encountered during the encoding process.
250069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
251069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public Object encode(Object pObject) throws EncoderException {
252069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (pObject == null) {
253069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
254069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if (pObject instanceof String) {
255069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return encode((String) pObject);
256069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else {
257069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new EncoderException("Objects of type "
258069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                + pObject.getClass().getName()
259069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                + " cannot be encoded using Q codec");
260069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
261069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
262069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
263069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
264069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Decodes a quoted-printable object into its original form. Escaped characters are converted back to their original
265069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * representation.
266069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
267069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param pObject
268069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                  quoted-printable object to convert into its original form
269069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
270069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return original object
271069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
272069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws DecoderException
273069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                  A decoder exception is thrown if a failure condition is encountered during the decode process.
274069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
275069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public Object decode(Object pObject) throws DecoderException {
276069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (pObject == null) {
277069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
278069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if (pObject instanceof String) {
279069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return decode((String) pObject);
280069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else {
281069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new DecoderException("Objects of type "
282069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                + pObject.getClass().getName()
283069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                + " cannot be decoded using Q codec");
284069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
285069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
286069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
287069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
288069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * The default charset used for string decoding and encoding.
289069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
290069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return the default string charset.
291069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
292069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String getDefaultCharset() {
293069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return this.charset;
294069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
295069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
296069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
297069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Tests if optional tranformation of SPACE characters is to be used
298069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
299069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return <code>true</code> if SPACE characters are to be transformed, <code>false</code> otherwise
300069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
301069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public boolean isEncodeBlanks() {
302069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return this.encodeBlanks;
303069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
304069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
305069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
306069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Defines whether optional tranformation of SPACE characters is to be used
307069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
308069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param b
309069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                  <code>true</code> if SPACE characters are to be transformed, <code>false</code> otherwise
310069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
311069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public void setEncodeBlanks(boolean b) {
312069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.encodeBlanks = b;
313069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
314069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
315