Loading src/java/com/android/internal/telephony/cdma/CdmaInboundSmsHandler.java +12 −0 Original line number Diff line number Diff line Loading @@ -175,6 +175,10 @@ public class CdmaInboundSmsHandler extends InboundSmsHandler { // handled below, after storage check break; case SmsEnvelope.TELESERVICE_CT_WAP: // handled below, after TELESERVICE_WAP break; default: loge("unsupported teleservice 0x" + Integer.toHexString(teleService)); return Intents.RESULT_SMS_UNSUPPORTED; Loading @@ -191,6 +195,14 @@ public class CdmaInboundSmsHandler extends InboundSmsHandler { if (SmsEnvelope.TELESERVICE_WAP == teleService) { return processCdmaWapPdu(sms.getUserData(), sms.mMessageRef, sms.getOriginatingAddress(), sms.getTimestampMillis()); } else if (SmsEnvelope.TELESERVICE_CT_WAP == teleService) { /* China Telecom WDP header contains Message identifier and User data subparametrs extract these fields */ if (!sms.processCdmaCTWdpHeader(sms)) { return Intents.RESULT_SMS_HANDLED; } return processCdmaWapPdu(sms.getUserData(), sms.mMessageRef, sms.getOriginatingAddress(), sms.getTimestampMillis()); } return dispatchNormalMessage(smsb); Loading src/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java 100755 → 100644 +8 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.app.Activity; import android.app.PendingIntent; import android.app.PendingIntent.CanceledException; import android.content.Intent; import android.content.Context; import android.os.Message; import android.os.SystemProperties; import android.provider.Telephony.Sms; Loading Loading @@ -152,6 +153,13 @@ public class CdmaSMSDispatcher extends SMSDispatcher { uData.userDataHeader = smsHeader; if (encoding == SmsConstants.ENCODING_7BIT) { uData.msgEncoding = UserData.ENCODING_GSM_7BIT_ALPHABET; Context context = mPhone.getContext(); boolean ascii7bitForLongMsg = context.getResources(). getBoolean(com.android.internal.R.bool.config_ascii_7bit_support_for_long_message); if (ascii7bitForLongMsg) { Rlog.d(TAG, "ascii7bitForLongMsg = " + ascii7bitForLongMsg); uData.msgEncoding = UserData.ENCODING_7BIT_ASCII; } } else { // assume UTF-16 uData.msgEncoding = UserData.ENCODING_UNICODE_16; } Loading src/java/com/android/internal/telephony/cdma/SmsMessage.java +64 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.internal.telephony.cdma; import android.content.Context; import android.os.Parcel; import android.os.SystemProperties; import android.telephony.PhoneNumberUtils; Loading @@ -28,6 +29,7 @@ import android.telephony.Rlog; import android.util.Log; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.SmsConstants; import com.android.internal.telephony.SmsHeader; import com.android.internal.telephony.SmsMessageBase; Loading Loading @@ -922,6 +924,13 @@ public class SmsMessage extends SmsMessageBase { int teleservice = bearerData.hasUserDataHeader ? SmsEnvelope.TELESERVICE_WEMT : SmsEnvelope.TELESERVICE_WMT; Context context = PhoneFactory.getContext(); boolean ascii7bitForLongMsg = context.getResources(). getBoolean(com.android.internal.R.bool.config_ascii_7bit_support_for_long_message); if (ascii7bitForLongMsg) { Rlog.d(LOG_TAG, "ascii7bitForLongMsg = " + ascii7bitForLongMsg); teleservice = SmsEnvelope.TELESERVICE_WMT; } SmsEnvelope envelope = new SmsEnvelope(); envelope.messageType = SmsEnvelope.MESSAGE_TYPE_POINT_TO_POINT; envelope.teleService = teleservice; Loading Loading @@ -1079,4 +1088,59 @@ public class SmsMessage extends SmsMessageBase { public ArrayList<CdmaSmsCbProgramData> getSmsCbProgramData() { return mBearerData.serviceCategoryProgramData; } /** * CT WDP header contains WDP Msg Identifier and WDP Userdata */ protected boolean processCdmaCTWdpHeader(SmsMessage sms) { int subparamId = 0; int subParamLen = 0; int msgID = 0; boolean decodeSuccess = false; try { BitwiseInputStream inStream = new BitwiseInputStream(sms.getUserData()); /* Decode WDP Messsage Identifier */ subparamId = inStream.read(8); if (subparamId != 0) { Rlog.e(LOG_TAG, "Invalid WDP SubparameterId"); return false; } subParamLen = inStream.read(8); if (subParamLen != 3) { Rlog.e(LOG_TAG, "Invalid WDP subparameter length"); return false; } sms.mBearerData.messageType = inStream.read(4); msgID = inStream.read(8) << 8; msgID |= inStream.read(8); sms.mBearerData.hasUserDataHeader = (inStream.read(1) == 1); if (sms.mBearerData.hasUserDataHeader) { Rlog.e(LOG_TAG, "Invalid WDP UserData header value"); return false; } inStream.skip(3); sms.mBearerData.messageId = msgID; sms.mMessageRef = msgID; /* Decode WDP User Data */ subparamId = inStream.read(8); subParamLen = inStream.read(8) * 8; sms.mBearerData.userData.msgEncoding = inStream.read(5); int consumedBits = 5; if (sms.mBearerData.userData.msgEncoding != 0) { Rlog.e(LOG_TAG, "Invalid WDP encoding"); return false; } sms.mBearerData.userData.numFields = inStream.read(8); consumedBits += 8; int dataBits = subParamLen - consumedBits; sms.mBearerData.userData.payload = inStream.readByteArray(dataBits); sms.mUserData = sms.mBearerData.userData.payload; decodeSuccess = true; } catch (BitwiseInputStream.AccessException ex) { Rlog.e(LOG_TAG, "CT WDP Header decode failed: " + ex); } return decodeSuccess; } } src/java/com/android/internal/telephony/cdma/sms/BearerData.java +41 −0 Original line number Diff line number Diff line Loading @@ -604,6 +604,45 @@ public final class BearerData { System.arraycopy(payload, 0, uData.payload, udhBytes, payload.length); } private static void encode7bitAsciiEms(UserData uData, byte[] udhData, boolean force) throws CodingException { try { Rlog.d(LOG_TAG, "encode7bitAsciiEms"); int udhBytes = udhData.length + 1; // Add length octet. int udhSeptets = ((udhBytes * 8) + 6) / 7; int paddingBits = (udhSeptets * 7) - (udhBytes * 8); String msg = uData.payloadStr; byte[] payload ; int msgLen = msg.length(); BitwiseOutputStream outStream = new BitwiseOutputStream(msgLen + (paddingBits > 0 ? 1 : 0)); outStream.write(paddingBits, 0); for (int i = 0; i < msgLen; i++) { int charCode = UserData.charToAscii.get(msg.charAt(i), -1); if (charCode == -1) { if (force) { outStream.write(7, UserData.UNENCODABLE_7_BIT_CHAR); } else { throw new CodingException("cannot ASCII encode (" + msg.charAt(i) + ")"); } } else { outStream.write(7, charCode); } } payload = outStream.toByteArray(); uData.msgEncoding = UserData.ENCODING_7BIT_ASCII; uData.msgEncodingSet = true; uData.numFields = udhSeptets + uData.payloadStr.length(); uData.payload = new byte[udhBytes + payload.length]; uData.payload[0] = (byte)udhData.length; System.arraycopy(udhData, 0, uData.payload, 1, udhData.length); System.arraycopy(payload, 0, uData.payload, udhBytes, payload.length); } catch (BitwiseOutputStream.AccessException ex) { throw new CodingException("7bit ASCII encode failed: " + ex); } } private static void encodeEmsUserDataPayload(UserData uData) throws CodingException { Loading @@ -613,6 +652,8 @@ public final class BearerData { encode7bitEms(uData, headerData, true); } else if (uData.msgEncoding == UserData.ENCODING_UNICODE_16) { encode16bitEms(uData, headerData); } else if (uData.msgEncoding == UserData.ENCODING_7BIT_ASCII) { encode7bitAsciiEms(uData, headerData, true); } else { throw new CodingException("unsupported EMS user data encoding (" + uData.msgEncoding + ")"); Loading src/java/com/android/internal/telephony/cdma/sms/SmsEnvelope.java +1 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ public final class SmsEnvelope { static public final int TELESERVICE_WAP = 0x1004; static public final int TELESERVICE_WEMT = 0x1005; static public final int TELESERVICE_SCPT = 0x1006; static public final int TELESERVICE_CT_WAP = 0xFDEA; /** * The following are defined as extensions to the standard teleservices Loading Loading
src/java/com/android/internal/telephony/cdma/CdmaInboundSmsHandler.java +12 −0 Original line number Diff line number Diff line Loading @@ -175,6 +175,10 @@ public class CdmaInboundSmsHandler extends InboundSmsHandler { // handled below, after storage check break; case SmsEnvelope.TELESERVICE_CT_WAP: // handled below, after TELESERVICE_WAP break; default: loge("unsupported teleservice 0x" + Integer.toHexString(teleService)); return Intents.RESULT_SMS_UNSUPPORTED; Loading @@ -191,6 +195,14 @@ public class CdmaInboundSmsHandler extends InboundSmsHandler { if (SmsEnvelope.TELESERVICE_WAP == teleService) { return processCdmaWapPdu(sms.getUserData(), sms.mMessageRef, sms.getOriginatingAddress(), sms.getTimestampMillis()); } else if (SmsEnvelope.TELESERVICE_CT_WAP == teleService) { /* China Telecom WDP header contains Message identifier and User data subparametrs extract these fields */ if (!sms.processCdmaCTWdpHeader(sms)) { return Intents.RESULT_SMS_HANDLED; } return processCdmaWapPdu(sms.getUserData(), sms.mMessageRef, sms.getOriginatingAddress(), sms.getTimestampMillis()); } return dispatchNormalMessage(smsb); Loading
src/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java 100755 → 100644 +8 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.app.Activity; import android.app.PendingIntent; import android.app.PendingIntent.CanceledException; import android.content.Intent; import android.content.Context; import android.os.Message; import android.os.SystemProperties; import android.provider.Telephony.Sms; Loading Loading @@ -152,6 +153,13 @@ public class CdmaSMSDispatcher extends SMSDispatcher { uData.userDataHeader = smsHeader; if (encoding == SmsConstants.ENCODING_7BIT) { uData.msgEncoding = UserData.ENCODING_GSM_7BIT_ALPHABET; Context context = mPhone.getContext(); boolean ascii7bitForLongMsg = context.getResources(). getBoolean(com.android.internal.R.bool.config_ascii_7bit_support_for_long_message); if (ascii7bitForLongMsg) { Rlog.d(TAG, "ascii7bitForLongMsg = " + ascii7bitForLongMsg); uData.msgEncoding = UserData.ENCODING_7BIT_ASCII; } } else { // assume UTF-16 uData.msgEncoding = UserData.ENCODING_UNICODE_16; } Loading
src/java/com/android/internal/telephony/cdma/SmsMessage.java +64 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.internal.telephony.cdma; import android.content.Context; import android.os.Parcel; import android.os.SystemProperties; import android.telephony.PhoneNumberUtils; Loading @@ -28,6 +29,7 @@ import android.telephony.Rlog; import android.util.Log; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.SmsConstants; import com.android.internal.telephony.SmsHeader; import com.android.internal.telephony.SmsMessageBase; Loading Loading @@ -922,6 +924,13 @@ public class SmsMessage extends SmsMessageBase { int teleservice = bearerData.hasUserDataHeader ? SmsEnvelope.TELESERVICE_WEMT : SmsEnvelope.TELESERVICE_WMT; Context context = PhoneFactory.getContext(); boolean ascii7bitForLongMsg = context.getResources(). getBoolean(com.android.internal.R.bool.config_ascii_7bit_support_for_long_message); if (ascii7bitForLongMsg) { Rlog.d(LOG_TAG, "ascii7bitForLongMsg = " + ascii7bitForLongMsg); teleservice = SmsEnvelope.TELESERVICE_WMT; } SmsEnvelope envelope = new SmsEnvelope(); envelope.messageType = SmsEnvelope.MESSAGE_TYPE_POINT_TO_POINT; envelope.teleService = teleservice; Loading Loading @@ -1079,4 +1088,59 @@ public class SmsMessage extends SmsMessageBase { public ArrayList<CdmaSmsCbProgramData> getSmsCbProgramData() { return mBearerData.serviceCategoryProgramData; } /** * CT WDP header contains WDP Msg Identifier and WDP Userdata */ protected boolean processCdmaCTWdpHeader(SmsMessage sms) { int subparamId = 0; int subParamLen = 0; int msgID = 0; boolean decodeSuccess = false; try { BitwiseInputStream inStream = new BitwiseInputStream(sms.getUserData()); /* Decode WDP Messsage Identifier */ subparamId = inStream.read(8); if (subparamId != 0) { Rlog.e(LOG_TAG, "Invalid WDP SubparameterId"); return false; } subParamLen = inStream.read(8); if (subParamLen != 3) { Rlog.e(LOG_TAG, "Invalid WDP subparameter length"); return false; } sms.mBearerData.messageType = inStream.read(4); msgID = inStream.read(8) << 8; msgID |= inStream.read(8); sms.mBearerData.hasUserDataHeader = (inStream.read(1) == 1); if (sms.mBearerData.hasUserDataHeader) { Rlog.e(LOG_TAG, "Invalid WDP UserData header value"); return false; } inStream.skip(3); sms.mBearerData.messageId = msgID; sms.mMessageRef = msgID; /* Decode WDP User Data */ subparamId = inStream.read(8); subParamLen = inStream.read(8) * 8; sms.mBearerData.userData.msgEncoding = inStream.read(5); int consumedBits = 5; if (sms.mBearerData.userData.msgEncoding != 0) { Rlog.e(LOG_TAG, "Invalid WDP encoding"); return false; } sms.mBearerData.userData.numFields = inStream.read(8); consumedBits += 8; int dataBits = subParamLen - consumedBits; sms.mBearerData.userData.payload = inStream.readByteArray(dataBits); sms.mUserData = sms.mBearerData.userData.payload; decodeSuccess = true; } catch (BitwiseInputStream.AccessException ex) { Rlog.e(LOG_TAG, "CT WDP Header decode failed: " + ex); } return decodeSuccess; } }
src/java/com/android/internal/telephony/cdma/sms/BearerData.java +41 −0 Original line number Diff line number Diff line Loading @@ -604,6 +604,45 @@ public final class BearerData { System.arraycopy(payload, 0, uData.payload, udhBytes, payload.length); } private static void encode7bitAsciiEms(UserData uData, byte[] udhData, boolean force) throws CodingException { try { Rlog.d(LOG_TAG, "encode7bitAsciiEms"); int udhBytes = udhData.length + 1; // Add length octet. int udhSeptets = ((udhBytes * 8) + 6) / 7; int paddingBits = (udhSeptets * 7) - (udhBytes * 8); String msg = uData.payloadStr; byte[] payload ; int msgLen = msg.length(); BitwiseOutputStream outStream = new BitwiseOutputStream(msgLen + (paddingBits > 0 ? 1 : 0)); outStream.write(paddingBits, 0); for (int i = 0; i < msgLen; i++) { int charCode = UserData.charToAscii.get(msg.charAt(i), -1); if (charCode == -1) { if (force) { outStream.write(7, UserData.UNENCODABLE_7_BIT_CHAR); } else { throw new CodingException("cannot ASCII encode (" + msg.charAt(i) + ")"); } } else { outStream.write(7, charCode); } } payload = outStream.toByteArray(); uData.msgEncoding = UserData.ENCODING_7BIT_ASCII; uData.msgEncodingSet = true; uData.numFields = udhSeptets + uData.payloadStr.length(); uData.payload = new byte[udhBytes + payload.length]; uData.payload[0] = (byte)udhData.length; System.arraycopy(udhData, 0, uData.payload, 1, udhData.length); System.arraycopy(payload, 0, uData.payload, udhBytes, payload.length); } catch (BitwiseOutputStream.AccessException ex) { throw new CodingException("7bit ASCII encode failed: " + ex); } } private static void encodeEmsUserDataPayload(UserData uData) throws CodingException { Loading @@ -613,6 +652,8 @@ public final class BearerData { encode7bitEms(uData, headerData, true); } else if (uData.msgEncoding == UserData.ENCODING_UNICODE_16) { encode16bitEms(uData, headerData); } else if (uData.msgEncoding == UserData.ENCODING_7BIT_ASCII) { encode7bitAsciiEms(uData, headerData, true); } else { throw new CodingException("unsupported EMS user data encoding (" + uData.msgEncoding + ")"); Loading
src/java/com/android/internal/telephony/cdma/sms/SmsEnvelope.java +1 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ public final class SmsEnvelope { static public final int TELESERVICE_WAP = 0x1004; static public final int TELESERVICE_WEMT = 0x1005; static public final int TELESERVICE_SCPT = 0x1006; static public final int TELESERVICE_CT_WAP = 0xFDEA; /** * The following are defined as extensions to the standard teleservices Loading