diff options
3 files changed, 39 insertions, 12 deletions
diff --git a/telephony/java/com/android/internal/telephony/EncodeException.java b/telephony/java/com/android/internal/telephony/EncodeException.java index 4e3fac1a2aea..cdc853e09895 100644 --- a/telephony/java/com/android/internal/telephony/EncodeException.java +++ b/telephony/java/com/android/internal/telephony/EncodeException.java @@ -22,6 +22,12 @@ import android.annotation.UnsupportedAppUsage; * {@hide} */ public class EncodeException extends Exception { + + private int mError = ERROR_UNENCODABLE; + + public static final int ERROR_UNENCODABLE = 0; + public static final int ERROR_EXCEED_SIZE = 1; + public EncodeException() { super(); } @@ -31,9 +37,18 @@ public class EncodeException extends Exception { super(s); } + public EncodeException(String s, int error) { + super(s); + mError = error; + } + @UnsupportedAppUsage public EncodeException(char c) { super("Unencodable char: '" + c + "'"); } + + public int getError() { + return mError; + } } diff --git a/telephony/java/com/android/internal/telephony/GsmAlphabet.java b/telephony/java/com/android/internal/telephony/GsmAlphabet.java index 84c0e6453104..a774cdc8a280 100644 --- a/telephony/java/com/android/internal/telephony/GsmAlphabet.java +++ b/telephony/java/com/android/internal/telephony/GsmAlphabet.java @@ -388,7 +388,7 @@ public class GsmAlphabet { * GSM extension table * @return the encoded message * - * @throws EncodeException if String is too large to encode + * @throws EncodeException if String is too large to encode or any characters are unencodable */ @UnsupportedAppUsage public static byte[] stringToGsm7BitPacked(String data, int startingSeptetOffset, @@ -402,7 +402,8 @@ public class GsmAlphabet { } septetCount += startingSeptetOffset; if (septetCount > 255) { - throw new EncodeException("Payload cannot exceed 255 septets"); + throw new EncodeException( + "Payload cannot exceed 255 septets", EncodeException.ERROR_EXCEED_SIZE); } int byteCount = ((septetCount * 7) + 7) / 8; byte[] ret = new byte[byteCount + 1]; // Include space for one byte length prefix. diff --git a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java index 4f5bfa919135..015efa6a0c7d 100644 --- a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java +++ b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java @@ -384,16 +384,22 @@ public class SmsMessage extends SmsMessageBase { } } } catch (EncodeException ex) { - // Encoding to the 7-bit alphabet failed. Let's see if we can - // send it as a UCS-2 encoded message - try { - userData = encodeUCS2(message, header); - encoding = ENCODING_16BIT; - } catch(UnsupportedEncodingException uex) { - Rlog.e(LOG_TAG, - "Implausible UnsupportedEncodingException ", - uex); + if (ex.getError() == EncodeException.ERROR_EXCEED_SIZE) { + Rlog.e(LOG_TAG, "Exceed size limitation EncodeException", ex); return null; + } else { + // Encoding to the 7-bit alphabet failed. Let's see if we can + // send it as a UCS-2 encoded message + try { + userData = encodeUCS2(message, header); + encoding = ENCODING_16BIT; + } catch (EncodeException ex1) { + Rlog.e(LOG_TAG, "Exceed size limitation EncodeException", ex1); + return null; + } catch (UnsupportedEncodingException uex) { + Rlog.e(LOG_TAG, "Implausible UnsupportedEncodingException ", uex); + return null; + } } } @@ -438,9 +444,10 @@ public class SmsMessage extends SmsMessageBase { * * @return encoded message as UCS2 * @throws UnsupportedEncodingException + * @throws EncodeException if String is too large to encode */ private static byte[] encodeUCS2(String message, byte[] header) - throws UnsupportedEncodingException { + throws UnsupportedEncodingException, EncodeException { byte[] userData, textPart; textPart = message.getBytes("utf-16be"); @@ -455,6 +462,10 @@ public class SmsMessage extends SmsMessageBase { else { userData = textPart; } + if (userData.length > 255) { + throw new EncodeException( + "Payload cannot exceed 255 bytes", EncodeException.ERROR_EXCEED_SIZE); + } byte[] ret = new byte[userData.length+1]; ret[0] = (byte) (userData.length & 0xff ); System.arraycopy(userData, 0, ret, 1, userData.length); |