Loading telephony/java/com/android/internal/telephony/cdma/sms/BearerData.java +14 −34 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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); } Loading Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -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(); } Loading telephony/java/com/android/internal/telephony/cdma/sms/UserData.java +15 −14 Original line number Diff line number Diff line Loading @@ -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', Loading @@ -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); Loading @@ -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 Loading Loading
telephony/java/com/android/internal/telephony/cdma/sms/BearerData.java +14 −34 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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); } Loading Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -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(); } Loading
telephony/java/com/android/internal/telephony/cdma/sms/UserData.java +15 −14 Original line number Diff line number Diff line Loading @@ -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', Loading @@ -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); Loading @@ -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 Loading