19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 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.gsm.stk; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Class for representing BER-TLV objects. 2304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see "ETSI TS 102 223 Annex C" for more information. 2504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BerTlv { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mTag = BER_UNKNOWN_TAG; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<ComprehensionTlv> mCompTlvs = null; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int BER_UNKNOWN_TAG = 0x00; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int BER_PROACTIVE_COMMAND_TAG = 0xd0; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int BER_MENU_SELECTION_TAG = 0xd3; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int BER_EVENT_DOWNLOAD_TAG = 0xd6; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private BerTlv(int tag, List<ComprehensionTlv> ctlvs) { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTag = tag; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCompTlvs = ctlvs; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets a list of ComprehensionTlv objects contained in this BER-TLV object. 4404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A list of COMPREHENSION-TLV object 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<ComprehensionTlv> getComprehensionTlvs() { 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCompTlvs; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets a tag id of the BER-TLV object. 5304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A tag integer. 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getTag() { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTag; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Decodes a BER-TLV object from a byte array. 6204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param data A byte array to decode from 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A BER-TLV object decoded 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws ResultException 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static BerTlv decode(byte[] data) throws ResultException { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int curIndex = 0; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int endIndex = data.length; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tag, length = 0; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* tag */ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tag = data[curIndex++] & 0xff; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tag == BER_PROACTIVE_COMMAND_TAG) { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* length */ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int temp = data[curIndex++] & 0xff; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (temp < 0x80) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project length = temp; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (temp == 0x81) { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project temp = data[curIndex++] & 0xff; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (temp < 0x80) { 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ResultException( 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResultCode.CMD_DATA_NOT_UNDERSTOOD); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project length = temp; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ResultException( 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResultCode.CMD_DATA_NOT_UNDERSTOOD); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ComprehensionTlvTag.COMMAND_DETAILS.value() == (tag & ~0x80)) { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tag = BER_UNKNOWN_TAG; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curIndex = 0; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IndexOutOfBoundsException e) { 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (ResultException e) { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* COMPREHENSION-TLVs */ 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (endIndex - curIndex < length) { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<ComprehensionTlv> ctlvs = ComprehensionTlv.decodeMany(data, 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curIndex); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BerTlv(tag, ctlvs); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 114