10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2008 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.SmsConstants;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.SmsHeader;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Arrays;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.provider.Telephony;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Base class declaring the specific methods and members for SmsMessage.
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic abstract class SmsMessageBase {
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String LOG_TAG = "SMS";
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@hide} The address of the SMSC. May be null */
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected String scAddress;
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@hide} The address of the sender */
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected SmsAddress originatingAddress;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@hide} The message body as a string. May be null if the message isn't text */
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected String messageBody;
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@hide} */
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected String pseudoSubject;
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@hide} Non-null if this is an email gateway message */
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected String emailFrom;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@hide} Non-null if this is an email gateway message */
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected String emailBody;
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@hide} */
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected boolean isEmail;
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@hide} */
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected long scTimeMillis;
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@hide} The raw PDU of the message */
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected byte[] mPdu;
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@hide} The raw bytes for the user data section of the message */
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected byte[] userData;
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@hide} */
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected SmsHeader userDataHeader;
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // "Message Waiting Indication Group"
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // 23.038 Section 4
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@hide} */
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected boolean isMwi;
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@hide} */
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected boolean mwiSense;
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@hide} */
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected boolean mwiDontStore;
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Indicates status for messages stored on the ICC.
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected int statusOnIcc = -1;
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Record index of message in the EF.
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected int indexOnIcc = -1;
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** TP-Message-Reference - Message Reference of sent message. @hide */
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int messageRef;
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // TODO(): This class is duplicated in SmsMessage.java. Refactor accordingly.
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static abstract class SubmitPduBase  {
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public byte[] encodedScAddress; // Null if not applicable.
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public byte[] encodedMessage;
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public String toString() {
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return "SubmitPdu: encodedScAddress = "
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + Arrays.toString(encodedScAddress)
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + ", encodedMessage = "
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + Arrays.toString(encodedMessage);
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the address of the SMS service center that relayed this message
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * or null if there is none.
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getServiceCenterAddress() {
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return scAddress;
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the originating address (sender) of this SMS message in String
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * form or null if unavailable
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getOriginatingAddress() {
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (originatingAddress == null) {
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return null;
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return originatingAddress.getAddressString();
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the originating address, or email from address if this message
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * was from an email gateway. Returns null if originating address
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * unavailable.
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getDisplayOriginatingAddress() {
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (isEmail) {
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return emailFrom;
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return getOriginatingAddress();
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the message body as a String, if it exists and is text based.
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return message body is there is one, otherwise null
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getMessageBody() {
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return messageBody;
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the class of this message.
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract SmsConstants.MessageClass getMessageClass();
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the message body, or email message body if this message was from
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * an email gateway. Returns null if message body unavailable.
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getDisplayMessageBody() {
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (isEmail) {
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return emailBody;
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return getMessageBody();
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Unofficial convention of a subject line enclosed in parens empty string
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * if not present
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getPseudoSubject() {
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return pseudoSubject == null ? "" : pseudoSubject;
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the service centre timestamp in currentTimeMillis() format
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getTimestampMillis() {
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return scTimeMillis;
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns true if message is an email.
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if this message came through an email gateway and email
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         sender / subject / parsed body are available
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isEmail() {
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return isEmail;
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return if isEmail() is true, body of the email sent through the gateway.
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         null otherwise
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getEmailBody() {
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return emailBody;
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return if isEmail() is true, email from address of email sent through
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         the gateway. null otherwise
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getEmailFrom() {
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return emailFrom;
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Get protocol identifier.
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract int getProtocolIdentifier();
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * See TS 23.040 9.2.3.9 returns true if this is a "replace short message"
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * SMS
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract boolean isReplace();
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns true for CPHS MWI toggle message.
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if this is a CPHS MWI toggle message See CPHS 4.2 section
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         B.4.2
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract boolean isCphsMwiMessage();
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * returns true if this message is a CPHS voicemail / message waiting
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * indicator (MWI) clear message
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract boolean isMWIClearMessage();
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * returns true if this message is a CPHS voicemail / message waiting
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * indicator (MWI) set message
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract boolean isMWISetMessage();
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * returns true if this message is a "Message Waiting Indication Group:
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Discard Message" notification and should not be stored.
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract boolean isMwiDontStore();
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * returns the user data section minus the user data header if one was
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * present.
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public byte[] getUserData() {
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return userData;
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns an object representing the user data header
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * {@hide}
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SmsHeader getUserDataHeader() {
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return userDataHeader;
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * TODO(cleanup): The term PDU is used in a seemingly non-unique
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * manner -- for example, what is the difference between this byte
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * array and the contents of SubmitPdu objects.  Maybe a more
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * illustrative term would be appropriate.
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the raw PDU for the message.
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public byte[] getPdu() {
2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mPdu;
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * For an SMS-STATUS-REPORT message, this returns the status field from
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the status report.  This field indicates the status of a previously
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * submitted SMS, if requested.  See TS 23.040, 9.2.3.15 TP-Status for a
2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * description of values.
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return 0 indicates the previously sent message was received.
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         See TS 23.040, 9.9.2.3.15 for a description of other possible
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         values.
2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract int getStatus();
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Return true iff the message is a SMS-STATUS-REPORT message.
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract boolean isStatusReportMessage();
2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns true iff the <code>TP-Reply-Path</code> bit is set in
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * this message.
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract boolean isReplyPathPresent();
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the status of the message on the ICC (read, unread, sent, unsent).
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return the status of the message on the ICC.  These are:
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_ICC_FREE
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_ICC_READ
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_ICC_UNREAD
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_ICC_SEND
3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_ICC_UNSENT
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getStatusOnIcc() {
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return statusOnIcc;
3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the record index of the message on the ICC (1-based index).
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return the record index of the message on the ICC, or -1 if this
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsMessage was not created from a ICC SMS EF record.
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getIndexOnIcc() {
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return indexOnIcc;
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void parseMessageBody() {
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // originatingAddress could be null if this message is from a status
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // report.
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (originatingAddress != null && originatingAddress.couldBeEmailGateway()) {
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            extractEmailAddressFromMessageBody();
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Try to parse this message as an email gateway message
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * There are two ways specified in TS 23.040 Section 3.8 :
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  - SMS message "may have its TP-PID set for Internet electronic mail - MT
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * SMS format: [<from-address><space>]<message> - "Depending on the
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * nature of the gateway, the destination/origination address is either
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * derived from the content of the SMS TP-OA or TP-DA field, or the
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * TP-OA/TP-DA field contains a generic gateway address and the to/from
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * address is added at the beginning as shown above." (which is supported here)
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * - Multiple addresses separated by commas, no spaces, Subject field delimited
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * by '()' or '##' and '#' Section 9.2.3.24.11 (which are NOT supported here)
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void extractEmailAddressFromMessageBody() {
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /* Some carriers may use " /" delimiter as below
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * 1. [x@y][ ]/[subject][ ]/[body]
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * -or-
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * 2. [x@y][ ]/[body]
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         */
3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         String[] parts = messageBody.split("( /)|( )", 2);
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         if (parts.length < 2) return;
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         emailFrom = parts[0];
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         emailBody = parts[1];
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         isEmail = Telephony.Mms.isEmailAddress(emailFrom);
3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
351