1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/*
2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2007-2008 Esmertec AG.
3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2007-2008 The Android Open Source Project
4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License");
6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License.
7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at
8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *      http://www.apache.org/licenses/LICENSE-2.0
10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software
12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS,
13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and
15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License.
16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */
17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.mmslib.pdu;
19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.net.Uri;
21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.util.SparseArray;
22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/**
24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * The pdu part.
25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */
26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class PduPart {
27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Well-Known Parameters.
29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_Q                  = 0x80;
31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_CHARSET            = 0x81;
32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_LEVEL              = 0x82;
33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_TYPE               = 0x83;
34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_DEP_NAME           = 0x85;
35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_DEP_FILENAME       = 0x86;
36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_DIFFERENCES        = 0x87;
37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_PADDING            = 0x88;
38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // This value of "TYPE" s used with Content-Type: multipart/related
39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_CT_MR_TYPE         = 0x89;
40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_DEP_START          = 0x8A;
41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_DEP_START_INFO     = 0x8B;
42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_DEP_COMMENT        = 0x8C;
43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_DEP_DOMAIN         = 0x8D;
44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_MAX_AGE            = 0x8E;
45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_DEP_PATH           = 0x8F;
46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_SECURE             = 0x90;
47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_SEC                = 0x91;
48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_MAC                = 0x92;
49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_CREATION_DATE      = 0x93;
50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_MODIFICATION_DATE  = 0x94;
51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_READ_DATE          = 0x95;
52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_SIZE               = 0x96;
53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_NAME               = 0x97;
54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_FILENAME           = 0x98;
55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_START              = 0x99;
56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_START_INFO         = 0x9A;
57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_COMMENT            = 0x9B;
58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_DOMAIN             = 0x9C;
59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_PATH               = 0x9D;
60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Header field names.
63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     public static final int P_CONTENT_TYPE       = 0x91;
65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     public static final int P_CONTENT_LOCATION   = 0x8E;
66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     public static final int P_CONTENT_ID         = 0xC0;
67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     public static final int P_DEP_CONTENT_DISPOSITION = 0xAE;
68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     public static final int P_CONTENT_DISPOSITION = 0xC5;
69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // The next header is unassigned header, use reserved header(0x48) value.
70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_CONTENT_TRANSFER_ENCODING = 0xC8;
71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Content=Transfer-Encoding string.
74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final String CONTENT_TRANSFER_ENCODING =
76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            "Content-Transfer-Encoding";
77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Value of Content-Transfer-Encoding.
80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final String P_BINARY = "binary";
82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final String P_7BIT = "7bit";
83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final String P_8BIT = "8bit";
84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final String P_BASE64 = "base64";
85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final String P_QUOTED_PRINTABLE = "quoted-printable";
86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Value of disposition can be set to PduPart when the value is octet in
89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * the PDU.
90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * "from-data" instead of Form-data<Octet 128>.
91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * "attachment" instead of Attachment<Octet 129>.
92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * "inline" instead of Inline<Octet 130>.
93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    static final byte[] DISPOSITION_FROM_DATA = "from-data".getBytes();
95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    static final byte[] DISPOSITION_ATTACHMENT = "attachment".getBytes();
96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    static final byte[] DISPOSITION_INLINE = "inline".getBytes();
97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Content-Disposition value.
100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_DISPOSITION_FROM_DATA = 0x80;
102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_DISPOSITION_ATTACHMENT = 0x81;
103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int P_DISPOSITION_INLINE = 0x82;
104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Header of part.
107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private SparseArray<Object> mPartHeader = null;
109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Data uri.
112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private Uri mUri = null;
114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Part data.
117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private byte[] mPartData = null;
119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final String TAG = "PduPart";
121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Empty Constructor.
124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public PduPart() {
126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPartHeader = new SparseArray<Object>();
127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Set part data. The data are stored as byte array.
131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param data the data
133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void setData(final byte[] data) {
135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPartData = data;
136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return The part data or null if the data wasn't set or
140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * the data is stored as Uri.
141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @see #getDataUri
142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public byte[] getData() {
144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mPartData;
145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Set data uri. The data are stored as Uri.
149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param uri the uri
151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void setDataUri(final Uri uri) {
153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mUri = uri;
154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return The Uri of the part data or null if the data wasn't set or
158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * the data is stored as byte array.
159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @see #getData
160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
161d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public Uri getDataUri() {
162d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mUri;
163d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
164d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Set Content-id value
167d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
168d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param contentId the content-id value
169d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @throws NullPointerException if the value is null.
170d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
171d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void setContentId(final byte[] contentId) {
172d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if ((contentId == null) || (contentId.length == 0)) {
173d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            throw new IllegalArgumentException(
174d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    "Content-Id may not be null or empty.");
175d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
176d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
177d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if ((contentId.length > 1)
178d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                && ((char) contentId[0] == '<')
179d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                && ((char) contentId[contentId.length - 1] == '>')) {
180d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mPartHeader.put(P_CONTENT_ID, contentId);
181d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return;
182d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
183d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
184d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // Insert beginning '<' and trailing '>' for Content-Id.
185d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final byte[] buffer = new byte[contentId.length + 2];
186d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        buffer[0] = (byte) (0xff & '<');
187d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        buffer[buffer.length - 1] = (byte) (0xff & '>');
188d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        System.arraycopy(contentId, 0, buffer, 1, contentId.length);
189d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPartHeader.put(P_CONTENT_ID, buffer);
190d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
191d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
192d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
193d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Get Content-id value.
194d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
195d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return the value
196d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
197d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public byte[] getContentId() {
198d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return (byte[]) mPartHeader.get(P_CONTENT_ID);
199d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
200d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
201d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
202d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Set Char-set value.
203d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
204d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param charset the value
205d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
206d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void setCharset(final int charset) {
207d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPartHeader.put(P_CHARSET, charset);
208d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
209d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
210d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
211d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Get Char-set value
212d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
213d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return the charset value. Return 0 if charset was not set.
214d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
215d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getCharset() {
216d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final Integer charset = (Integer) mPartHeader.get(P_CHARSET);
217d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (charset == null) {
218d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return 0;
219d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        } else {
220d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return charset.intValue();
221d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
222d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
223d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
224d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
225d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Set Content-Location value.
226d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
227d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param contentLocation the value
228d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @throws NullPointerException if the value is null.
229d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
230d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void setContentLocation(final byte[] contentLocation) {
231d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (contentLocation == null) {
232d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            throw new NullPointerException("null content-location");
233d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
234d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
235d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPartHeader.put(P_CONTENT_LOCATION, contentLocation);
236d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
237d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
238d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
239d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Get Content-Location value.
240d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
241d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return the value
242d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * return PduPart.disposition[0] instead of <Octet 128> (Form-data).
243d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * return PduPart.disposition[1] instead of <Octet 129> (Attachment).
244d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * return PduPart.disposition[2] instead of <Octet 130> (Inline).
245d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
246d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public byte[] getContentLocation() {
247d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return (byte[]) mPartHeader.get(P_CONTENT_LOCATION);
248d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
249d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
250d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
251d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Set Content-Disposition value.
252d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Use PduPart.disposition[0] instead of <Octet 128> (Form-data).
253d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Use PduPart.disposition[1] instead of <Octet 129> (Attachment).
254d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Use PduPart.disposition[2] instead of <Octet 130> (Inline).
255d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
256d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param contentDisposition the value
257d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @throws NullPointerException if the value is null.
258d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
259d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void setContentDisposition(final byte[] contentDisposition) {
260d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (contentDisposition == null) {
261d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            throw new NullPointerException("null content-disposition");
262d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
263d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
264d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPartHeader.put(P_CONTENT_DISPOSITION, contentDisposition);
265d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
266d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
267d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
268d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Get Content-Disposition value.
269d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
270d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return the value
271d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
272d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public byte[] getContentDisposition() {
273d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return (byte[]) mPartHeader.get(P_CONTENT_DISPOSITION);
274d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
275d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
276d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
277d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Set Content-Type value.
278d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
279d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param value the value
280d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @throws NullPointerException if the value is null.
281d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
282d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void setContentType(final byte[] contentType) {
283d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (contentType == null) {
284d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            throw new NullPointerException("null content-type");
285d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
286d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
287d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPartHeader.put(P_CONTENT_TYPE, contentType);
288d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
289d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
290d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
291d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Get Content-Type value of part.
292d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
293d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return the value
294d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
295d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public byte[] getContentType() {
296d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return (byte[]) mPartHeader.get(P_CONTENT_TYPE);
297d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
298d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
299d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
300d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Set Content-Transfer-Encoding value
301d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
302d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param contentId the content-id value
303d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @throws NullPointerException if the value is null.
304d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
305d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void setContentTransferEncoding(final byte[] contentTransferEncoding) {
306d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (contentTransferEncoding == null) {
307d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            throw new NullPointerException("null content-transfer-encoding");
308d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
309d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
310d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPartHeader.put(P_CONTENT_TRANSFER_ENCODING, contentTransferEncoding);
311d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
312d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
313d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
314d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Get Content-Transfer-Encoding value.
315d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
316d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return the value
317d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
318d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public byte[] getContentTransferEncoding() {
319d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return (byte[]) mPartHeader.get(P_CONTENT_TRANSFER_ENCODING);
320d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
321d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
322d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
323d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Set Content-type parameter: name.
324d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
325d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param name the name value
326d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @throws NullPointerException if the value is null.
327d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
328d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void setName(final byte[] name) {
329d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (null == name) {
330d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            throw new NullPointerException("null content-id");
331d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
332d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
333d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPartHeader.put(P_NAME, name);
334d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
335d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
336d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
337d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Get content-type parameter: name.
338d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
339d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return the name
340d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
341d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public byte[] getName() {
342d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return (byte[]) mPartHeader.get(P_NAME);
343d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
344d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
345d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
346d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Get Content-disposition parameter: filename
347d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
348d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param fileName the filename value
349d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @throws NullPointerException if the value is null.
350d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
351d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void setFilename(final byte[] fileName) {
352d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (null == fileName) {
353d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            throw new NullPointerException("null content-id");
354d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
355d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
356d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPartHeader.put(P_FILENAME, fileName);
357d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
358d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
359d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
360d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Set Content-disposition parameter: filename
361d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
362d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return the filename
363d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
364d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public byte[] getFilename() {
365d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return (byte[]) mPartHeader.get(P_FILENAME);
366d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
367d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
368d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String generateLocation() {
369d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // Assumption: At least one of the content-location / name / filename
370d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // or content-id should be set. This is guaranteed by the PduParser
371d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // for incoming messages and by MM composer for outgoing messages.
372d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        byte[] location = (byte[]) mPartHeader.get(P_NAME);
373d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (null == location) {
374d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            location = (byte[]) mPartHeader.get(P_FILENAME);
375d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
376d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (null == location) {
377d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                location = (byte[]) mPartHeader.get(P_CONTENT_LOCATION);
378d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
379d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
380d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
381d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (null == location) {
382d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final byte[] contentId = (byte[]) mPartHeader.get(P_CONTENT_ID);
383d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return "cid:" + new String(contentId);
384d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        } else {
385d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return new String(location);
386d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
387d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
388d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd}
389d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
390