diff --git a/telephony/java/com/android/internal/telephony/cdma/sms/BearerData.java b/telephony/java/com/android/internal/telephony/cdma/sms/BearerData.java index c71003bec5dcf..d4ec85a7ebb0b 100644 --- a/telephony/java/com/android/internal/telephony/cdma/sms/BearerData.java +++ b/telephony/java/com/android/internal/telephony/cdma/sms/BearerData.java @@ -853,7 +853,7 @@ public final class BearerData { } } - private static String decodeIa5(byte[] data, int offset, int numFields) + private static String decode7bitAscii(byte[] data, int offset, int numFields) throws CodingException { try { @@ -868,37 +868,19 @@ public final class BearerData { inStream.skip(offset); for (int i = 0; i < numFields; i++) { int charCode = inStream.read(7); - if ((charCode < UserData.IA5_MAP_BASE_INDEX) || - (charCode > UserData.IA5_MAP_MAX_INDEX)) { - throw new CodingException("unsupported AI5 character code (" + charCode + ")"); + if ((charCode >= UserData.ASCII_MAP_BASE_INDEX) || + (charCode <= UserData.ASCII_MAP_MAX_INDEX)) { + strBuf.append(UserData.ASCII_MAP[charCode - UserData.ASCII_MAP_BASE_INDEX]); + } else if (charCode == UserData.ASCII_LF_INDEX) { + strBuf.append('\r'); + } else if (charCode == UserData.ASCII_CR_INDEX) { + strBuf.append('\n'); + } else { + /* For other charCodes, they are unprintable, and so simply use SPACE. */ + strBuf.append(' '); } - strBuf.append(UserData.IA5_MAP[charCode - UserData.IA5_MAP_BASE_INDEX]); } return strBuf.toString(); - } catch (BitwiseInputStream.AccessException ex) { - throw new CodingException("AI5 decode failed: " + ex); - } - } - - private static String decode7bitAscii(byte[] data, int offset, int numFields) - throws CodingException - { - try { - offset *= 8; - BitwiseInputStream inStream = new BitwiseInputStream(data); - int wantedBits = offset + (numFields * 7); - if (inStream.available() < wantedBits) { - throw new CodingException("insufficient data (wanted " + wantedBits + - " bits, but only have " + inStream.available() + ")"); - } - inStream.skip(offset); - byte[] expandedData = new byte[numFields]; - for (int i = 0; i < numFields; i++) { - expandedData[i] = (byte)inStream.read(7); - } - return new String(expandedData, 0, numFields, "US-ASCII"); - } catch (java.io.UnsupportedEncodingException ex) { - throw new CodingException("7bit ASCII decode failed: " + ex); } catch (BitwiseInputStream.AccessException ex) { throw new CodingException("7bit ASCII decode failed: " + ex); } @@ -956,12 +938,10 @@ public final class BearerData { // octet encoded. userData.payloadStr = decodeLatin(userData.payload, offset, userData.numFields); break; + case UserData.ENCODING_IA5: case UserData.ENCODING_7BIT_ASCII: userData.payloadStr = decode7bitAscii(userData.payload, offset, userData.numFields); break; - case UserData.ENCODING_IA5: - userData.payloadStr = decodeIa5(userData.payload, offset, userData.numFields); - break; case UserData.ENCODING_UNICODE_16: userData.payloadStr = decodeUtf16(userData.payload, offset, userData.numFields); break; @@ -1003,7 +983,7 @@ public final class BearerData { try { StringBuffer strbuf = new StringBuffer(dataLen); while (inStream.available() >= 6) { - strbuf.append(UserData.IA5_MAP[inStream.read(6)]); + strbuf.append(UserData.ASCII_MAP[inStream.read(6)]); } String data = strbuf.toString(); bData.numberOfMessages = Integer.parseInt(data.substring(0, 2)); @@ -1045,7 +1025,7 @@ public final class BearerData { } StringBuffer strbuf = new StringBuffer(dataLen); for (int i = 0; i < numFields; i++) { - strbuf.append(UserData.IA5_MAP[inStream.read(6)]); + strbuf.append(UserData.ASCII_MAP[inStream.read(6)]); } bData.userData.payloadStr = strbuf.toString(); } diff --git a/telephony/java/com/android/internal/telephony/cdma/sms/UserData.java b/telephony/java/com/android/internal/telephony/cdma/sms/UserData.java index 54c1f80340e23..15cb5e42e2b91 100644 --- a/telephony/java/com/android/internal/telephony/cdma/sms/UserData.java +++ b/telephony/java/com/android/internal/telephony/cdma/sms/UserData.java @@ -49,19 +49,20 @@ public class UserData { public static final int IS91_MSG_TYPE_SHORT_MESSAGE = 0x85; /** - * IA5 data encoding character mappings. - * (See CCITT Rec. T.50 Tables 1 and 3) + * US ASCII character mapping table. * - * Note this mapping is the the same as for printable ASCII - * characters, with a 0x20 offset, meaning that the ASCII SPACE - * character occurs with code 0x20. + * This table contains only the printable ASCII characters, with a + * 0x20 offset, meaning that the ASCII SPACE character is at index + * 0, with the resulting code of 0x20. * - * Note this mapping is also equivalent to that used by the IS-91 - * protocol, except for the latter using only 6 bits, and hence - * mapping only entries up to the '_' character. + * Note this mapping is also equivalent to that used by both the + * IS5 and the IS-91 encodings. For the former this is defined + * using CCITT Rec. T.50 Tables 1 and 3. For the latter IS 637 B, + * Table 4.3.1.4.1-1 -- and note the encoding uses only 6 bits, + * and hence only maps entries up to the '_' character. * */ - public static final char[] IA5_MAP = { + public static final char[] ASCII_MAP = { ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', @@ -85,8 +86,8 @@ public class UserData { public static final int ASCII_CR_INDEX = 0x0D; public static final SparseIntArray charToAscii = new SparseIntArray(); static { - for (int i = 0; i < IA5_MAP.length; i++) { - charToAscii.put(IA5_MAP[i], PRINTABLE_ASCII_MIN_INDEX + i); + for (int i = 0; i < ASCII_MAP.length; i++) { + charToAscii.put(ASCII_MAP[i], PRINTABLE_ASCII_MIN_INDEX + i); } charToAscii.put('\r', ASCII_LF_INDEX); charToAscii.put('\n', ASCII_CR_INDEX); @@ -113,11 +114,11 @@ public class UserData { } /** - * Mapping for IA5 values less than 32 are flow control signals + * Mapping for ASCII values less than 32 are flow control signals * and not used here. */ - public static final int IA5_MAP_BASE_INDEX = 0x20; - public static final int IA5_MAP_MAX_INDEX = IA5_MAP_BASE_INDEX + IA5_MAP.length - 1; + public static final int ASCII_MAP_BASE_INDEX = 0x20; + public static final int ASCII_MAP_MAX_INDEX = ASCII_MAP_BASE_INDEX + ASCII_MAP.length - 1; /** * Contains the data header of the user data