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