Mega Code Archive

 
Categories / Android / Date Type
 

A method to decodeencode quoted printable encoded data

/*  * Funambol is a mobile platform developed by Funambol, Inc.  * Copyright (C) 2003 - 2007 Funambol, Inc.  *  * This program is free software; you can redistribute it and/or modify it under  * the terms of the GNU Affero General Public License version 3 as published by  * the Free Software Foundation with the addition of the following permission  * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED  * WORK IN WHICH THE COPYRIGHT IS OWNED BY FUNAMBOL, FUNAMBOL DISCLAIMS THE  * WARRANTY OF NON INFRINGEMENT  OF THIRD PARTY RIGHTS.  *  * This program is distributed in the hope that it will be useful, but WITHOUT  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more  * details.  *  * You should have received a copy of the GNU Affero General Public License  * along with this program; if not, see http://www.gnu.org/licenses or write to  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,  * MA 02110-1301 USA.  *  * You can contact Funambol, Inc. headquarters at 643 Bair Island Road, Suite  * 305, Redwood City, CA 94063, USA, or at email address info@funambol.com.  *  * The interactive user interfaces in modified source and object code versions  * of this program must display Appropriate Legal Notices, as required under  * Section 5 of the GNU Affero General Public License version 3.  *  * In accordance with Section 7(b) of the GNU Affero General Public License  * version 3, these Appropriate Legal Notices must retain the display of the  * "Powered by Funambol" logo. If the display of the logo is not reasonably  * feasible for technical reasons, the Appropriate Legal Notices must display  * the words "Powered by Funambol".  */ //package com.funambol.util; import java.io.UnsupportedEncodingException; /**  * A class containing static methods to perform decoding from <b>quoted  * printable</b> content transfer encoding and to encode into  */ public class QuotedPrintable {   private static byte HT = 0x09; // \t   private static byte LF = 0x0A; // \n   private static byte CR = 0x0D; // \r   /**    * A method to decode quoted printable encoded data. It overrides the same    * input byte array to save memory. Can be done because the result is surely    * smaller than the input.    *     * @param qp    *            a byte array to decode.    * @return the length of the decoded array.    */   public static int decode(final byte[] qp) {     final int qplen = qp.length;     int retlen = 0;     for (int i = 0; i < qplen; i++) {       // Handle encoded chars       if (qp[i] == '=')         if (qplen - i > 2)           // The sequence can be complete, check it           if (qp[i + 1] == QuotedPrintable.CR               && qp[i + 2] == QuotedPrintable.LF) {             // soft line break, ignore it             i += 2;             continue;           } else if (QuotedPrintable.isHexDigit(qp[i + 1])               && QuotedPrintable.isHexDigit(qp[i + 2])) {             // convert the number into an integer, taking             // the ascii digits stored in the array.             qp[retlen++] = (byte) (QuotedPrintable                 .getHexValue(qp[i + 1]) * 16 + QuotedPrintable                 .getHexValue(qp[i + 2]));             i += 2;             continue;           } else           //  Log.error("decode: Invalid sequence = " + qp[i + 1]             //    + qp[i + 2]);       // RFC 2045 says to exclude control characters mistakenly       // present (unencoded) in the encoded stream.       // As an exception, we keep unencoded tabs (0x09)       if ((qp[i] >= 0x20 && qp[i] <= 0x7f) || qp[i] == QuotedPrintable.HT           || qp[i] == QuotedPrintable.CR           || qp[i] == QuotedPrintable.LF)         qp[retlen++] = qp[i];     }     return retlen;   }   private static boolean isHexDigit(final byte b) {     return ((b >= 0x30 && b <= 0x39) || (b >= 0x41 && b <= 0x46));   }   private static byte getHexValue(final byte b) {     return (byte) Character.digit((char) b, 16);   }   /**    *     * @param qp    *            Byte array to decode    * @param enc    *            The character encoding of the decoded string    * @return The decoded string.    */   public static String decode(final byte[] qp, final String enc) {     final int len = QuotedPrintable.decode(qp);     try {       return new String(qp, 0, len, enc);     } catch (final UnsupportedEncodingException e) {     //  Log.error("qp.decode: " + enc + " not supported. " + e.toString());       return new String(qp, 0, len);     }   }   /**    * A method to encode data in quoted printable    *     * @param content    *            The string to be encoded    * @return the encoded string.    * @throws Exception    *     *             public static byte[] encode(String content, String enc)    *             throws Exception { // TODO: to be implemented (has to return    *             a String) throw new    *             Exception("This method is not implemented!"); }    */   /**    * A method to encode data in quoted printable    *     * @param content    *            The string to be encoded    * @return the encoded string.    * @throws Exception    *     *             public static byte[] encode(byte[] content) throws Exception    *             { // TODO: to be implemented (has to return a String) throw    *             new Exception("This method is not implemented!"); }    */ }