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