19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.telephony;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffinimport java.util.HashMap;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
22c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin * Implement the WSP data type decoder.
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
24c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin * @hide
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WspTypeDecoder {
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int WAP_PDU_SHORT_LENGTH_MAX = 30;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int WAP_PDU_LENGTH_QUOTE = 31;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PDU_TYPE_PUSH = 0x06;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PDU_TYPE_CONFIRMED_PUSH = 0x07;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    private final static HashMap<Integer, String> WELL_KNOWN_MIME_TYPES =
35c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            new HashMap<Integer, String>();
36c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
37c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    private final static HashMap<Integer, String> WELL_KNOWN_PARAMETERS =
38c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            new HashMap<Integer, String>();
39c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
407640caaf912a7eefacc3e2108c5afd70f7b072a4noda    public static final int PARAMETER_ID_X_WAP_APPLICATION_ID = 0x2f;
41c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    private static final int Q_VALUE = 0x00;
42c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
43c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    static {
44c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x00, "*/*");
45c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x01, "text/*");
46c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x02, "text/html");
47c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x03, "text/plain");
48c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x04, "text/x-hdml");
49c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x05, "text/x-ttml");
50c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x06, "text/x-vCalendar");
51c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x07, "text/x-vCard");
52c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x08, "text/vnd.wap.wml");
53c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x09, "text/vnd.wap.wmlscript");
54c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0A, "text/vnd.wap.wta-event");
55c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0B, "multipart/*");
56c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0C, "multipart/mixed");
57c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0D, "multipart/form-data");
58c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0E, "multipart/byterantes");
59c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0F, "multipart/alternative");
60c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x10, "application/*");
61c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x11, "application/java-vm");
62c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x12, "application/x-www-form-urlencoded");
63c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x13, "application/x-hdmlc");
64c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x14, "application/vnd.wap.wmlc");
65c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x15, "application/vnd.wap.wmlscriptc");
66c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x16, "application/vnd.wap.wta-eventc");
67c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x17, "application/vnd.wap.uaprof");
68c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x18, "application/vnd.wap.wtls-ca-certificate");
69c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x19, "application/vnd.wap.wtls-user-certificate");
70c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x1A, "application/x-x509-ca-cert");
71c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x1B, "application/x-x509-user-cert");
72c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x1C, "image/*");
73c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x1D, "image/gif");
74c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x1E, "image/jpeg");
75c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x1F, "image/tiff");
76c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x20, "image/png");
77c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x21, "image/vnd.wap.wbmp");
78c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x22, "application/vnd.wap.multipart.*");
79c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x23, "application/vnd.wap.multipart.mixed");
80c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x24, "application/vnd.wap.multipart.form-data");
81c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x25, "application/vnd.wap.multipart.byteranges");
82c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x26, "application/vnd.wap.multipart.alternative");
83c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x27, "application/xml");
84c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x28, "text/xml");
85c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x29, "application/vnd.wap.wbxml");
86c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x2A, "application/x-x968-cross-cert");
87c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x2B, "application/x-x968-ca-cert");
88c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x2C, "application/x-x968-user-cert");
89c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x2D, "text/vnd.wap.si");
90c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x2E, "application/vnd.wap.sic");
91c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x2F, "text/vnd.wap.sl");
92c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x30, "application/vnd.wap.slc");
93c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x31, "text/vnd.wap.co");
94c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x32, "application/vnd.wap.coc");
95c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x33, "application/vnd.wap.multipart.related");
96c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x34, "application/vnd.wap.sia");
97c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x35, "text/vnd.wap.connectivity-xml");
98c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x36, "application/vnd.wap.connectivity-wbxml");
99c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x37, "application/pkcs7-mime");
100c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x38, "application/vnd.wap.hashed-certificate");
101c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x39, "application/vnd.wap.signed-certificate");
102c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x3A, "application/vnd.wap.cert-response");
103c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x3B, "application/xhtml+xml");
104c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x3C, "application/wml+xml");
105c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x3D, "text/css");
106c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x3E, "application/vnd.wap.mms-message");
107c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x3F, "application/vnd.wap.rollover-certificate");
108c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x40, "application/vnd.wap.locc+wbxml");
109c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x41, "application/vnd.wap.loc+xml");
110c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x42, "application/vnd.syncml.dm+wbxml");
111c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x43, "application/vnd.syncml.dm+xml");
112c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x44, "application/vnd.syncml.notification");
113c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x45, "application/vnd.wap.xhtml+xml");
114c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x46, "application/vnd.wv.csp.cir");
115c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x47, "application/vnd.oma.dd+xml");
116c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x48, "application/vnd.oma.drm.message");
117c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x49, "application/vnd.oma.drm.content");
118c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x4A, "application/vnd.oma.drm.rights+xml");
119c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x4B, "application/vnd.oma.drm.rights+wbxml");
120c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x4C, "application/vnd.wv.csp+xml");
121c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x4D, "application/vnd.wv.csp+wbxml");
122c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x4E, "application/vnd.syncml.ds.notification");
123c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x4F, "audio/*");
124c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x50, "video/*");
125c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x51, "application/vnd.oma.dd2+xml");
126c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x52, "application/mikey");
127c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x53, "application/vnd.oma.dcd");
128c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x54, "application/vnd.oma.dcdc");
129c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
130c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0201, "application/vnd.uplanet.cacheop-wbxml");
131c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0202, "application/vnd.uplanet.signal");
132c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0203, "application/vnd.uplanet.alert-wbxml");
133c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0204, "application/vnd.uplanet.list-wbxml");
134c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0205, "application/vnd.uplanet.listcmd-wbxml");
135c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0206, "application/vnd.uplanet.channel-wbxml");
136c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0207, "application/vnd.uplanet.provisioning-status-uri");
137c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0208, "x-wap.multipart/vnd.uplanet.header-set");
138c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0209, "application/vnd.uplanet.bearer-choice-wbxml");
139c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x020A, "application/vnd.phonecom.mmc-wbxml");
140c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x020B, "application/vnd.nokia.syncset+wbxml");
141c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x020C, "image/x-up-wpng");
142c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0300, "application/iota.mmc-wbxml");
143c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0301, "application/iota.mmc-xml");
144c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0302, "application/vnd.syncml+xml");
145c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0303, "application/vnd.syncml+wbxml");
146c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0304, "text/vnd.wap.emn+xml");
147c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0305, "text/calendar");
148c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0306, "application/vnd.omads-email+xml");
149c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0307, "application/vnd.omads-file+xml");
150c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0308, "application/vnd.omads-folder+xml");
151c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0309, "text/directory;profile=vCard");
152c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x030A, "application/vnd.wap.emn+wbxml");
153c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x030B, "application/vnd.nokia.ipdc-purchase-response");
154c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x030C, "application/vnd.motorola.screen3+xml");
155c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x030D, "application/vnd.motorola.screen3+gzip");
156c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x030E, "application/vnd.cmcc.setting+wbxml");
157c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x030F, "application/vnd.cmcc.bombing+wbxml");
158c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0310, "application/vnd.docomo.pf");
159c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0311, "application/vnd.docomo.ub");
160c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0312, "application/vnd.omaloc-supl-init");
161c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0313, "application/vnd.oma.group-usage-list+xml");
162c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0314, "application/oma-directory+xml");
163c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0315, "application/vnd.docomo.pf2");
164c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0316, "application/vnd.oma.drm.roap-trigger+wbxml");
165c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0317, "application/vnd.sbm.mid2");
166c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0318, "application/vnd.wmf.bootstrap");
167c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x0319, "application/vnc.cmcc.dcd+xml");
168c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x031A, "application/vnd.sbm.cid");
169c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_MIME_TYPES.put(0x031B, "application/vnd.oma.bcast.provisioningtrigger");
170c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
171c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x00, "Q");
172c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x01, "Charset");
173c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x02, "Level");
174c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x03, "Type");
175c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x07, "Differences");
176c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x08, "Padding");
177c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x09, "Type");
178c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x0E, "Max-Age");
179c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x10, "Secure");
180c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x11, "SEC");
181c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x12, "MAC");
182c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x13, "Creation-date");
183c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x14, "Modification-date");
184c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x15, "Read-date");
185c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x16, "Size");
186c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x17, "Name");
187c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x18, "Filename");
188c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x19, "Start");
189c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x1A, "Start-info");
190c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x1B, "Comment");
191c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x1C, "Domain");
192c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        WELL_KNOWN_PARAMETERS.put(0x1D, "Path");
193c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
195c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    public static final String CONTENT_TYPE_B_PUSH_CO = "application/vnd.wap.coc";
196c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    public static final String CONTENT_TYPE_B_MMS = "application/vnd.wap.mms-message";
197d8f9a83cab34de38981dc3ba5ca9df8dda02dbc0Marco Nelissen    public static final String CONTENT_TYPE_B_PUSH_SYNCML_NOTI = "application/vnd.syncml.notification";
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    byte[] wspData;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int    dataLength;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long   unsigned32bit;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String stringValue;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
204c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    HashMap<String, String> contentParameters;
205c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WspTypeDecoder(byte[] pdu) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wspData = pdu;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode the "Text-string" type for WSP pdu
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startIndex The starting position of the "Text-string" in this pdu
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return false when error(not a Text-string) occur
216c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         return value can be retrieved by getValueString() method length of data in pdu can be
217c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         retrieved by getDecodedDataLength() method
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean decodeTextString(int startIndex) {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int index = startIndex;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (wspData[index] != 0) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index++;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
224c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        dataLength = index - startIndex + 1;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wspData[startIndex] == 127) {
226c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            stringValue = new String(wspData, startIndex + 1, dataLength - 2);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stringValue = new String(wspData, startIndex, dataLength - 1);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
234c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     * Decode the "Token-text" type for WSP pdu
235c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *
236c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     * @param startIndex The starting position of the "Token-text" in this pdu
237c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *
238c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     * @return always true
239c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         return value can be retrieved by getValueString() method
240c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         length of data in pdu can be retrieved by getDecodedDataLength() method
241c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     */
242c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    public boolean decodeTokenText(int startIndex) {
243c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        int index = startIndex;
244c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        while (wspData[index] != 0) {
245c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            index++;
246c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        }
247c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        dataLength = index - startIndex + 1;
248c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        stringValue = new String(wspData, startIndex, dataLength - 1);
249c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
250c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        return true;
251c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    }
252c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
253c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    /**
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode the "Short-integer" type for WSP pdu
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startIndex The starting position of the "Short-integer" in this pdu
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return false when error(not a Short-integer) occur
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         return value can be retrieved by getValue32() method
260c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         length of data in pdu can be retrieved by getDecodedDataLength() method
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean decodeShortInteger(int startIndex) {
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((wspData[startIndex] & 0x80) == 0) {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned32bit = wspData[startIndex] & 0x7f;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dataLength = 1;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode the "Long-integer" type for WSP pdu
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startIndex The starting position of the "Long-integer" in this pdu
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return false when error(not a Long-integer) occur
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         return value can be retrieved by getValue32() method
278c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         length of data in pdu can be retrieved by getDecodedDataLength() method
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean decodeLongInteger(int startIndex) {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int lengthMultiOctet = wspData[startIndex] & 0xff;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lengthMultiOctet > WAP_PDU_SHORT_LENGTH_MAX) {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned32bit = 0;
287c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        for (int i = 1; i <= lengthMultiOctet; i++) {
288c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            unsigned32bit = (unsigned32bit << 8) | (wspData[startIndex + i] & 0xff);
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
290c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        dataLength = 1 + lengthMultiOctet;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode the "Integer-Value" type for WSP pdu
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startIndex The starting position of the "Integer-Value" in this pdu
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return false when error(not a Integer-Value) occur
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         return value can be retrieved by getValue32() method
301c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         length of data in pdu can be retrieved by getDecodedDataLength() method
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean decodeIntegerValue(int startIndex) {
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (decodeShortInteger(startIndex) == true) {
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return decodeLongInteger(startIndex);
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode the "Uintvar-integer" type for WSP pdu
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startIndex The starting position of the "Uintvar-integer" in this pdu
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return false when error(not a Uintvar-integer) occur
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         return value can be retrieved by getValue32() method
317c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         length of data in pdu can be retrieved by getDecodedDataLength() method
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean decodeUintvarInteger(int startIndex) {
320c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        int index = startIndex;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned32bit = 0;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((wspData[index] & 0x80) != 0) {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((index - startIndex) >= 4) {
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unsigned32bit = (unsigned32bit << 7) | (wspData[index] & 0x7f);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index++;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned32bit = (unsigned32bit << 7) | (wspData[index] & 0x7f);
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dataLength = index - startIndex + 1;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode the "Value-length" type for WSP pdu
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startIndex The starting position of the "Value-length" in this pdu
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return false when error(not a Value-length) occur
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         return value can be retrieved by getValue32() method
342c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         length of data in pdu can be retrieved by getDecodedDataLength() method
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean decodeValueLength(int startIndex) {
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((wspData[startIndex] & 0xff) > WAP_PDU_LENGTH_QUOTE) {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wspData[startIndex] < WAP_PDU_LENGTH_QUOTE) {
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unsigned32bit = wspData[startIndex];
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dataLength = 1;
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
352c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            decodeUintvarInteger(startIndex + 1);
353c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            dataLength++;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
359c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     * Decode the "Extension-media" type for WSP PDU.
360c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *
361c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     * @param startIndex The starting position of the "Extension-media" in this PDU.
362c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *
363c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     * @return false on error, such as if there is no Extension-media at startIndex.
364c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         Side-effects: updates stringValue (available with
365c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         getValueString()), which will be null on error. The length of the
366c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         data in the PDU is available with getValue32(), 0 on error.
367c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     */
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean decodeExtensionMedia(int startIndex) {
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int index = startIndex;
37038567852256d215847bc33263422bde0ddd1d150Chris Palmer        dataLength = 0;
37138567852256d215847bc33263422bde0ddd1d150Chris Palmer        stringValue = null;
37238567852256d215847bc33263422bde0ddd1d150Chris Palmer        int length = wspData.length;
37338567852256d215847bc33263422bde0ddd1d150Chris Palmer        boolean rtrn = index < length;
37438567852256d215847bc33263422bde0ddd1d150Chris Palmer
37538567852256d215847bc33263422bde0ddd1d150Chris Palmer        while (index < length && wspData[index] != 0) {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index++;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37838567852256d215847bc33263422bde0ddd1d150Chris Palmer
379c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        dataLength = index - startIndex + 1;
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stringValue = new String(wspData, startIndex, dataLength - 1);
38138567852256d215847bc33263422bde0ddd1d150Chris Palmer
38238567852256d215847bc33263422bde0ddd1d150Chris Palmer        return rtrn;
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode the "Constrained-encoding" type for WSP pdu
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startIndex The starting position of the "Constrained-encoding" in this pdu
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return false when error(not a Constrained-encoding) occur
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         return value can be retrieved first by getValueString() and second by getValue32() method
392c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         length of data in pdu can be retrieved by getDecodedDataLength() method
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean decodeConstrainedEncoding(int startIndex) {
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (decodeShortInteger(startIndex) == true) {
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stringValue = null;
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return decodeExtensionMedia(startIndex);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode the "Content-type" type for WSP pdu
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startIndex The starting position of the "Content-type" in this pdu
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
407c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     * @return false when error(not a Content-type) occurs
408c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         If a content type exists in the headers (either as inline string, or as well-known
409c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         value), getValueString() will return it. If a 'well known value' is encountered that
410c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         cannot be mapped to a string mime type, getValueString() will return null, and
411c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         getValue32() will return the unknown content type value.
412c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         length of data in pdu can be retrieved by getDecodedDataLength() method
413c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         Any content type parameters will be accessible via getContentParameters()
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean decodeContentType(int startIndex) {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mediaPrefixLength;
417c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        contentParameters = new HashMap<String, String>();
418c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
419c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        try {
420c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            if (decodeValueLength(startIndex) == false) {
421c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                boolean found = decodeConstrainedEncoding(startIndex);
422c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                if (found) {
423c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    expandWellKnownMimeType();
424c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                }
425c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                return found;
426c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            }
427c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            int headersLength = (int) unsigned32bit;
428c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            mediaPrefixLength = getDecodedDataLength();
429c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            if (decodeIntegerValue(startIndex + mediaPrefixLength) == true) {
430c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                dataLength += mediaPrefixLength;
431c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                int readLength = dataLength;
432c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                stringValue = null;
433c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                expandWellKnownMimeType();
434c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                long wellKnownValue = unsigned32bit;
435c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                String mimeType = stringValue;
436c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                if (readContentParameters(startIndex + dataLength,
437c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                        (headersLength - (dataLength - mediaPrefixLength)), 0)) {
438c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    dataLength += readLength;
439c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    unsigned32bit = wellKnownValue;
440c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    stringValue = mimeType;
441c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    return true;
442c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                }
443c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                return false;
444c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            }
445c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            if (decodeExtensionMedia(startIndex + mediaPrefixLength) == true) {
446c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                dataLength += mediaPrefixLength;
447c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                int readLength = dataLength;
448c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                expandWellKnownMimeType();
449c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                long wellKnownValue = unsigned32bit;
450c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                String mimeType = stringValue;
451c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                if (readContentParameters(startIndex + dataLength,
452c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                        (headersLength - (dataLength - mediaPrefixLength)), 0)) {
453c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    dataLength += readLength;
454c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    unsigned32bit = wellKnownValue;
455c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    stringValue = mimeType;
456c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    return true;
457c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                }
458c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            }
459c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        } catch (ArrayIndexOutOfBoundsException e) {
460c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            //something doesn't add up
461c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            return false;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
463c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        return false;
464c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    }
465c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
466c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    private boolean readContentParameters(int startIndex, int leftToRead, int accumulator) {
467c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
468c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        int totalRead = 0;
469c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
470c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        if (leftToRead > 0) {
471c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            byte nextByte = wspData[startIndex];
472c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            String value = null;
473c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            String param = null;
474c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            if ((nextByte & 0x80) == 0x00 && nextByte > 31) { // untyped
475c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                decodeTokenText(startIndex);
476c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                param = stringValue;
477c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                totalRead += dataLength;
478c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            } else { // typed
479c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                if (decodeIntegerValue(startIndex)) {
480c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    totalRead += dataLength;
481c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    int wellKnownParameterValue = (int) unsigned32bit;
482c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    param = WELL_KNOWN_PARAMETERS.get(wellKnownParameterValue);
483c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    if (param == null) {
484c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                        param = "unassigned/0x" + Long.toHexString(wellKnownParameterValue);
485c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    }
486c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    // special case for the "Q" parameter, value is a uintvar
487c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    if (wellKnownParameterValue == Q_VALUE) {
488c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                        if (decodeUintvarInteger(startIndex + totalRead)) {
489c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                            totalRead += dataLength;
490c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                            value = String.valueOf(unsigned32bit);
491c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                            contentParameters.put(param, value);
492c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                            return readContentParameters(startIndex + totalRead, leftToRead
493c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                                                            - totalRead, accumulator + totalRead);
494c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                        } else {
495c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                            return false;
496c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                        }
497c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    }
498c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                } else {
499c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    return false;
500c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                }
501c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            }
502c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
503c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            if (decodeNoValue(startIndex + totalRead)) {
504c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                totalRead += dataLength;
505c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                value = null;
506c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            } else if (decodeIntegerValue(startIndex + totalRead)) {
507c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                totalRead += dataLength;
508c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                int intValue = (int) unsigned32bit;
509c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                if (intValue == 0) {
510c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    value = "";
511c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                } else {
512c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    value = String.valueOf(intValue);
513c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                }
514c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            } else {
515c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                decodeTokenText(startIndex + totalRead);
516c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                totalRead += dataLength;
517c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                value = stringValue;
518c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                if (value.startsWith("\"")) {
519c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    // quoted string, so remove the quote
520c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                    value = value.substring(1);
521c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                }
522c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            }
523c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            contentParameters.put(param, value);
524c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            return readContentParameters(startIndex + totalRead, leftToRead - totalRead,
525c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin                                            accumulator + totalRead);
526c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
527c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        } else {
528c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            dataLength = accumulator;
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
531c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    }
532c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
533c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    /**
534c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     * Check if the next byte is No-Value
535c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *
536c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     * @param startIndex The starting position of the "Content length" in this pdu
537c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *
538c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     * @return true if and only if the next byte is 0x00
539c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     */
540c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    private boolean decodeNoValue(int startIndex) {
541c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        if (wspData[startIndex] == 0) {
542c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            dataLength = 1;
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
544c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        } else {
545c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            return false;
546c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        }
547c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    }
548c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
549c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    /**
550c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     * Populate stringValue with the mime type corresponding to the value in unsigned32bit
551c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *
552c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     * Sets unsigned32bit to -1 if stringValue is already populated
553c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     */
554c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    private void expandWellKnownMimeType() {
555c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        if (stringValue == null) {
556c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            int binaryContentType = (int) unsigned32bit;
557c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            stringValue = WELL_KNOWN_MIME_TYPES.get(binaryContentType);
558c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        } else {
559c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin            unsigned32bit = -1;
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode the "Content length" type for WSP pdu
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startIndex The starting position of the "Content length" in this pdu
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return false when error(not a Content length) occur
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         return value can be retrieved by getValue32() method
570c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         length of data in pdu can be retrieved by getDecodedDataLength() method
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean decodeContentLength(int startIndex) {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return decodeIntegerValue(startIndex);
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode the "Content location" type for WSP pdu
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startIndex The starting position of the "Content location" in this pdu
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return false when error(not a Content location) occur
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         return value can be retrieved by getValueString() method
583c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         length of data in pdu can be retrieved by getDecodedDataLength() method
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean decodeContentLocation(int startIndex) {
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return decodeTextString(startIndex);
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode the "X-Wap-Application-Id" type for WSP pdu
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startIndex The starting position of the "X-Wap-Application-Id" in this pdu
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return false when error(not a X-Wap-Application-Id) occur
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         return value can be retrieved first by getValueString() and second by getValue32()
596c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         method
597c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         length of data in pdu can be retrieved by getDecodedDataLength() method
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean decodeXWapApplicationId(int startIndex) {
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (decodeIntegerValue(startIndex) == true) {
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stringValue = null;
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return decodeTextString(startIndex);
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6087640caaf912a7eefacc3e2108c5afd70f7b072a4noda     * Seek for the "X-Wap-Application-Id" field for WSP pdu
6097640caaf912a7eefacc3e2108c5afd70f7b072a4noda     *
6107640caaf912a7eefacc3e2108c5afd70f7b072a4noda     * @param startIndex The starting position of seek pointer
6117640caaf912a7eefacc3e2108c5afd70f7b072a4noda     * @param endIndex Valid seek area end point
6127640caaf912a7eefacc3e2108c5afd70f7b072a4noda     *
6137640caaf912a7eefacc3e2108c5afd70f7b072a4noda     * @return false when error(not a X-Wap-Application-Id) occur
6147640caaf912a7eefacc3e2108c5afd70f7b072a4noda     *         return value can be retrieved by getValue32()
6157640caaf912a7eefacc3e2108c5afd70f7b072a4noda     */
6167640caaf912a7eefacc3e2108c5afd70f7b072a4noda    public boolean seekXWapApplicationId(int startIndex, int endIndex) {
6177640caaf912a7eefacc3e2108c5afd70f7b072a4noda        int index = startIndex;
6187640caaf912a7eefacc3e2108c5afd70f7b072a4noda
6197640caaf912a7eefacc3e2108c5afd70f7b072a4noda        try {
6207640caaf912a7eefacc3e2108c5afd70f7b072a4noda            for (index = startIndex; index <= endIndex; ) {
6217640caaf912a7eefacc3e2108c5afd70f7b072a4noda                /**
6227640caaf912a7eefacc3e2108c5afd70f7b072a4noda                 * 8.4.1.1  Field name
6237640caaf912a7eefacc3e2108c5afd70f7b072a4noda                 * Field name is integer or text.
6247640caaf912a7eefacc3e2108c5afd70f7b072a4noda                 */
6257640caaf912a7eefacc3e2108c5afd70f7b072a4noda                if (decodeIntegerValue(index)) {
6267640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    int fieldValue = (int) getValue32();
6277640caaf912a7eefacc3e2108c5afd70f7b072a4noda
6287640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    if (fieldValue == PARAMETER_ID_X_WAP_APPLICATION_ID) {
6297640caaf912a7eefacc3e2108c5afd70f7b072a4noda                        unsigned32bit = index + 1;
6307640caaf912a7eefacc3e2108c5afd70f7b072a4noda                        return true;
6317640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    }
6327640caaf912a7eefacc3e2108c5afd70f7b072a4noda                } else {
6337640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    if (!decodeTextString(index)) return false;
6347640caaf912a7eefacc3e2108c5afd70f7b072a4noda                }
6357640caaf912a7eefacc3e2108c5afd70f7b072a4noda                index += getDecodedDataLength();
6367640caaf912a7eefacc3e2108c5afd70f7b072a4noda                if (index > endIndex) return false;
6377640caaf912a7eefacc3e2108c5afd70f7b072a4noda
6387640caaf912a7eefacc3e2108c5afd70f7b072a4noda                /**
6397640caaf912a7eefacc3e2108c5afd70f7b072a4noda                 * 8.4.1.2 Field values
6407640caaf912a7eefacc3e2108c5afd70f7b072a4noda                 * Value Interpretation of First Octet
6417640caaf912a7eefacc3e2108c5afd70f7b072a4noda                 * 0 - 30 This octet is followed by the indicated number (0 - 30)
6427640caaf912a7eefacc3e2108c5afd70f7b072a4noda                        of data octets
6437640caaf912a7eefacc3e2108c5afd70f7b072a4noda                 * 31 This octet is followed by a uintvar, which indicates the number
6447640caaf912a7eefacc3e2108c5afd70f7b072a4noda                 *      of data octets after it
6457640caaf912a7eefacc3e2108c5afd70f7b072a4noda                 * 32 - 127 The value is a text string, terminated by a zero octet
6467640caaf912a7eefacc3e2108c5afd70f7b072a4noda                        (NUL character)
6477640caaf912a7eefacc3e2108c5afd70f7b072a4noda                 * 128 - 255 It is an encoded 7-bit value; this header has no more data
6487640caaf912a7eefacc3e2108c5afd70f7b072a4noda                 */
6497640caaf912a7eefacc3e2108c5afd70f7b072a4noda                byte val = wspData[index];
6507640caaf912a7eefacc3e2108c5afd70f7b072a4noda                if (0 <= val && val <= WAP_PDU_SHORT_LENGTH_MAX) {
6517640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    index += wspData[index] + 1;
6527640caaf912a7eefacc3e2108c5afd70f7b072a4noda                } else if (val == WAP_PDU_LENGTH_QUOTE) {
6537640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    if (index + 1 >= endIndex) return false;
6547640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    index++;
6557640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    if (!decodeUintvarInteger(index)) return false;
6567640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    index += getDecodedDataLength();
6577640caaf912a7eefacc3e2108c5afd70f7b072a4noda                } else if (WAP_PDU_LENGTH_QUOTE < val && val <= 127) {
6587640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    if (!decodeTextString(index)) return false;
6597640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    index += getDecodedDataLength();
6607640caaf912a7eefacc3e2108c5afd70f7b072a4noda                } else {
6617640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    index++;
6627640caaf912a7eefacc3e2108c5afd70f7b072a4noda                }
6637640caaf912a7eefacc3e2108c5afd70f7b072a4noda            }
6647640caaf912a7eefacc3e2108c5afd70f7b072a4noda        } catch (ArrayIndexOutOfBoundsException e) {
6657640caaf912a7eefacc3e2108c5afd70f7b072a4noda            //seek application ID failed. WSP header might be corrupted
6667640caaf912a7eefacc3e2108c5afd70f7b072a4noda            return false;
6677640caaf912a7eefacc3e2108c5afd70f7b072a4noda        }
6687640caaf912a7eefacc3e2108c5afd70f7b072a4noda        return false;
6697640caaf912a7eefacc3e2108c5afd70f7b072a4noda    }
6707640caaf912a7eefacc3e2108c5afd70f7b072a4noda
6717640caaf912a7eefacc3e2108c5afd70f7b072a4noda    /**
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode the "X-Wap-Content-URI" type for WSP pdu
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startIndex The starting position of the "X-Wap-Content-URI" in this pdu
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return false when error(not a X-Wap-Content-URI) occur
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         return value can be retrieved by getValueString() method
678c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         length of data in pdu can be retrieved by getDecodedDataLength() method
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean decodeXWapContentURI(int startIndex) {
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return decodeTextString(startIndex);
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode the "X-Wap-Initiator-URI" type for WSP pdu
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startIndex The starting position of the "X-Wap-Initiator-URI" in this pdu
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return false when error(not a X-Wap-Initiator-URI) occur
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         return value can be retrieved by getValueString() method
691c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         length of data in pdu can be retrieved by getDecodedDataLength() method
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean decodeXWapInitiatorURI(int startIndex) {
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return decodeTextString(startIndex);
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The data length of latest operation.
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDecodedDataLength() {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return dataLength;
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The 32-bits result of latest operation.
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getValue32() {
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return unsigned32bit;
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The String result of latest operation.
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getValueString() {
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return stringValue;
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
717c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin
718c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    /**
719c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     * Any parameters encountered as part of a decodeContentType() invocation.
720c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *
721c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     * @return a map of content parameters keyed by their names, or null if
722c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         decodeContentType() has not been called If any unassigned
723c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         well-known parameters are encountered, the key of the map will be
724c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         'unassigned/0x...', where '...' is the hex value of the
725c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *         unassigned parameter.  If a parameter has No-Value the value will be null.
726c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     *
727c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin     */
728c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    public HashMap<String, String> getContentParameters() {
729c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin        return contentParameters;
730c9790716f0c759d8bb197f4237a2901e5f561b5bDan Griffin    }
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
732