1/*
2 * Copyright (C) 2007-2008 Esmertec AG.
3 * Copyright (C) 2007-2008 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package android.support.v7.mms.pdu;
19
20import android.util.Log;
21
22public class SendReq extends MultimediaMessagePdu {
23    private static final String TAG = "SendReq";
24
25    public SendReq() {
26        super();
27
28        try {
29            setMessageType(PduHeaders.MESSAGE_TYPE_SEND_REQ);
30            setMmsVersion(PduHeaders.CURRENT_MMS_VERSION);
31            // FIXME: Content-type must be decided according to whether
32            // SMIL part present.
33            setContentType("application/vnd.wap.multipart.related".getBytes());
34            setFrom(new EncodedStringValue(PduHeaders.FROM_INSERT_ADDRESS_TOKEN_STR.getBytes()));
35            setTransactionId(generateTransactionId());
36        } catch (InvalidHeaderValueException e) {
37            // Impossible to reach here since all headers we set above are valid.
38            Log.e(TAG, "Unexpected InvalidHeaderValueException.", e);
39            throw new RuntimeException(e);
40        }
41    }
42
43    private byte[] generateTransactionId() {
44        String transactionId = "T" + Long.toHexString(System.currentTimeMillis());
45        return transactionId.getBytes();
46    }
47
48    /**
49     * Constructor, used when composing a M-Send.req pdu.
50     *
51     * @param contentType the content type value
52     * @param from the from value
53     * @param mmsVersion current viersion of mms
54     * @param transactionId the transaction-id value
55     * @throws InvalidHeaderValueException if parameters are invalid.
56     *         NullPointerException if contentType, form or transactionId is null.
57     */
58    public SendReq(byte[] contentType,
59                   EncodedStringValue from,
60                   int mmsVersion,
61                   byte[] transactionId) throws InvalidHeaderValueException {
62        super();
63        setMessageType(PduHeaders.MESSAGE_TYPE_SEND_REQ);
64        setContentType(contentType);
65        setFrom(from);
66        setMmsVersion(mmsVersion);
67        setTransactionId(transactionId);
68    }
69
70    /**
71     * Constructor with given headers.
72     *
73     * @param headers Headers for this PDU.
74     */
75    SendReq(PduHeaders headers) {
76        super(headers);
77    }
78
79    /**
80     * Constructor with given headers and body
81     *
82     * @param headers Headers for this PDU.
83     * @param body Body of this PDu.
84     */
85    SendReq(PduHeaders headers, PduBody body) {
86        super(headers, body);
87    }
88
89    /**
90     * Get Bcc value.
91     *
92     * @return the value
93     */
94    public EncodedStringValue[] getBcc() {
95        return mPduHeaders.getEncodedStringValues(PduHeaders.BCC);
96    }
97
98    /**
99     * Add a "BCC" value.
100     *
101     * @param value the value
102     * @throws NullPointerException if the value is null.
103     */
104    public void addBcc(EncodedStringValue value) {
105        mPduHeaders.appendEncodedStringValue(value, PduHeaders.BCC);
106    }
107
108    /**
109     * Set "BCC" value.
110     *
111     * @param value the value
112     * @throws NullPointerException if the value is null.
113     */
114    public void setBcc(EncodedStringValue[] value) {
115        mPduHeaders.setEncodedStringValues(value, PduHeaders.BCC);
116    }
117
118    /**
119     * Get CC value.
120     *
121     * @return the value
122     */
123    public EncodedStringValue[] getCc() {
124        return mPduHeaders.getEncodedStringValues(PduHeaders.CC);
125    }
126
127    /**
128     * Add a "CC" value.
129     *
130     * @param value the value
131     * @throws NullPointerException if the value is null.
132     */
133    public void addCc(EncodedStringValue value) {
134        mPduHeaders.appendEncodedStringValue(value, PduHeaders.CC);
135    }
136
137    /**
138     * Set "CC" value.
139     *
140     * @param value the value
141     * @throws NullPointerException if the value is null.
142     */
143    public void setCc(EncodedStringValue[] value) {
144        mPduHeaders.setEncodedStringValues(value, PduHeaders.CC);
145    }
146
147    /**
148     * Get Content-type value.
149     *
150     * @return the value
151     */
152    public byte[] getContentType() {
153        return mPduHeaders.getTextString(PduHeaders.CONTENT_TYPE);
154    }
155
156    /**
157     * Set Content-type value.
158     *
159     * @param value the value
160     * @throws NullPointerException if the value is null.
161     */
162    public void setContentType(byte[] value) {
163        mPduHeaders.setTextString(value, PduHeaders.CONTENT_TYPE);
164    }
165
166    /**
167     * Get X-Mms-Delivery-Report value.
168     *
169     * @return the value
170     */
171    public int getDeliveryReport() {
172        return mPduHeaders.getOctet(PduHeaders.DELIVERY_REPORT);
173    }
174
175    /**
176     * Set X-Mms-Delivery-Report value.
177     *
178     * @param value the value
179     * @throws InvalidHeaderValueException if the value is invalid.
180     */
181    public void setDeliveryReport(int value) throws InvalidHeaderValueException {
182        mPduHeaders.setOctet(value, PduHeaders.DELIVERY_REPORT);
183    }
184
185    /**
186     * Get X-Mms-Expiry value.
187     *
188     * Expiry-value = Value-length
189     *      (Absolute-token Date-value | Relative-token Delta-seconds-value)
190     *
191     * @return the value
192     */
193    public long getExpiry() {
194        return mPduHeaders.getLongInteger(PduHeaders.EXPIRY);
195    }
196
197    /**
198     * Set X-Mms-Expiry value.
199     *
200     * @param value the value
201     */
202    public void setExpiry(long value) {
203        mPduHeaders.setLongInteger(value, PduHeaders.EXPIRY);
204    }
205
206    /**
207     * Get X-Mms-MessageSize value.
208     *
209     * Expiry-value = size of message
210     *
211     * @return the value
212     */
213    public long getMessageSize() {
214        return mPduHeaders.getLongInteger(PduHeaders.MESSAGE_SIZE);
215    }
216
217    /**
218     * Set X-Mms-MessageSize value.
219     *
220     * @param value the value
221     */
222    public void setMessageSize(long value) {
223        mPduHeaders.setLongInteger(value, PduHeaders.MESSAGE_SIZE);
224    }
225
226    /**
227     * Get X-Mms-Message-Class value.
228     * Message-class-value = Class-identifier | Token-text
229     * Class-identifier = Personal | Advertisement | Informational | Auto
230     *
231     * @return the value
232     */
233    public byte[] getMessageClass() {
234        return mPduHeaders.getTextString(PduHeaders.MESSAGE_CLASS);
235    }
236
237    /**
238     * Set X-Mms-Message-Class value.
239     *
240     * @param value the value
241     * @throws NullPointerException if the value is null.
242     */
243    public void setMessageClass(byte[] value) {
244        mPduHeaders.setTextString(value, PduHeaders.MESSAGE_CLASS);
245    }
246
247    /**
248     * Get X-Mms-Read-Report value.
249     *
250     * @return the value
251     */
252    public int getReadReport() {
253        return mPduHeaders.getOctet(PduHeaders.READ_REPORT);
254    }
255
256    /**
257     * Set X-Mms-Read-Report value.
258     *
259     * @param value the value
260     * @throws InvalidHeaderValueException if the value is invalid.
261     */
262    public void setReadReport(int value) throws InvalidHeaderValueException {
263        mPduHeaders.setOctet(value, PduHeaders.READ_REPORT);
264    }
265
266    /**
267     * Set "To" value.
268     *
269     * @param value the value
270     * @throws NullPointerException if the value is null.
271     */
272    public void setTo(EncodedStringValue[] value) {
273        mPduHeaders.setEncodedStringValues(value, PduHeaders.TO);
274    }
275
276    /**
277     * Get X-Mms-Transaction-Id field value.
278     *
279     * @return the X-Mms-Report-Allowed value
280     */
281    public byte[] getTransactionId() {
282        return mPduHeaders.getTextString(PduHeaders.TRANSACTION_ID);
283    }
284
285    /**
286     * Set X-Mms-Transaction-Id field value.
287     *
288     * @param value the value
289     * @throws NullPointerException if the value is null.
290     */
291    public void setTransactionId(byte[] value) {
292        mPduHeaders.setTextString(value, PduHeaders.TRANSACTION_ID);
293    }
294
295    /*
296     * Optional, not supported header fields:
297     *
298     *     public byte getAdaptationAllowed() {return 0};
299     *     public void setAdaptationAllowed(btye value) {};
300     *
301     *     public byte[] getApplicId() {return null;}
302     *     public void setApplicId(byte[] value) {}
303     *
304     *     public byte[] getAuxApplicId() {return null;}
305     *     public void getAuxApplicId(byte[] value) {}
306     *
307     *     public byte getContentClass() {return 0x00;}
308     *     public void setApplicId(byte value) {}
309     *
310     *     public long getDeliveryTime() {return 0};
311     *     public void setDeliveryTime(long value) {};
312     *
313     *     public byte getDrmContent() {return 0x00;}
314     *     public void setDrmContent(byte value) {}
315     *
316     *     public MmFlagsValue getMmFlags() {return null;}
317     *     public void setMmFlags(MmFlagsValue value) {}
318     *
319     *     public MmStateValue getMmState() {return null;}
320     *     public void getMmState(MmStateValue value) {}
321     *
322     *     public byte[] getReplyApplicId() {return 0x00;}
323     *     public void setReplyApplicId(byte[] value) {}
324     *
325     *     public byte getReplyCharging() {return 0x00;}
326     *     public void setReplyCharging(byte value) {}
327     *
328     *     public byte getReplyChargingDeadline() {return 0x00;}
329     *     public void setReplyChargingDeadline(byte value) {}
330     *
331     *     public byte[] getReplyChargingId() {return 0x00;}
332     *     public void setReplyChargingId(byte[] value) {}
333     *
334     *     public long getReplyChargingSize() {return 0;}
335     *     public void setReplyChargingSize(long value) {}
336     *
337     *     public byte[] getReplyApplicId() {return 0x00;}
338     *     public void setReplyApplicId(byte[] value) {}
339     *
340     *     public byte getStore() {return 0x00;}
341     *     public void setStore(byte value) {}
342     */
343}
344