1d02a064168ae5c916b977182b764580e601cb084Wink Saville/*
2d02a064168ae5c916b977182b764580e601cb084Wink Saville * Copyright (C) 2007 Esmertec AG.
3d02a064168ae5c916b977182b764580e601cb084Wink Saville * Copyright (C) 2007 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 java.util.HashMap;
21d02a064168ae5c916b977182b764580e601cb084Wink Savilleimport java.util.Map;
22d02a064168ae5c916b977182b764580e601cb084Wink Savilleimport java.util.Vector;
23d02a064168ae5c916b977182b764580e601cb084Wink Saville
24d02a064168ae5c916b977182b764580e601cb084Wink Savillepublic class PduBody {
25d02a064168ae5c916b977182b764580e601cb084Wink Saville    private Vector<PduPart> mParts = null;
26d02a064168ae5c916b977182b764580e601cb084Wink Saville
27d02a064168ae5c916b977182b764580e601cb084Wink Saville    private Map<String, PduPart> mPartMapByContentId = null;
28d02a064168ae5c916b977182b764580e601cb084Wink Saville    private Map<String, PduPart> mPartMapByContentLocation = null;
29d02a064168ae5c916b977182b764580e601cb084Wink Saville    private Map<String, PduPart> mPartMapByName = null;
30d02a064168ae5c916b977182b764580e601cb084Wink Saville    private Map<String, PduPart> mPartMapByFileName = null;
31d02a064168ae5c916b977182b764580e601cb084Wink Saville
32d02a064168ae5c916b977182b764580e601cb084Wink Saville    /**
33d02a064168ae5c916b977182b764580e601cb084Wink Saville     * Constructor.
34d02a064168ae5c916b977182b764580e601cb084Wink Saville     */
35d02a064168ae5c916b977182b764580e601cb084Wink Saville    public PduBody() {
36d02a064168ae5c916b977182b764580e601cb084Wink Saville        mParts = new Vector<PduPart>();
37d02a064168ae5c916b977182b764580e601cb084Wink Saville
38d02a064168ae5c916b977182b764580e601cb084Wink Saville        mPartMapByContentId = new HashMap<String, PduPart>();
39d02a064168ae5c916b977182b764580e601cb084Wink Saville        mPartMapByContentLocation  = new HashMap<String, PduPart>();
40d02a064168ae5c916b977182b764580e601cb084Wink Saville        mPartMapByName = new HashMap<String, PduPart>();
41d02a064168ae5c916b977182b764580e601cb084Wink Saville        mPartMapByFileName = new HashMap<String, PduPart>();
42d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
43d02a064168ae5c916b977182b764580e601cb084Wink Saville
44d02a064168ae5c916b977182b764580e601cb084Wink Saville    private void putPartToMaps(PduPart part) {
45d02a064168ae5c916b977182b764580e601cb084Wink Saville        // Put part to mPartMapByContentId.
46d02a064168ae5c916b977182b764580e601cb084Wink Saville        byte[] contentId = part.getContentId();
47d02a064168ae5c916b977182b764580e601cb084Wink Saville        if(null != contentId) {
48d02a064168ae5c916b977182b764580e601cb084Wink Saville            mPartMapByContentId.put(new String(contentId), part);
49d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
50d02a064168ae5c916b977182b764580e601cb084Wink Saville
51d02a064168ae5c916b977182b764580e601cb084Wink Saville        // Put part to mPartMapByContentLocation.
52d02a064168ae5c916b977182b764580e601cb084Wink Saville        byte[] contentLocation = part.getContentLocation();
53d02a064168ae5c916b977182b764580e601cb084Wink Saville        if(null != contentLocation) {
54d02a064168ae5c916b977182b764580e601cb084Wink Saville            String clc = new String(contentLocation);
55d02a064168ae5c916b977182b764580e601cb084Wink Saville            mPartMapByContentLocation.put(clc, part);
56d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
57d02a064168ae5c916b977182b764580e601cb084Wink Saville
58d02a064168ae5c916b977182b764580e601cb084Wink Saville        // Put part to mPartMapByName.
59d02a064168ae5c916b977182b764580e601cb084Wink Saville        byte[] name = part.getName();
60d02a064168ae5c916b977182b764580e601cb084Wink Saville        if(null != name) {
61d02a064168ae5c916b977182b764580e601cb084Wink Saville            String clc = new String(name);
62d02a064168ae5c916b977182b764580e601cb084Wink Saville            mPartMapByName.put(clc, part);
63d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
64d02a064168ae5c916b977182b764580e601cb084Wink Saville
65d02a064168ae5c916b977182b764580e601cb084Wink Saville        // Put part to mPartMapByFileName.
66d02a064168ae5c916b977182b764580e601cb084Wink Saville        byte[] fileName = part.getFilename();
67d02a064168ae5c916b977182b764580e601cb084Wink Saville        if(null != fileName) {
68d02a064168ae5c916b977182b764580e601cb084Wink Saville            String clc = new String(fileName);
69d02a064168ae5c916b977182b764580e601cb084Wink Saville            mPartMapByFileName.put(clc, part);
70d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
71d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
72d02a064168ae5c916b977182b764580e601cb084Wink Saville
73d02a064168ae5c916b977182b764580e601cb084Wink Saville    /**
74d02a064168ae5c916b977182b764580e601cb084Wink Saville     * Appends the specified part to the end of this body.
75d02a064168ae5c916b977182b764580e601cb084Wink Saville     *
76d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @param part part to be appended
77d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @return true when success, false when fail
78d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @throws NullPointerException when part is null
79d02a064168ae5c916b977182b764580e601cb084Wink Saville     */
80d02a064168ae5c916b977182b764580e601cb084Wink Saville    public boolean addPart(PduPart part) {
81d02a064168ae5c916b977182b764580e601cb084Wink Saville        if(null == part) {
82d02a064168ae5c916b977182b764580e601cb084Wink Saville            throw new NullPointerException();
83d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
84d02a064168ae5c916b977182b764580e601cb084Wink Saville
85d02a064168ae5c916b977182b764580e601cb084Wink Saville        putPartToMaps(part);
86d02a064168ae5c916b977182b764580e601cb084Wink Saville        return mParts.add(part);
87d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
88d02a064168ae5c916b977182b764580e601cb084Wink Saville
89d02a064168ae5c916b977182b764580e601cb084Wink Saville    /**
90d02a064168ae5c916b977182b764580e601cb084Wink Saville     * Inserts the specified part at the specified position.
91d02a064168ae5c916b977182b764580e601cb084Wink Saville     *
92d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @param index index at which the specified part is to be inserted
93d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @param part part to be inserted
94d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @throws NullPointerException when part is null
95d02a064168ae5c916b977182b764580e601cb084Wink Saville     */
96d02a064168ae5c916b977182b764580e601cb084Wink Saville    public void addPart(int index, PduPart part) {
97d02a064168ae5c916b977182b764580e601cb084Wink Saville        if(null == part) {
98d02a064168ae5c916b977182b764580e601cb084Wink Saville            throw new NullPointerException();
99d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
100d02a064168ae5c916b977182b764580e601cb084Wink Saville
101d02a064168ae5c916b977182b764580e601cb084Wink Saville        putPartToMaps(part);
102d02a064168ae5c916b977182b764580e601cb084Wink Saville        mParts.add(index, part);
103d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
104d02a064168ae5c916b977182b764580e601cb084Wink Saville
105d02a064168ae5c916b977182b764580e601cb084Wink Saville    /**
106d02a064168ae5c916b977182b764580e601cb084Wink Saville     * Removes the part at the specified position.
107d02a064168ae5c916b977182b764580e601cb084Wink Saville     *
108d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @param index index of the part to return
109d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @return part at the specified index
110d02a064168ae5c916b977182b764580e601cb084Wink Saville     */
111d02a064168ae5c916b977182b764580e601cb084Wink Saville    public PduPart removePart(int index) {
112d02a064168ae5c916b977182b764580e601cb084Wink Saville        return mParts.remove(index);
113d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
114d02a064168ae5c916b977182b764580e601cb084Wink Saville
115d02a064168ae5c916b977182b764580e601cb084Wink Saville    /**
116d02a064168ae5c916b977182b764580e601cb084Wink Saville     * Remove all of the parts.
117d02a064168ae5c916b977182b764580e601cb084Wink Saville     */
118d02a064168ae5c916b977182b764580e601cb084Wink Saville    public void removeAll() {
119d02a064168ae5c916b977182b764580e601cb084Wink Saville        mParts.clear();
120d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
121d02a064168ae5c916b977182b764580e601cb084Wink Saville
122d02a064168ae5c916b977182b764580e601cb084Wink Saville    /**
123d02a064168ae5c916b977182b764580e601cb084Wink Saville     * Get the part at the specified position.
124d02a064168ae5c916b977182b764580e601cb084Wink Saville     *
125d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @param index index of the part to return
126d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @return part at the specified index
127d02a064168ae5c916b977182b764580e601cb084Wink Saville     */
128d02a064168ae5c916b977182b764580e601cb084Wink Saville    public PduPart getPart(int index) {
129d02a064168ae5c916b977182b764580e601cb084Wink Saville        return mParts.get(index);
130d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
131d02a064168ae5c916b977182b764580e601cb084Wink Saville
132d02a064168ae5c916b977182b764580e601cb084Wink Saville    /**
133d02a064168ae5c916b977182b764580e601cb084Wink Saville     * Get the index of the specified part.
134d02a064168ae5c916b977182b764580e601cb084Wink Saville     *
135d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @param part the part object
136d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @return index the index of the first occurrence of the part in this body
137d02a064168ae5c916b977182b764580e601cb084Wink Saville     */
138d02a064168ae5c916b977182b764580e601cb084Wink Saville    public int getPartIndex(PduPart part) {
139d02a064168ae5c916b977182b764580e601cb084Wink Saville        return mParts.indexOf(part);
140d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
141d02a064168ae5c916b977182b764580e601cb084Wink Saville
142d02a064168ae5c916b977182b764580e601cb084Wink Saville    /**
143d02a064168ae5c916b977182b764580e601cb084Wink Saville     * Get the number of parts.
144d02a064168ae5c916b977182b764580e601cb084Wink Saville     *
145d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @return the number of parts
146d02a064168ae5c916b977182b764580e601cb084Wink Saville     */
147d02a064168ae5c916b977182b764580e601cb084Wink Saville    public int getPartsNum() {
148d02a064168ae5c916b977182b764580e601cb084Wink Saville        return mParts.size();
149d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
150d02a064168ae5c916b977182b764580e601cb084Wink Saville
151d02a064168ae5c916b977182b764580e601cb084Wink Saville    /**
152d02a064168ae5c916b977182b764580e601cb084Wink Saville     * Get pdu part by content id.
153d02a064168ae5c916b977182b764580e601cb084Wink Saville     *
154d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @param cid the value of content id.
155d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @return the pdu part.
156d02a064168ae5c916b977182b764580e601cb084Wink Saville     */
157d02a064168ae5c916b977182b764580e601cb084Wink Saville    public PduPart getPartByContentId(String cid) {
158d02a064168ae5c916b977182b764580e601cb084Wink Saville        return mPartMapByContentId.get(cid);
159d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
160d02a064168ae5c916b977182b764580e601cb084Wink Saville
161d02a064168ae5c916b977182b764580e601cb084Wink Saville    /**
162d02a064168ae5c916b977182b764580e601cb084Wink Saville     * Get pdu part by Content-Location. Content-Location of part is
163d02a064168ae5c916b977182b764580e601cb084Wink Saville     * the same as filename and name(param of content-type).
164d02a064168ae5c916b977182b764580e601cb084Wink Saville     *
165d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @param fileName the value of filename.
166d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @return the pdu part.
167d02a064168ae5c916b977182b764580e601cb084Wink Saville     */
168d02a064168ae5c916b977182b764580e601cb084Wink Saville    public PduPart getPartByContentLocation(String contentLocation) {
169d02a064168ae5c916b977182b764580e601cb084Wink Saville        return mPartMapByContentLocation.get(contentLocation);
170d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
171d02a064168ae5c916b977182b764580e601cb084Wink Saville
172d02a064168ae5c916b977182b764580e601cb084Wink Saville    /**
173d02a064168ae5c916b977182b764580e601cb084Wink Saville     * Get pdu part by name.
174d02a064168ae5c916b977182b764580e601cb084Wink Saville     *
175d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @param fileName the value of filename.
176d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @return the pdu part.
177d02a064168ae5c916b977182b764580e601cb084Wink Saville     */
178d02a064168ae5c916b977182b764580e601cb084Wink Saville    public PduPart getPartByName(String name) {
179d02a064168ae5c916b977182b764580e601cb084Wink Saville        return mPartMapByName.get(name);
180d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
181d02a064168ae5c916b977182b764580e601cb084Wink Saville
182d02a064168ae5c916b977182b764580e601cb084Wink Saville    /**
183d02a064168ae5c916b977182b764580e601cb084Wink Saville     * Get pdu part by filename.
184d02a064168ae5c916b977182b764580e601cb084Wink Saville     *
185d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @param fileName the value of filename.
186d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @return the pdu part.
187d02a064168ae5c916b977182b764580e601cb084Wink Saville     */
188d02a064168ae5c916b977182b764580e601cb084Wink Saville    public PduPart getPartByFileName(String filename) {
189d02a064168ae5c916b977182b764580e601cb084Wink Saville        return mPartMapByFileName.get(filename);
190d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
191d02a064168ae5c916b977182b764580e601cb084Wink Saville}
192