1526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen/*
2526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Copyright (C) 2007-2008 Esmertec AG.
3526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Copyright (C) 2007-2008 The Android Open Source Project
4526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen *
5526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Licensed under the Apache License, Version 2.0 (the "License");
6526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * you may not use this file except in compliance with the License.
7526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * You may obtain a copy of the License at
8526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen *
9526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen *      http://www.apache.org/licenses/LICENSE-2.0
10526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen *
11526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Unless required by applicable law or agreed to in writing, software
12526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * distributed under the License is distributed on an "AS IS" BASIS,
13526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * See the License for the specific language governing permissions and
15526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * limitations under the License.
16526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */
17526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
18526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenpackage com.google.android.mms.pdu;
19526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
20526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenimport android.net.Uri;
21526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
22526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenimport java.util.HashMap;
23526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenimport java.util.Map;
24526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
25526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen/**
26526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * The pdu part.
27526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */
28526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenpublic class PduPart {
29526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    /**
30526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     * Well-Known Parameters.
31526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     */
32526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_Q                  = 0x80;
33526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_CHARSET            = 0x81;
34526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_LEVEL              = 0x82;
35526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_TYPE               = 0x83;
36526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_DEP_NAME           = 0x85;
37526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_DEP_FILENAME       = 0x86;
38526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_DIFFERENCES        = 0x87;
39526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_PADDING            = 0x88;
40526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    // This value of "TYPE" s used with Content-Type: multipart/related
41526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_CT_MR_TYPE         = 0x89;
42526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_DEP_START          = 0x8A;
43526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_DEP_START_INFO     = 0x8B;
44526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_DEP_COMMENT        = 0x8C;
45526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_DEP_DOMAIN         = 0x8D;
46526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_MAX_AGE            = 0x8E;
47526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_DEP_PATH           = 0x8F;
48526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_SECURE             = 0x90;
49526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_SEC                = 0x91;
50526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_MAC                = 0x92;
51526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_CREATION_DATE      = 0x93;
52526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_MODIFICATION_DATE  = 0x94;
53526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_READ_DATE          = 0x95;
54526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_SIZE               = 0x96;
55526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_NAME               = 0x97;
56526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_FILENAME           = 0x98;
57526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_START              = 0x99;
58526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_START_INFO         = 0x9A;
59526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_COMMENT            = 0x9B;
60526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_DOMAIN             = 0x9C;
61526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public static final int P_PATH               = 0x9D;
62526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
63526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    /**
64526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     *  Header field names.
65526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     */
66526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final int P_CONTENT_TYPE       = 0x91;
67526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final int P_CONTENT_LOCATION   = 0x8E;
68526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final int P_CONTENT_ID         = 0xC0;
69526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final int P_DEP_CONTENT_DISPOSITION = 0xAE;
70526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final int P_CONTENT_DISPOSITION = 0xC5;
71526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    // The next header is unassigned header, use reserved header(0x48) value.
72526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final int P_CONTENT_TRANSFER_ENCODING = 0xC8;
73526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
74526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
75526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Content=Transfer-Encoding string.
76526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
77526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final String CONTENT_TRANSFER_ENCODING =
78526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen             "Content-Transfer-Encoding";
79526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
80526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
81526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Value of Content-Transfer-Encoding.
82526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
83526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final String P_BINARY = "binary";
84526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final String P_7BIT = "7bit";
85526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final String P_8BIT = "8bit";
86526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final String P_BASE64 = "base64";
87526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final String P_QUOTED_PRINTABLE = "quoted-printable";
88526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
89526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
90526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Value of disposition can be set to PduPart when the value is octet in
91526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * the PDU.
92526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * "from-data" instead of Form-data<Octet 128>.
93526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * "attachment" instead of Attachment<Octet 129>.
94526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * "inline" instead of Inline<Octet 130>.
95526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
96526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     static final byte[] DISPOSITION_FROM_DATA = "from-data".getBytes();
97526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     static final byte[] DISPOSITION_ATTACHMENT = "attachment".getBytes();
98526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     static final byte[] DISPOSITION_INLINE = "inline".getBytes();
99526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
100526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
101526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Content-Disposition value.
102526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
103526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final int P_DISPOSITION_FROM_DATA  = 0x80;
104526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final int P_DISPOSITION_ATTACHMENT = 0x81;
105526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public static final int P_DISPOSITION_INLINE     = 0x82;
106526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
107526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
108526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Header of part.
109526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
110526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     private Map<Integer, Object> mPartHeader = null;
111526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
112526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
113526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Data uri.
114526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
115526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     private Uri mUri = null;
116526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
117526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
118526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Part data.
119526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
120526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     private byte[] mPartData = null;
121526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
122526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     private static final String TAG = "PduPart";
123526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
124526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
125526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Empty Constructor.
126526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
127526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public PduPart() {
128526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         mPartHeader = new HashMap<Integer, Object>();
129526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
130526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
131526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
132526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Set part data. The data are stored as byte array.
133526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
134526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @param data the data
135526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
136526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public void setData(byte[] data) {
137526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         if(data == null) {
138526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen            return;
139526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen        }
140526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
141526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         mPartData = new byte[data.length];
142526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         System.arraycopy(data, 0, mPartData, 0, data.length);
143526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
144526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
145526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
146526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @return A copy of the part data or null if the data wasn't set or
147526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *         the data is stored as Uri.
148526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @see #getDataUri
149526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
150526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public byte[] getData() {
151526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         if(mPartData == null) {
152526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen            return null;
153526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         }
154526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
155526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         byte[] byteArray = new byte[mPartData.length];
156526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         System.arraycopy(mPartData, 0, byteArray, 0, mPartData.length);
157526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         return byteArray;
158526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
159526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
160089a13f65c9bac16543ec2270152649bb3c77127kschulz    /**
161089a13f65c9bac16543ec2270152649bb3c77127kschulz     * @return The length of the data, if this object have data, else 0.
162089a13f65c9bac16543ec2270152649bb3c77127kschulz     */
163089a13f65c9bac16543ec2270152649bb3c77127kschulz     public int getDataLength() {
164089a13f65c9bac16543ec2270152649bb3c77127kschulz         if(mPartData != null){
165089a13f65c9bac16543ec2270152649bb3c77127kschulz             return mPartData.length;
166089a13f65c9bac16543ec2270152649bb3c77127kschulz         } else {
167089a13f65c9bac16543ec2270152649bb3c77127kschulz             return 0;
168089a13f65c9bac16543ec2270152649bb3c77127kschulz         }
169089a13f65c9bac16543ec2270152649bb3c77127kschulz     }
170089a13f65c9bac16543ec2270152649bb3c77127kschulz
171089a13f65c9bac16543ec2270152649bb3c77127kschulz
172526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
173526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Set data uri. The data are stored as Uri.
174526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
175526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @param uri the uri
176526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
177526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public void setDataUri(Uri uri) {
178526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         mUri = uri;
179526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
180526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
181526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
182526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @return The Uri of the part data or null if the data wasn't set or
183526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *         the data is stored as byte array.
184526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @see #getData
185526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
186526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public Uri getDataUri() {
187526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         return mUri;
188526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
189526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
190526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
191526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Set Content-id value
192526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
193526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @param contentId the content-id value
194526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @throws NullPointerException if the value is null.
195526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
196526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public void setContentId(byte[] contentId) {
197526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         if((contentId == null) || (contentId.length == 0)) {
198526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen             throw new IllegalArgumentException(
199526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen                     "Content-Id may not be null or empty.");
200526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         }
201526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
202526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         if ((contentId.length > 1)
203526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen                 && ((char) contentId[0] == '<')
204526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen                 && ((char) contentId[contentId.length - 1] == '>')) {
205526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen             mPartHeader.put(P_CONTENT_ID, contentId);
206526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen             return;
207526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         }
208526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
209526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         // Insert beginning '<' and trailing '>' for Content-Id.
210526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         byte[] buffer = new byte[contentId.length + 2];
211526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         buffer[0] = (byte) (0xff & '<');
212526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         buffer[buffer.length - 1] = (byte) (0xff & '>');
213526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         System.arraycopy(contentId, 0, buffer, 1, contentId.length);
214526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         mPartHeader.put(P_CONTENT_ID, buffer);
215526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
216526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
217526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
218526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Get Content-id value.
219526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
220526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @return the value
221526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
222526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public byte[] getContentId() {
223526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         return (byte[]) mPartHeader.get(P_CONTENT_ID);
224526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
225526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
226526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
227526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Set Char-set value.
228526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
229526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @param charset the value
230526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
231526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public void setCharset(int charset) {
232526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         mPartHeader.put(P_CHARSET, charset);
233526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
234526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
235526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
236526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Get Char-set value
237526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
238526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @return the charset value. Return 0 if charset was not set.
239526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
240526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public int getCharset() {
241526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         Integer charset = (Integer) mPartHeader.get(P_CHARSET);
242526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         if(charset == null) {
243526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen             return 0;
244526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         } else {
245526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen             return charset.intValue();
246526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         }
247526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
248526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
249526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
250526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Set Content-Location value.
251526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
252526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @param contentLocation the value
253526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @throws NullPointerException if the value is null.
254526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
255526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public void setContentLocation(byte[] contentLocation) {
256526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         if(contentLocation == null) {
257526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen             throw new NullPointerException("null content-location");
258526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         }
259526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
260526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         mPartHeader.put(P_CONTENT_LOCATION, contentLocation);
261526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
262526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
263526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
264526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Get Content-Location value.
265526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
266526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @return the value
267526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *     return PduPart.disposition[0] instead of <Octet 128> (Form-data).
268526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *     return PduPart.disposition[1] instead of <Octet 129> (Attachment).
269526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *     return PduPart.disposition[2] instead of <Octet 130> (Inline).
270526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
271526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public byte[] getContentLocation() {
272526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         return (byte[]) mPartHeader.get(P_CONTENT_LOCATION);
273526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
274526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
275526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
276526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Set Content-Disposition value.
277526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Use PduPart.disposition[0] instead of <Octet 128> (Form-data).
278526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Use PduPart.disposition[1] instead of <Octet 129> (Attachment).
279526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Use PduPart.disposition[2] instead of <Octet 130> (Inline).
280526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
281526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @param contentDisposition the value
282526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @throws NullPointerException if the value is null.
283526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
284526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public void setContentDisposition(byte[] contentDisposition) {
285526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         if(contentDisposition == null) {
286526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen             throw new NullPointerException("null content-disposition");
287526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         }
288526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
289526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         mPartHeader.put(P_CONTENT_DISPOSITION, contentDisposition);
290526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
291526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
292526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
293526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Get Content-Disposition value.
294526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
295526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @return the value
296526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
297526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public byte[] getContentDisposition() {
298526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         return (byte[]) mPartHeader.get(P_CONTENT_DISPOSITION);
299526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
300526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
301526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
302526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *  Set Content-Type value.
303526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
304526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *  @param value the value
305526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *  @throws NullPointerException if the value is null.
306526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
307526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public void setContentType(byte[] contentType) {
308526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         if(contentType == null) {
309526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen             throw new NullPointerException("null content-type");
310526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         }
311526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
312526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         mPartHeader.put(P_CONTENT_TYPE, contentType);
313526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
314526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
315526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
316526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Get Content-Type value of part.
317526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
318526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @return the value
319526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
320526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public byte[] getContentType() {
321526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         return (byte[]) mPartHeader.get(P_CONTENT_TYPE);
322526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
323526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
324526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
325526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Set Content-Transfer-Encoding value
326526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
327526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @param contentId the content-id value
328526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @throws NullPointerException if the value is null.
329526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
330526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public void setContentTransferEncoding(byte[] contentTransferEncoding) {
331526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         if(contentTransferEncoding == null) {
332526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen             throw new NullPointerException("null content-transfer-encoding");
333526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         }
334526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
335526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         mPartHeader.put(P_CONTENT_TRANSFER_ENCODING, contentTransferEncoding);
336526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
337526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
338526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
339526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Get Content-Transfer-Encoding value.
340526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
341526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @return the value
342526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
343526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public byte[] getContentTransferEncoding() {
344526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         return (byte[]) mPartHeader.get(P_CONTENT_TRANSFER_ENCODING);
345526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
346526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
347526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
348526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Set Content-type parameter: name.
349526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
350526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @param name the name value
351526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @throws NullPointerException if the value is null.
352526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
353526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public void setName(byte[] name) {
354526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         if(null == name) {
355526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen             throw new NullPointerException("null content-id");
356526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         }
357526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
358526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         mPartHeader.put(P_NAME, name);
359526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
360526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
361526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
362526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *  Get content-type parameter: name.
363526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
364526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *  @return the name
365526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
366526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public byte[] getName() {
367526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         return (byte[]) mPartHeader.get(P_NAME);
368526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
369526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
370526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
371526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Get Content-disposition parameter: filename
372526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
373526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @param fileName the filename value
374526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @throws NullPointerException if the value is null.
375526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
376526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public void setFilename(byte[] fileName) {
377526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         if(null == fileName) {
378526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen             throw new NullPointerException("null content-id");
379526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         }
380526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
381526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         mPartHeader.put(P_FILENAME, fileName);
382526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
383526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
384526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     /**
385526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * Set Content-disposition parameter: filename
386526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      *
387526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      * @return the filename
388526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen      */
389526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     public byte[] getFilename() {
390526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen         return (byte[]) mPartHeader.get(P_FILENAME);
391526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen     }
392526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
393526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    public String generateLocation() {
394526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen        // Assumption: At least one of the content-location / name / filename
395526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen        // or content-id should be set. This is guaranteed by the PduParser
396526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen        // for incoming messages and by MM composer for outgoing messages.
397526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen        byte[] location = (byte[]) mPartHeader.get(P_NAME);
398526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen        if(null == location) {
399526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen            location = (byte[]) mPartHeader.get(P_FILENAME);
400526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
401526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen            if (null == location) {
402526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen                location = (byte[]) mPartHeader.get(P_CONTENT_LOCATION);
403526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen            }
404526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen        }
405526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
406526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen        if (null == location) {
407526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen            byte[] contentId = (byte[]) mPartHeader.get(P_CONTENT_ID);
408526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen            return "cid:" + new String(contentId);
409526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen        } else {
410526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen            return new String(location);
411526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen        }
412526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen    }
413526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen}
414526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen
415