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.ByteArrayOutputStream;
20069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.io.UnsupportedEncodingException;
21069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.BitSet;
22069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
23069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.BinaryDecoder;
24069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.BinaryEncoder;
25069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.DecoderException;
26069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.EncoderException;
27069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.StringDecoder;
28069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.StringEncoder;
29069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
30069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/**
31069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <p>Implements the 'www-form-urlencoded' encoding scheme,
32069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * also misleadingly known as URL encoding.</p>
33069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
34069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <p>For more detailed information please refer to
35069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <a href="http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1">
36069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Chapter 17.13.4 'Form content types'</a> of the
37069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <a href="http://www.w3.org/TR/html4/">HTML 4.01 Specification<a></p>
38069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
39069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <p>
40069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * This codec is meant to be a replacement for standard Java classes
41069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * {@link java.net.URLEncoder} and {@link java.net.URLDecoder}
42069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * on older Java platforms, as these classes in Java versions below
43069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 1.4 rely on the platform's default charset encoding.
44069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * </p>
45069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
46069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @author Apache Software Foundation
47069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @since 1.2
48069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @version $Id: URLCodec.java,v 1.19 2004/03/29 07:59:00 ggregory Exp $
49d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath *
50d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath * @deprecated Please use {@link java.net.URL#openConnection} instead.
51d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath *     Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
52d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath *     for further details.
53069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */
54d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath@Deprecated
55069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpublic class URLCodec implements BinaryEncoder, BinaryDecoder, StringEncoder, StringDecoder {
56069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
57069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
58069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * The default charset used for string decoding and encoding.
59069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
60069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    protected String charset = StringEncodings.UTF8;
61069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
62069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    protected static byte ESCAPE_CHAR = '%';
63069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
64069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * BitSet of www-form-url safe characters.
65069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
66069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    protected static final BitSet WWW_FORM_URL = new BitSet(256);
67069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
68069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    // Static initializer for www_form_url
69069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    static {
70069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // alpha characters
71069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = 'a'; i <= 'z'; i++) {
72069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            WWW_FORM_URL.set(i);
73069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
74069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = 'A'; i <= 'Z'; i++) {
75069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            WWW_FORM_URL.set(i);
76069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
77069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // numeric characters
78069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = '0'; i <= '9'; i++) {
79069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            WWW_FORM_URL.set(i);
80069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
81069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // special chars
82069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        WWW_FORM_URL.set('-');
83069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        WWW_FORM_URL.set('_');
84069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        WWW_FORM_URL.set('.');
85069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        WWW_FORM_URL.set('*');
86069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // blank to be replaced with +
87069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        WWW_FORM_URL.set(' ');
88069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
89069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
90069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
91069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
92069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Default constructor.
93069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
94069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public URLCodec() {
95069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        super();
96069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
97069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
98069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
99069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Constructor which allows for the selection of a default charset
100069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
101069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param charset the default string charset to use.
102069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
103069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public URLCodec(String charset) {
104069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        super();
105069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.charset = charset;
106069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
107069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
108069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
109069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Encodes an array of bytes into an array of URL safe 7-bit
110069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * characters. Unsafe characters are escaped.
111069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
112069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param urlsafe bitset of characters deemed URL safe
113069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param bytes array of bytes to convert to URL safe characters
114069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return array of bytes containing URL safe characters
115069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
116069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public static final byte[] encodeUrl(BitSet urlsafe, byte[] bytes)
117069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    {
118069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (bytes == null) {
119069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
120069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
121069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (urlsafe == null) {
122069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            urlsafe = WWW_FORM_URL;
123069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
124069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
125069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
126069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = 0; i < bytes.length; i++) {
127069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            int b = bytes[i];
128069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            if (b < 0) {
129069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                b = 256 + b;
130069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
131069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            if (urlsafe.get(b)) {
132069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                if (b == ' ') {
133069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    b = '+';
134069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                }
135069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                buffer.write(b);
136069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            } else {
137069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                buffer.write('%');
138069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                char hex1 = Character.toUpperCase(
139069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                  Character.forDigit((b >> 4) & 0xF, 16));
140069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                char hex2 = Character.toUpperCase(
141069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                  Character.forDigit(b & 0xF, 16));
142069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                buffer.write(hex1);
143069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                buffer.write(hex2);
144069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
145069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
146069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return buffer.toByteArray();
147069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
148069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
149069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
150069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
151069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Decodes an array of URL safe 7-bit characters into an array of
152069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * original bytes. Escaped characters are converted back to their
153069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * original representation.
154069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
155069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param bytes array of URL safe characters
156069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return array of original bytes
157069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws DecoderException Thrown if URL decoding is unsuccessful
158069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
159069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public static final byte[] decodeUrl(byte[] bytes)
160069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project         throws DecoderException
161069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    {
162069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (bytes == null) {
163069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
164069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
165069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
166069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = 0; i < bytes.length; i++) {
167069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            int b = bytes[i];
168069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            if (b == '+') {
169069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                buffer.write(' ');
170069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            } else if (b == '%') {
171069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                try {
172069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    int u = Character.digit((char)bytes[++i], 16);
173069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    int l = Character.digit((char)bytes[++i], 16);
174069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    if (u == -1 || l == -1) {
175069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                        throw new DecoderException("Invalid URL encoding");
176069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    }
177069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    buffer.write((char)((u << 4) + l));
178069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                } catch(ArrayIndexOutOfBoundsException e) {
179069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    throw new DecoderException("Invalid URL encoding");
180069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                }
181069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            } else {
182069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                buffer.write(b);
183069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
184069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
185069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return buffer.toByteArray();
186069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
187069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
188069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
189069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
190069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Encodes an array of bytes into an array of URL safe 7-bit
191069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * characters. Unsafe characters are escaped.
192069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
193069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param bytes array of bytes to convert to URL safe characters
194069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return array of bytes containing URL safe characters
195069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
196069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public byte[] encode(byte[] bytes) {
197069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return encodeUrl(WWW_FORM_URL, bytes);
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     * Decodes an array of URL safe 7-bit characters into an array of
203069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * original bytes. Escaped characters are converted back to their
204069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * original representation.
205069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
206069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param bytes array of URL safe characters
207069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return array of original bytes
208069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws DecoderException Thrown if URL decoding is unsuccessful
209069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
210069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public byte[] decode(byte[] bytes) throws DecoderException {
211069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return decodeUrl(bytes);
212069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
213069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
214069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
215069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
216069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Encodes a string into its URL safe form using the specified
217069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * string charset. Unsafe characters are escaped.
218069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
219069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param pString string to convert to a URL safe form
220069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param charset the charset for pString
221069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return URL safe string
222069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws UnsupportedEncodingException Thrown if charset is not
223069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                                      supported
224069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
225069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String encode(String pString, String charset)
226069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        throws UnsupportedEncodingException
227069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    {
228069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (pString == null) {
229069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
230069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
231069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return new String(encode(pString.getBytes(charset)), StringEncodings.US_ASCII);
232069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
233069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
234069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
235069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
236069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Encodes a string into its URL safe form using the default string
237069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * charset. Unsafe characters are escaped.
238069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
239069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param pString string to convert to a URL safe form
240069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return URL safe string
241069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws EncoderException Thrown if URL encoding is unsuccessful
242069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
243069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see #getDefaultCharset()
244069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
245069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String encode(String pString) throws EncoderException {
246069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (pString == null) {
247069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
248069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
249069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        try {
250069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return encode(pString, getDefaultCharset());
251069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } catch(UnsupportedEncodingException e) {
252069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new EncoderException(e.getMessage());
253069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
254069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
255069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
256069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
257069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
258069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Decodes a URL safe string into its original form using the
259069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * specified encoding. Escaped characters are converted back
260069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * to their original representation.
261069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
262069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param pString URL safe string to convert into its original form
263069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param charset the original string charset
264069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return original string
265069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws DecoderException Thrown if URL decoding is unsuccessful
266069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws UnsupportedEncodingException Thrown if charset is not
267069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                                      supported
268069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
269069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String decode(String pString, String charset)
270069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        throws DecoderException, UnsupportedEncodingException
271069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    {
272069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (pString == null) {
273069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
274069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
275069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return new String(decode(pString.getBytes(StringEncodings.US_ASCII)), charset);
276069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
277069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
278069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
279069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
280069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Decodes a URL safe string into its original form using the default
281069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * string charset. Escaped characters are converted back to their
282069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * original representation.
283069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
284069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param pString URL safe string to convert into its original form
285069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return original string
286069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws DecoderException Thrown if URL decoding is unsuccessful
287069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
288069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see #getDefaultCharset()
289069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
290069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String decode(String pString) throws DecoderException {
291069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (pString == null) {
292069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
293069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
294069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        try {
295069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return decode(pString, getDefaultCharset());
296069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } catch(UnsupportedEncodingException e) {
297069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new DecoderException(e.getMessage());
298069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
299069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
300069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
301069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
302069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Encodes an object into its URL safe form. Unsafe characters are
303069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * escaped.
304069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
305069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param pObject string to convert to a URL safe form
306069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return URL safe object
307069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws EncoderException Thrown if URL encoding is not
308069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                          applicable to objects of this type or
309069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                          if encoding is unsuccessful
310069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
311069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public Object encode(Object pObject) throws EncoderException {
312069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (pObject == null) {
313069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
314069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if (pObject instanceof byte[]) {
315069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return encode((byte[])pObject);
316069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if (pObject instanceof String) {
317069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return encode((String)pObject);
318069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else {
319069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new EncoderException("Objects of type " +
320069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                pObject.getClass().getName() + " cannot be URL encoded");
321069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
322069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
323069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
324069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
325069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
326069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Decodes a URL safe object into its original form. Escaped
327069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * characters are converted back to their original representation.
328069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
329069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param pObject URL safe object to convert into its original form
330069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return original object
331069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @throws DecoderException Thrown if URL decoding is not
332069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                          applicable to objects of this type
333069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                          if decoding is unsuccessful
334069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
335069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public Object decode(Object pObject) throws DecoderException {
336069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (pObject == null) {
337069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
338069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if (pObject instanceof byte[]) {
339069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return decode((byte[])pObject);
340069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if (pObject instanceof String) {
341069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return decode((String)pObject);
342069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else {
343069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new DecoderException("Objects of type " +
344069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                pObject.getClass().getName() + " cannot be URL decoded");
345069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
346069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
347069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
348069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
349069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
350069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * The <code>String</code> encoding used for decoding and encoding.
351069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
352069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return Returns the encoding.
353069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
354069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @deprecated use #getDefaultCharset()
355069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
356069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String getEncoding() {
357069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return this.charset;
358069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
359069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
360069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
361069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * The default charset used for string decoding and encoding.
362069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
363069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return the default string charset.
364069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
365069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String getDefaultCharset() {
366069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return this.charset;
367069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
368069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
369069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
370