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