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