| /* |
| * Copyright (C) 2008-2009 Marc Blank |
| * Licensed to The Android Open Source Project. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.exchange.utility; |
| |
| /** |
| * Encode and decode QuotedPrintable text, according to the specification. Since the Email |
| * application already does this elsewhere, the goal would be to use its functionality here. |
| * |
| */ |
| public class QuotedPrintable { |
| static public String toString (String str) { |
| int len = str.length(); |
| // Make sure we don't get an index out of bounds error with the = character |
| int max = len - 2; |
| StringBuilder sb = new StringBuilder(len); |
| try { |
| for (int i = 0; i < len; i++) { |
| char c = str.charAt(i); |
| if (c == '=') { |
| if (i < max) { |
| char n = str.charAt(++i); |
| if (n == '\r') { |
| n = str.charAt(++i); |
| if (n == '\n') { |
| continue; |
| } else { |
| // This isn't valid QuotedPrintable, but what to do? |
| // Let's just ignore it because 1) it's extremely unlikely to |
| // happen, and 2) an exception is frankly no better. |
| } |
| } else { |
| // Must be less than 0x80, right? |
| int a; |
| if (n >= '0' && n <= '9') { |
| a = (n - '0') << 4; |
| } else { |
| a = (10 + (n - 'A')) << 4; |
| } |
| n = str.charAt(++i); |
| if (n >= '0' && n <= '9') { |
| c = (char) (a + (n - '0')); |
| } else { |
| c = (char) (a + 10 + (n - 'A')); |
| } |
| } |
| } if (i + 1 == len) { |
| continue; |
| } |
| } |
| sb.append(c); |
| } |
| } catch (IndexOutOfBoundsException e) { |
| } |
| String ret = sb.toString(); |
| return ret; |
| } |
| |
| static public String encode (String str) { |
| int len = str.length(); |
| StringBuffer sb = new StringBuffer(len + len>>2); |
| int i = 0; |
| while (i < len) { |
| char c = str.charAt(i++); |
| if (c < 0x80) { |
| sb.append(c); |
| } else { |
| sb.append('&'); |
| sb.append('#'); |
| sb.append((int)c); |
| sb.append(';'); |
| } |
| } |
| return sb.toString(); |
| } |
| |
| static public int decode (byte[] bytes, int len) { |
| // Make sure we don't get an index out of bounds error with the = character |
| int max = len - 2; |
| int pos = 0; |
| try { |
| for (int i = 0; i < len; i++) { |
| char c = (char)bytes[i]; |
| if (c == '=') { |
| if (i < max) { |
| char n = (char)bytes[++i]; |
| if (n == '\r') { |
| n = (char)bytes[++i]; |
| if (n == '\n') { |
| continue; |
| } else { |
| System.err.println("Not valid QP"); |
| } |
| } else { |
| // Must be less than 0x80, right? |
| int a; |
| if (n >= '0' && n <= '9') { |
| a = (n - '0') << 4; |
| } else { |
| a = (10 + (n - 'A')) << 4; |
| } |
| n = (char)bytes[++i]; |
| if (n >= '0' && n <= '9') { |
| c = (char) (a + (n - '0')); |
| } else { |
| c = (char) (a + 10 + (n - 'A')); |
| } |
| } |
| } if (i + 1 > len) { |
| continue; |
| } |
| } |
| bytes[pos++] = (byte)c; |
| } |
| } catch (IndexOutOfBoundsException e) { |
| } |
| return pos; |
| } |
| } |