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