134 lines
4.9 KiB
Java
134 lines
4.9 KiB
Java
/*
|
|
* 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;
|
|
}
|
|
}
|