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