Loading src/java/android/telephony/SmsMessage.java +1 −1 Original line number Diff line number Diff line Loading @@ -391,7 +391,7 @@ public class SmsMessage { ted.languageTable, ted.languageShiftTable); } } else { // Assume unicode. nextPos = pos + Math.min(limit / 2, textLen - pos); nextPos = SmsMessageBase.findNextUnicodePosition(pos, limit, newMsgBody); } if ((nextPos <= pos) || (nextPos > textLen)) { Rlog.e(LOG_TAG, "fragmentText failed (" + pos + " >= " + nextPos + " or " + Loading src/java/com/android/internal/telephony/SmsMessageBase.java +69 −0 Original line number Diff line number Diff line Loading @@ -16,11 +16,14 @@ package com.android.internal.telephony; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; import com.android.internal.telephony.SmsConstants; import com.android.internal.telephony.SmsHeader; import java.text.BreakIterator; import java.util.Arrays; import android.provider.Telephony; import android.telephony.SmsMessage; /** * Base class declaring the specific methods and members for SmsMessage. Loading Loading @@ -346,4 +349,70 @@ public abstract class SmsMessageBase { mIsEmail = Telephony.Mms.isEmailAddress(mEmailFrom); } /** * Find the next position to start a new fragment of a multipart SMS. * * @param currentPosition current start position of the fragment * @param byteLimit maximum number of bytes in the fragment * @param msgBody text of the SMS in UTF-16 encoding * @return the position to start the next fragment */ public static int findNextUnicodePosition( int currentPosition, int byteLimit, CharSequence msgBody) { int nextPos = Math.min(currentPosition + byteLimit / 2, msgBody.length()); // Check whether the fragment ends in a character boundary. Some characters take 4-bytes // in UTF-16 encoding. Many carriers cannot handle // a fragment correctly if it does not end at a character boundary. if (nextPos < msgBody.length()) { BreakIterator breakIterator = BreakIterator.getCharacterInstance(); breakIterator.setText(msgBody.toString()); if (!breakIterator.isBoundary(nextPos)) { nextPos = breakIterator.preceding(nextPos); } } return nextPos; } /** * Calculate the TextEncodingDetails of a message encoded in Unicode. */ public static TextEncodingDetails calcUnicodeEncodingDetails(CharSequence msgBody) { TextEncodingDetails ted = new TextEncodingDetails(); int octets = msgBody.length() * 2; ted.codeUnitSize = SmsConstants.ENCODING_16BIT; ted.codeUnitCount = msgBody.length(); if (octets > SmsConstants.MAX_USER_DATA_BYTES) { // If EMS is not supported, break down EMS into single segment SMS // and add page info " x/y". // In the case of UCS2 encoding type, we need 8 bytes for this // but we only have 6 bytes from UDH, so truncate the limit for // each segment by 2 bytes (1 char). int maxUserDataBytesWithHeader = SmsConstants.MAX_USER_DATA_BYTES_WITH_HEADER; if (!SmsMessage.hasEmsSupport()) { // make sure total number of segments is less than 10 if (octets <= 9 * (maxUserDataBytesWithHeader - 2)) { maxUserDataBytesWithHeader -= 2; } } int pos = 0; // Index in code units. int msgCount = 0; while (pos < msgBody.length()) { int nextPos = findNextUnicodePosition(pos, maxUserDataBytesWithHeader, msgBody); if (nextPos == msgBody.length()) { ted.codeUnitsRemaining = pos + maxUserDataBytesWithHeader / 2 - msgBody.length(); } pos = nextPos; msgCount++; } ted.msgCount = msgCount; } else { ted.msgCount = 1; ted.codeUnitsRemaining = (SmsConstants.MAX_USER_DATA_BYTES - octets) / 2; } return ted; } } src/java/com/android/internal/telephony/cat/CatService.java +1 −0 Original line number Diff line number Diff line Loading @@ -961,6 +961,7 @@ public class CatService extends Handler implements AppInterface { case PRFRMD_WITH_MODIFICATION: case PRFRMD_NAA_NOT_ACTIVE: case PRFRMD_TONE_NOT_PLAYED: case LAUNCH_BROWSER_ERROR: case TERMINAL_CRNTLY_UNABLE_TO_PROCESS: switch (type) { case SET_UP_MENU: Loading src/java/com/android/internal/telephony/cat/CommandParamsFactory.java +28 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,22 @@ class CommandParamsFactory extends Handler { static final int DTTZ_SETTING = 0x03; static final int LANGUAGE_SETTING = 0x04; // As per TS 102.223 Annex C, Structure of CAT communications, // the APDU length can be max 255 bytes. This leaves only 239 bytes for user // input string. CMD details TLV + Device IDs TLV + Result TLV + Other // details of TextString TLV not including user input take 16 bytes. // // If UCS2 encoding is used, maximum 118 UCS2 chars can be encoded in 238 bytes. // Each UCS2 char takes 2 bytes. Byte Order Mask(BOM), 0xFEFF takes 2 bytes. // // If GSM 7 bit default(use 8 bits to represent a 7 bit char) format is used, // maximum 239 chars can be encoded in 239 bytes since each char takes 1 byte. // // No issues for GSM 7 bit packed format encoding. private static final int MAX_GSM7_DEFAULT_CHARS = 239; private static final int MAX_UCS2_CHARS = 118; static synchronized CommandParamsFactory getInstance(RilMessageDecoder caller, IccFileHandler fh) { if (sInstance != null) { Loading Loading @@ -499,6 +515,18 @@ class CommandParamsFactory extends Handler { input.packed = (cmdDet.commandQualifier & 0x08) != 0; input.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0; // Truncate the maxLen if it exceeds the max number of chars that can // be encoded. Limit depends on DCS in Command Qualifier. if (input.ucs2 && input.maxLen > MAX_UCS2_CHARS) { CatLog.d(this, "UCS2: received maxLen = " + input.maxLen + ", truncating to " + MAX_UCS2_CHARS); input.maxLen = MAX_UCS2_CHARS; } else if (!input.packed && input.maxLen > MAX_GSM7_DEFAULT_CHARS) { CatLog.d(this, "GSM 7Bit Default: received maxLen = " + input.maxLen + ", truncating to " + MAX_GSM7_DEFAULT_CHARS); input.maxLen = MAX_GSM7_DEFAULT_CHARS; } mCmdParams = new GetInputParams(cmdDet, input); if (iconId != null) { Loading src/java/com/android/internal/telephony/cdma/sms/BearerData.java +3 −26 Original line number Diff line number Diff line Loading @@ -24,9 +24,10 @@ import android.text.format.Time; import android.telephony.Rlog; import com.android.internal.telephony.GsmAlphabet; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; import com.android.internal.telephony.SmsConstants; import com.android.internal.telephony.SmsHeader; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; import com.android.internal.telephony.SmsMessageBase; import com.android.internal.telephony.uicc.IccUtils; import com.android.internal.util.BitwiseInputStream; import com.android.internal.util.BitwiseOutputStream; Loading Loading @@ -489,31 +490,7 @@ public final class BearerData { isEntireMsg) { // We don't support single-segment EMS, so calculate for 16-bit // TODO: Consider supporting single-segment EMS ted.codeUnitCount = msg.length(); int octets = ted.codeUnitCount * 2; if (octets > SmsConstants.MAX_USER_DATA_BYTES) { // If EMS is not supported, break down EMS into single segment SMS // and add page info " x/y". // In the case of UCS2 encoding type, we need 8 bytes for this // but we only have 6 bytes from UDH, so truncate the limit for // each segment by 2 bytes (1 char). int max_user_data_bytes_with_header = SmsConstants.MAX_USER_DATA_BYTES_WITH_HEADER; if (!android.telephony.SmsMessage.hasEmsSupport()) { // make sure total number of segments is less than 10 if (octets <= 9 * (max_user_data_bytes_with_header - 2)) max_user_data_bytes_with_header -= 2; } ted.msgCount = (octets + (max_user_data_bytes_with_header - 1)) / max_user_data_bytes_with_header; ted.codeUnitsRemaining = ((ted.msgCount * max_user_data_bytes_with_header) - octets) / 2; } else { ted.msgCount = 1; ted.codeUnitsRemaining = (SmsConstants.MAX_USER_DATA_BYTES - octets)/2; } ted.codeUnitSize = SmsConstants.ENCODING_16BIT; return SmsMessageBase.calcUnicodeEncodingDetails(msg); } } return ted; Loading Loading
src/java/android/telephony/SmsMessage.java +1 −1 Original line number Diff line number Diff line Loading @@ -391,7 +391,7 @@ public class SmsMessage { ted.languageTable, ted.languageShiftTable); } } else { // Assume unicode. nextPos = pos + Math.min(limit / 2, textLen - pos); nextPos = SmsMessageBase.findNextUnicodePosition(pos, limit, newMsgBody); } if ((nextPos <= pos) || (nextPos > textLen)) { Rlog.e(LOG_TAG, "fragmentText failed (" + pos + " >= " + nextPos + " or " + Loading
src/java/com/android/internal/telephony/SmsMessageBase.java +69 −0 Original line number Diff line number Diff line Loading @@ -16,11 +16,14 @@ package com.android.internal.telephony; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; import com.android.internal.telephony.SmsConstants; import com.android.internal.telephony.SmsHeader; import java.text.BreakIterator; import java.util.Arrays; import android.provider.Telephony; import android.telephony.SmsMessage; /** * Base class declaring the specific methods and members for SmsMessage. Loading Loading @@ -346,4 +349,70 @@ public abstract class SmsMessageBase { mIsEmail = Telephony.Mms.isEmailAddress(mEmailFrom); } /** * Find the next position to start a new fragment of a multipart SMS. * * @param currentPosition current start position of the fragment * @param byteLimit maximum number of bytes in the fragment * @param msgBody text of the SMS in UTF-16 encoding * @return the position to start the next fragment */ public static int findNextUnicodePosition( int currentPosition, int byteLimit, CharSequence msgBody) { int nextPos = Math.min(currentPosition + byteLimit / 2, msgBody.length()); // Check whether the fragment ends in a character boundary. Some characters take 4-bytes // in UTF-16 encoding. Many carriers cannot handle // a fragment correctly if it does not end at a character boundary. if (nextPos < msgBody.length()) { BreakIterator breakIterator = BreakIterator.getCharacterInstance(); breakIterator.setText(msgBody.toString()); if (!breakIterator.isBoundary(nextPos)) { nextPos = breakIterator.preceding(nextPos); } } return nextPos; } /** * Calculate the TextEncodingDetails of a message encoded in Unicode. */ public static TextEncodingDetails calcUnicodeEncodingDetails(CharSequence msgBody) { TextEncodingDetails ted = new TextEncodingDetails(); int octets = msgBody.length() * 2; ted.codeUnitSize = SmsConstants.ENCODING_16BIT; ted.codeUnitCount = msgBody.length(); if (octets > SmsConstants.MAX_USER_DATA_BYTES) { // If EMS is not supported, break down EMS into single segment SMS // and add page info " x/y". // In the case of UCS2 encoding type, we need 8 bytes for this // but we only have 6 bytes from UDH, so truncate the limit for // each segment by 2 bytes (1 char). int maxUserDataBytesWithHeader = SmsConstants.MAX_USER_DATA_BYTES_WITH_HEADER; if (!SmsMessage.hasEmsSupport()) { // make sure total number of segments is less than 10 if (octets <= 9 * (maxUserDataBytesWithHeader - 2)) { maxUserDataBytesWithHeader -= 2; } } int pos = 0; // Index in code units. int msgCount = 0; while (pos < msgBody.length()) { int nextPos = findNextUnicodePosition(pos, maxUserDataBytesWithHeader, msgBody); if (nextPos == msgBody.length()) { ted.codeUnitsRemaining = pos + maxUserDataBytesWithHeader / 2 - msgBody.length(); } pos = nextPos; msgCount++; } ted.msgCount = msgCount; } else { ted.msgCount = 1; ted.codeUnitsRemaining = (SmsConstants.MAX_USER_DATA_BYTES - octets) / 2; } return ted; } }
src/java/com/android/internal/telephony/cat/CatService.java +1 −0 Original line number Diff line number Diff line Loading @@ -961,6 +961,7 @@ public class CatService extends Handler implements AppInterface { case PRFRMD_WITH_MODIFICATION: case PRFRMD_NAA_NOT_ACTIVE: case PRFRMD_TONE_NOT_PLAYED: case LAUNCH_BROWSER_ERROR: case TERMINAL_CRNTLY_UNABLE_TO_PROCESS: switch (type) { case SET_UP_MENU: Loading
src/java/com/android/internal/telephony/cat/CommandParamsFactory.java +28 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,22 @@ class CommandParamsFactory extends Handler { static final int DTTZ_SETTING = 0x03; static final int LANGUAGE_SETTING = 0x04; // As per TS 102.223 Annex C, Structure of CAT communications, // the APDU length can be max 255 bytes. This leaves only 239 bytes for user // input string. CMD details TLV + Device IDs TLV + Result TLV + Other // details of TextString TLV not including user input take 16 bytes. // // If UCS2 encoding is used, maximum 118 UCS2 chars can be encoded in 238 bytes. // Each UCS2 char takes 2 bytes. Byte Order Mask(BOM), 0xFEFF takes 2 bytes. // // If GSM 7 bit default(use 8 bits to represent a 7 bit char) format is used, // maximum 239 chars can be encoded in 239 bytes since each char takes 1 byte. // // No issues for GSM 7 bit packed format encoding. private static final int MAX_GSM7_DEFAULT_CHARS = 239; private static final int MAX_UCS2_CHARS = 118; static synchronized CommandParamsFactory getInstance(RilMessageDecoder caller, IccFileHandler fh) { if (sInstance != null) { Loading Loading @@ -499,6 +515,18 @@ class CommandParamsFactory extends Handler { input.packed = (cmdDet.commandQualifier & 0x08) != 0; input.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0; // Truncate the maxLen if it exceeds the max number of chars that can // be encoded. Limit depends on DCS in Command Qualifier. if (input.ucs2 && input.maxLen > MAX_UCS2_CHARS) { CatLog.d(this, "UCS2: received maxLen = " + input.maxLen + ", truncating to " + MAX_UCS2_CHARS); input.maxLen = MAX_UCS2_CHARS; } else if (!input.packed && input.maxLen > MAX_GSM7_DEFAULT_CHARS) { CatLog.d(this, "GSM 7Bit Default: received maxLen = " + input.maxLen + ", truncating to " + MAX_GSM7_DEFAULT_CHARS); input.maxLen = MAX_GSM7_DEFAULT_CHARS; } mCmdParams = new GetInputParams(cmdDet, input); if (iconId != null) { Loading
src/java/com/android/internal/telephony/cdma/sms/BearerData.java +3 −26 Original line number Diff line number Diff line Loading @@ -24,9 +24,10 @@ import android.text.format.Time; import android.telephony.Rlog; import com.android.internal.telephony.GsmAlphabet; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; import com.android.internal.telephony.SmsConstants; import com.android.internal.telephony.SmsHeader; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; import com.android.internal.telephony.SmsMessageBase; import com.android.internal.telephony.uicc.IccUtils; import com.android.internal.util.BitwiseInputStream; import com.android.internal.util.BitwiseOutputStream; Loading Loading @@ -489,31 +490,7 @@ public final class BearerData { isEntireMsg) { // We don't support single-segment EMS, so calculate for 16-bit // TODO: Consider supporting single-segment EMS ted.codeUnitCount = msg.length(); int octets = ted.codeUnitCount * 2; if (octets > SmsConstants.MAX_USER_DATA_BYTES) { // If EMS is not supported, break down EMS into single segment SMS // and add page info " x/y". // In the case of UCS2 encoding type, we need 8 bytes for this // but we only have 6 bytes from UDH, so truncate the limit for // each segment by 2 bytes (1 char). int max_user_data_bytes_with_header = SmsConstants.MAX_USER_DATA_BYTES_WITH_HEADER; if (!android.telephony.SmsMessage.hasEmsSupport()) { // make sure total number of segments is less than 10 if (octets <= 9 * (max_user_data_bytes_with_header - 2)) max_user_data_bytes_with_header -= 2; } ted.msgCount = (octets + (max_user_data_bytes_with_header - 1)) / max_user_data_bytes_with_header; ted.codeUnitsRemaining = ((ted.msgCount * max_user_data_bytes_with_header) - octets) / 2; } else { ted.msgCount = 1; ted.codeUnitsRemaining = (SmsConstants.MAX_USER_DATA_BYTES - octets)/2; } ted.codeUnitSize = SmsConstants.ENCODING_16BIT; return SmsMessageBase.calcUnicodeEncodingDetails(msg); } } return ted; Loading