Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 27282ff8 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "Merge "Parsing of CDMA MMS notification carried by SMS""

parents 583e085e f6e91488
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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);
+8 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
        }
+64 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
    }
}
+41 −0
Original line number Diff line number Diff line
@@ -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
    {
@@ -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 + ")");
+1 −0
Original line number Diff line number Diff line
@@ -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