1767a662ecde33c3979bf02b793d392aca0403162Wink Saville/* 2767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Copyright (C) 2008 The Android Open Source Project 3767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 4767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5767a662ecde33c3979bf02b793d392aca0403162Wink Saville * you may not use this file except in compliance with the License. 6767a662ecde33c3979bf02b793d392aca0403162Wink Saville * You may obtain a copy of the License at 7767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 8767a662ecde33c3979bf02b793d392aca0403162Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 9767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 10767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Unless required by applicable law or agreed to in writing, software 11767a662ecde33c3979bf02b793d392aca0403162Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12767a662ecde33c3979bf02b793d392aca0403162Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13767a662ecde33c3979bf02b793d392aca0403162Wink Saville * See the License for the specific language governing permissions and 14767a662ecde33c3979bf02b793d392aca0403162Wink Saville * limitations under the License. 15767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 16767a662ecde33c3979bf02b793d392aca0403162Wink Saville 17767a662ecde33c3979bf02b793d392aca0403162Wink Savillepackage com.android.internal.telephony; 18767a662ecde33c3979bf02b793d392aca0403162Wink Saville 19767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.util.Log; 20767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.SmsHeader; 21767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport java.util.Arrays; 22767a662ecde33c3979bf02b793d392aca0403162Wink Saville 23767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static android.telephony.SmsMessage.MessageClass; 24fdf3b26ba78ed308f45a2c6f79a5f977663ac3c8Wei Huangimport android.provider.Telephony; 25767a662ecde33c3979bf02b793d392aca0403162Wink Saville 26767a662ecde33c3979bf02b793d392aca0403162Wink Saville/** 27767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Base class declaring the specific methods and members for SmsMessage. 28767a662ecde33c3979bf02b793d392aca0403162Wink Saville * {@hide} 29767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 30767a662ecde33c3979bf02b793d392aca0403162Wink Savillepublic abstract class SmsMessageBase { 31767a662ecde33c3979bf02b793d392aca0403162Wink Saville private static final String LOG_TAG = "SMS"; 32767a662ecde33c3979bf02b793d392aca0403162Wink Saville 33767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** {@hide} The address of the SMSC. May be null */ 34767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String scAddress; 35767a662ecde33c3979bf02b793d392aca0403162Wink Saville 36767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** {@hide} The address of the sender */ 37767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected SmsAddress originatingAddress; 38767a662ecde33c3979bf02b793d392aca0403162Wink Saville 39767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** {@hide} The message body as a string. May be null if the message isn't text */ 40767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String messageBody; 41767a662ecde33c3979bf02b793d392aca0403162Wink Saville 42767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** {@hide} */ 43767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String pseudoSubject; 44767a662ecde33c3979bf02b793d392aca0403162Wink Saville 45767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** {@hide} Non-null if this is an email gateway message */ 46767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String emailFrom; 47767a662ecde33c3979bf02b793d392aca0403162Wink Saville 48767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** {@hide} Non-null if this is an email gateway message */ 49767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String emailBody; 50767a662ecde33c3979bf02b793d392aca0403162Wink Saville 51767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** {@hide} */ 52767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected boolean isEmail; 53767a662ecde33c3979bf02b793d392aca0403162Wink Saville 54767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** {@hide} */ 55767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected long scTimeMillis; 56767a662ecde33c3979bf02b793d392aca0403162Wink Saville 57767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** {@hide} The raw PDU of the message */ 58767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected byte[] mPdu; 59767a662ecde33c3979bf02b793d392aca0403162Wink Saville 60767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** {@hide} The raw bytes for the user data section of the message */ 61767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected byte[] userData; 62767a662ecde33c3979bf02b793d392aca0403162Wink Saville 63767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** {@hide} */ 64767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected SmsHeader userDataHeader; 65767a662ecde33c3979bf02b793d392aca0403162Wink Saville 66767a662ecde33c3979bf02b793d392aca0403162Wink Saville // "Message Waiting Indication Group" 67767a662ecde33c3979bf02b793d392aca0403162Wink Saville // 23.038 Section 4 68767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** {@hide} */ 69767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected boolean isMwi; 70767a662ecde33c3979bf02b793d392aca0403162Wink Saville 71767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** {@hide} */ 72767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected boolean mwiSense; 73767a662ecde33c3979bf02b793d392aca0403162Wink Saville 74767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** {@hide} */ 75767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected boolean mwiDontStore; 76767a662ecde33c3979bf02b793d392aca0403162Wink Saville 77767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 78767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Indicates status for messages stored on the ICC. 79767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 80767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected int statusOnIcc = -1; 81767a662ecde33c3979bf02b793d392aca0403162Wink Saville 82767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 83767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Record index of message in the EF. 84767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 85767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected int indexOnIcc = -1; 86767a662ecde33c3979bf02b793d392aca0403162Wink Saville 87767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** TP-Message-Reference - Message Reference of sent message. @hide */ 88767a662ecde33c3979bf02b793d392aca0403162Wink Saville public int messageRef; 89767a662ecde33c3979bf02b793d392aca0403162Wink Saville 90fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink /** 91fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink * For a specific text string, this object describes protocol 92fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink * properties of encoding it for transmission as message user 93fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink * data. 94fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink */ 95fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink public static class TextEncodingDetails { 96fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink /** 97fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink *The number of SMS's required to encode the text. 98fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink */ 99fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink public int msgCount; 100fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink 101fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink /** 102fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink * The number of code units consumed so far, where code units 103fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink * are basically characters in the encoding -- for example, 104fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink * septets for the standard ASCII and GSM encodings, and 16 105fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink * bits for Unicode. 106fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink */ 107fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink public int codeUnitCount; 108fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink 109fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink /** 110fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink * How many code units are still available without spilling 111fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink * into an additional message. 112fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink */ 113fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink public int codeUnitsRemaining; 114fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink 115fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink /** 116fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink * The encoding code unit size (specified using 117fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink * android.telephony.SmsMessage ENCODING_*). 118fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink */ 119fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink public int codeUnitSize; 12095434bfaee62161ce02012c6424f0c0c8fffccb5Tammo Spalink 121b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby /** 122b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * The GSM national language table to use, or 0 for the default 7-bit alphabet. 123b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby */ 124b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby public int languageTable; 125b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 126b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby /** 127b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * The GSM national language shift table to use, or 0 for the default 7-bit extension table. 128b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby */ 129b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby public int languageShiftTable; 130b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 13195434bfaee62161ce02012c6424f0c0c8fffccb5Tammo Spalink @Override 13295434bfaee62161ce02012c6424f0c0c8fffccb5Tammo Spalink public String toString() { 13395434bfaee62161ce02012c6424f0c0c8fffccb5Tammo Spalink return "TextEncodingDetails " + 13495434bfaee62161ce02012c6424f0c0c8fffccb5Tammo Spalink "{ msgCount=" + msgCount + 13595434bfaee62161ce02012c6424f0c0c8fffccb5Tammo Spalink ", codeUnitCount=" + codeUnitCount + 13695434bfaee62161ce02012c6424f0c0c8fffccb5Tammo Spalink ", codeUnitsRemaining=" + codeUnitsRemaining + 13795434bfaee62161ce02012c6424f0c0c8fffccb5Tammo Spalink ", codeUnitSize=" + codeUnitSize + 138b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby ", languageTable=" + languageTable + 139b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby ", languageShiftTable=" + languageShiftTable + 14095434bfaee62161ce02012c6424f0c0c8fffccb5Tammo Spalink " }"; 14195434bfaee62161ce02012c6424f0c0c8fffccb5Tammo Spalink } 142fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink } 143fc78f358cb1d1cee99758bcd6ef998a122ef27c9Tammo Spalink 1440da3bdb476086db02a1076780676b21e239c79d6Jaikumar Ganesh // TODO(): This class is duplicated in SmsMessage.java. Refactor accordingly. 145767a662ecde33c3979bf02b793d392aca0403162Wink Saville public static abstract class SubmitPduBase { 146767a662ecde33c3979bf02b793d392aca0403162Wink Saville public byte[] encodedScAddress; // Null if not applicable. 147767a662ecde33c3979bf02b793d392aca0403162Wink Saville public byte[] encodedMessage; 148767a662ecde33c3979bf02b793d392aca0403162Wink Saville 149767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String toString() { 150767a662ecde33c3979bf02b793d392aca0403162Wink Saville return "SubmitPdu: encodedScAddress = " 151767a662ecde33c3979bf02b793d392aca0403162Wink Saville + Arrays.toString(encodedScAddress) 152767a662ecde33c3979bf02b793d392aca0403162Wink Saville + ", encodedMessage = " 153767a662ecde33c3979bf02b793d392aca0403162Wink Saville + Arrays.toString(encodedMessage); 154767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 155767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 156767a662ecde33c3979bf02b793d392aca0403162Wink Saville 157767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 158767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns the address of the SMS service center that relayed this message 159767a662ecde33c3979bf02b793d392aca0403162Wink Saville * or null if there is none. 160767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 161767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getServiceCenterAddress() { 162767a662ecde33c3979bf02b793d392aca0403162Wink Saville return scAddress; 163767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 164767a662ecde33c3979bf02b793d392aca0403162Wink Saville 165767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 166767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns the originating address (sender) of this SMS message in String 167767a662ecde33c3979bf02b793d392aca0403162Wink Saville * form or null if unavailable 168767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 169767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getOriginatingAddress() { 170767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (originatingAddress == null) { 171767a662ecde33c3979bf02b793d392aca0403162Wink Saville return null; 172767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 173767a662ecde33c3979bf02b793d392aca0403162Wink Saville 174767a662ecde33c3979bf02b793d392aca0403162Wink Saville return originatingAddress.getAddressString(); 175767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 176767a662ecde33c3979bf02b793d392aca0403162Wink Saville 177767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 178767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns the originating address, or email from address if this message 179767a662ecde33c3979bf02b793d392aca0403162Wink Saville * was from an email gateway. Returns null if originating address 180767a662ecde33c3979bf02b793d392aca0403162Wink Saville * unavailable. 181767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 182767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getDisplayOriginatingAddress() { 183767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (isEmail) { 184767a662ecde33c3979bf02b793d392aca0403162Wink Saville return emailFrom; 185767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 186767a662ecde33c3979bf02b793d392aca0403162Wink Saville return getOriginatingAddress(); 187767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 188767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 189767a662ecde33c3979bf02b793d392aca0403162Wink Saville 190767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 191767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns the message body as a String, if it exists and is text based. 192767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @return message body is there is one, otherwise null 193767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 194767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getMessageBody() { 195767a662ecde33c3979bf02b793d392aca0403162Wink Saville return messageBody; 196767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 197767a662ecde33c3979bf02b793d392aca0403162Wink Saville 198767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 199767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns the class of this message. 200767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 201767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract MessageClass getMessageClass(); 202767a662ecde33c3979bf02b793d392aca0403162Wink Saville 203767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 204767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns the message body, or email message body if this message was from 205767a662ecde33c3979bf02b793d392aca0403162Wink Saville * an email gateway. Returns null if message body unavailable. 206767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 207767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getDisplayMessageBody() { 208767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (isEmail) { 209767a662ecde33c3979bf02b793d392aca0403162Wink Saville return emailBody; 210767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 211767a662ecde33c3979bf02b793d392aca0403162Wink Saville return getMessageBody(); 212767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 213767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 214767a662ecde33c3979bf02b793d392aca0403162Wink Saville 215767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 216767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Unofficial convention of a subject line enclosed in parens empty string 217767a662ecde33c3979bf02b793d392aca0403162Wink Saville * if not present 218767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 219767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getPseudoSubject() { 220767a662ecde33c3979bf02b793d392aca0403162Wink Saville return pseudoSubject == null ? "" : pseudoSubject; 221767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 222767a662ecde33c3979bf02b793d392aca0403162Wink Saville 223767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 224767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns the service centre timestamp in currentTimeMillis() format 225767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 226767a662ecde33c3979bf02b793d392aca0403162Wink Saville public long getTimestampMillis() { 227767a662ecde33c3979bf02b793d392aca0403162Wink Saville return scTimeMillis; 228767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 229767a662ecde33c3979bf02b793d392aca0403162Wink Saville 230767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 231767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns true if message is an email. 232767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 233767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @return true if this message came through an email gateway and email 234767a662ecde33c3979bf02b793d392aca0403162Wink Saville * sender / subject / parsed body are available 235767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 236767a662ecde33c3979bf02b793d392aca0403162Wink Saville public boolean isEmail() { 237767a662ecde33c3979bf02b793d392aca0403162Wink Saville return isEmail; 238767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 239767a662ecde33c3979bf02b793d392aca0403162Wink Saville 240767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 241767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @return if isEmail() is true, body of the email sent through the gateway. 242767a662ecde33c3979bf02b793d392aca0403162Wink Saville * null otherwise 243767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 244767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getEmailBody() { 245767a662ecde33c3979bf02b793d392aca0403162Wink Saville return emailBody; 246767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 247767a662ecde33c3979bf02b793d392aca0403162Wink Saville 248767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 249767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @return if isEmail() is true, email from address of email sent through 250767a662ecde33c3979bf02b793d392aca0403162Wink Saville * the gateway. null otherwise 251767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 252767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getEmailFrom() { 253767a662ecde33c3979bf02b793d392aca0403162Wink Saville return emailFrom; 254767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 255767a662ecde33c3979bf02b793d392aca0403162Wink Saville 256767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 257767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Get protocol identifier. 258767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 259767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract int getProtocolIdentifier(); 260767a662ecde33c3979bf02b793d392aca0403162Wink Saville 261767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 262767a662ecde33c3979bf02b793d392aca0403162Wink Saville * See TS 23.040 9.2.3.9 returns true if this is a "replace short message" 263767a662ecde33c3979bf02b793d392aca0403162Wink Saville * SMS 264767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 265767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract boolean isReplace(); 266767a662ecde33c3979bf02b793d392aca0403162Wink Saville 267767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 268767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns true for CPHS MWI toggle message. 269767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 270767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @return true if this is a CPHS MWI toggle message See CPHS 4.2 section 271767a662ecde33c3979bf02b793d392aca0403162Wink Saville * B.4.2 272767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 273767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract boolean isCphsMwiMessage(); 274767a662ecde33c3979bf02b793d392aca0403162Wink Saville 275767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 276767a662ecde33c3979bf02b793d392aca0403162Wink Saville * returns true if this message is a CPHS voicemail / message waiting 277767a662ecde33c3979bf02b793d392aca0403162Wink Saville * indicator (MWI) clear message 278767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 279767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract boolean isMWIClearMessage(); 280767a662ecde33c3979bf02b793d392aca0403162Wink Saville 281767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 282767a662ecde33c3979bf02b793d392aca0403162Wink Saville * returns true if this message is a CPHS voicemail / message waiting 283767a662ecde33c3979bf02b793d392aca0403162Wink Saville * indicator (MWI) set message 284767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 285767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract boolean isMWISetMessage(); 286767a662ecde33c3979bf02b793d392aca0403162Wink Saville 287767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 288767a662ecde33c3979bf02b793d392aca0403162Wink Saville * returns true if this message is a "Message Waiting Indication Group: 289767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Discard Message" notification and should not be stored. 290767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 291767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract boolean isMwiDontStore(); 292767a662ecde33c3979bf02b793d392aca0403162Wink Saville 293767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 294767a662ecde33c3979bf02b793d392aca0403162Wink Saville * returns the user data section minus the user data header if one was 295767a662ecde33c3979bf02b793d392aca0403162Wink Saville * present. 296767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 297767a662ecde33c3979bf02b793d392aca0403162Wink Saville public byte[] getUserData() { 298767a662ecde33c3979bf02b793d392aca0403162Wink Saville return userData; 299767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 300767a662ecde33c3979bf02b793d392aca0403162Wink Saville 301767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 302767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns an object representing the user data header 303767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 304767a662ecde33c3979bf02b793d392aca0403162Wink Saville * {@hide} 305767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 306767a662ecde33c3979bf02b793d392aca0403162Wink Saville public SmsHeader getUserDataHeader() { 307767a662ecde33c3979bf02b793d392aca0403162Wink Saville return userDataHeader; 308767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 309767a662ecde33c3979bf02b793d392aca0403162Wink Saville 310767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 31164c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink * TODO(cleanup): The term PDU is used in a seemingly non-unique 31264c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink * manner -- for example, what is the difference between this byte 31364c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink * array and the contents of SubmitPdu objects. Maybe a more 31464c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink * illustrative term would be appropriate. 31564c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink */ 31664c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink 31764c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink /** 318767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns the raw PDU for the message. 319767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 320767a662ecde33c3979bf02b793d392aca0403162Wink Saville public byte[] getPdu() { 321767a662ecde33c3979bf02b793d392aca0403162Wink Saville return mPdu; 322767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 323767a662ecde33c3979bf02b793d392aca0403162Wink Saville 324767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 325767a662ecde33c3979bf02b793d392aca0403162Wink Saville * For an SMS-STATUS-REPORT message, this returns the status field from 326767a662ecde33c3979bf02b793d392aca0403162Wink Saville * the status report. This field indicates the status of a previously 327767a662ecde33c3979bf02b793d392aca0403162Wink Saville * submitted SMS, if requested. See TS 23.040, 9.2.3.15 TP-Status for a 328767a662ecde33c3979bf02b793d392aca0403162Wink Saville * description of values. 329767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 330767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @return 0 indicates the previously sent message was received. 331767a662ecde33c3979bf02b793d392aca0403162Wink Saville * See TS 23.040, 9.9.2.3.15 for a description of other possible 332767a662ecde33c3979bf02b793d392aca0403162Wink Saville * values. 333767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 334767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract int getStatus(); 335767a662ecde33c3979bf02b793d392aca0403162Wink Saville 336767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 337767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Return true iff the message is a SMS-STATUS-REPORT message. 338767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 339767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract boolean isStatusReportMessage(); 340767a662ecde33c3979bf02b793d392aca0403162Wink Saville 341767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 342767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns true iff the <code>TP-Reply-Path</code> bit is set in 343767a662ecde33c3979bf02b793d392aca0403162Wink Saville * this message. 344767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 345767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract boolean isReplyPathPresent(); 346767a662ecde33c3979bf02b793d392aca0403162Wink Saville 347767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 348767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns the status of the message on the ICC (read, unread, sent, unsent). 349767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 350767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @return the status of the message on the ICC. These are: 351767a662ecde33c3979bf02b793d392aca0403162Wink Saville * SmsManager.STATUS_ON_ICC_FREE 352767a662ecde33c3979bf02b793d392aca0403162Wink Saville * SmsManager.STATUS_ON_ICC_READ 353767a662ecde33c3979bf02b793d392aca0403162Wink Saville * SmsManager.STATUS_ON_ICC_UNREAD 354767a662ecde33c3979bf02b793d392aca0403162Wink Saville * SmsManager.STATUS_ON_ICC_SEND 355767a662ecde33c3979bf02b793d392aca0403162Wink Saville * SmsManager.STATUS_ON_ICC_UNSENT 356767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 357767a662ecde33c3979bf02b793d392aca0403162Wink Saville public int getStatusOnIcc() { 358767a662ecde33c3979bf02b793d392aca0403162Wink Saville return statusOnIcc; 359767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 360767a662ecde33c3979bf02b793d392aca0403162Wink Saville 361767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 362767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns the record index of the message on the ICC (1-based index). 363767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @return the record index of the message on the ICC, or -1 if this 364767a662ecde33c3979bf02b793d392aca0403162Wink Saville * SmsMessage was not created from a ICC SMS EF record. 365767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 366767a662ecde33c3979bf02b793d392aca0403162Wink Saville public int getIndexOnIcc() { 367767a662ecde33c3979bf02b793d392aca0403162Wink Saville return indexOnIcc; 368767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 369767a662ecde33c3979bf02b793d392aca0403162Wink Saville 370767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void parseMessageBody() { 371faf4413dffdc9079683b951736088ff2a01073a4jsh // originatingAddress could be null if this message is from a status 372faf4413dffdc9079683b951736088ff2a01073a4jsh // report. 373faf4413dffdc9079683b951736088ff2a01073a4jsh if (originatingAddress != null && originatingAddress.couldBeEmailGateway()) { 374767a662ecde33c3979bf02b793d392aca0403162Wink Saville extractEmailAddressFromMessageBody(); 375767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 376767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 377767a662ecde33c3979bf02b793d392aca0403162Wink Saville 378767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 379daccacb865947c00f277f1823333e2fbf91e652aWink Saville * Try to parse this message as an email gateway message 380daccacb865947c00f277f1823333e2fbf91e652aWink Saville * There are two ways specified in TS 23.040 Section 3.8 : 381daccacb865947c00f277f1823333e2fbf91e652aWink Saville * - SMS message "may have its TP-PID set for internet electronic mail - MT 382767a662ecde33c3979bf02b793d392aca0403162Wink Saville * SMS format: [<from-address><space>]<message> - "Depending on the 383767a662ecde33c3979bf02b793d392aca0403162Wink Saville * nature of the gateway, the destination/origination address is either 384767a662ecde33c3979bf02b793d392aca0403162Wink Saville * derived from the content of the SMS TP-OA or TP-DA field, or the 385767a662ecde33c3979bf02b793d392aca0403162Wink Saville * TP-OA/TP-DA field contains a generic gateway address and the to/from 386daccacb865947c00f277f1823333e2fbf91e652aWink Saville * address is added at the beginning as shown above." (which is supported here) 387daccacb865947c00f277f1823333e2fbf91e652aWink Saville * - Multiple addreses separated by commas, no spaces, Subject field delimited 388daccacb865947c00f277f1823333e2fbf91e652aWink Saville * by '()' or '##' and '#' Section 9.2.3.24.11 (which are NOT supported here) 389767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 390767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void extractEmailAddressFromMessageBody() { 391767a662ecde33c3979bf02b793d392aca0403162Wink Saville 392daccacb865947c00f277f1823333e2fbf91e652aWink Saville /* Some carriers may use " /" delimiter as below 393767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 394767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 1. [x@y][ ]/[subject][ ]/[body] 395767a662ecde33c3979bf02b793d392aca0403162Wink Saville * -or- 396767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 2. [x@y][ ]/[body] 397767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 398bd55b0cb156280f44e82c50e02f9a07d6b528dcdSatish Roddom String[] parts = messageBody.split("( /)|( )", 2); 399001d0abd3e523dce5c8a4c14e22bd1ea79976f03jsh if (parts.length < 2) return; 400daccacb865947c00f277f1823333e2fbf91e652aWink Saville emailFrom = parts[0]; 401bd55b0cb156280f44e82c50e02f9a07d6b528dcdSatish Roddom emailBody = parts[1]; 402fdf3b26ba78ed308f45a2c6f79a5f977663ac3c8Wei Huang isEmail = Telephony.Mms.isEmailAddress(emailFrom); 403767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 404767a662ecde33c3979bf02b793d392aca0403162Wink Saville 405767a662ecde33c3979bf02b793d392aca0403162Wink Saville} 406