IccFileHandler.java revision c38bb60d867c5d61d90b7179a9ed2b2d1848124f
1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/* 2c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Copyright (C) 2008 The Android Open Source Project 3c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 4c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * you may not use this file except in compliance with the License. 6c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * You may obtain a copy of the License at 7c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 8c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 10c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Unless required by applicable law or agreed to in writing, software 11c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See the License for the specific language governing permissions and 14c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * limitations under the License. 15c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 16c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 17c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepackage com.android.internal.telephony; 18c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 19c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.*; 20c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.util.Log; 21c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.ArrayList; 22c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 23c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/** 24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide} 25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic abstract class IccFileHandler extends Handler implements IccConstants { 27c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 28c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //from TS 11.11 9.1 or elsewhere 29c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int COMMAND_READ_BINARY = 0xb0; 30c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int COMMAND_UPDATE_BINARY = 0xd6; 31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int COMMAND_READ_RECORD = 0xb2; 32c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int COMMAND_UPDATE_RECORD = 0xdc; 33c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int COMMAND_SEEK = 0xa2; 34c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int COMMAND_GET_RESPONSE = 0xc0; 35c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 36c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // from TS 11.11 9.2.5 37c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int READ_RECORD_MODE_ABSOLUTE = 4; 38c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** types of files TS 11.11 9.3 40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int EF_TYPE_TRANSPARENT = 0; 41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int EF_TYPE_LINEAR_FIXED = 1; 42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int EF_TYPE_CYCLIC = 3; 43c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** types of files TS 11.11 9.3 45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int TYPE_RFU = 0; 46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int TYPE_MF = 1; 47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int TYPE_DF = 2; 48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int TYPE_EF = 4; 49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // size of GET_RESPONSE for EF's 51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int GET_RESPONSE_EF_SIZE_BYTES = 15; 52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int GET_RESPONSE_EF_IMG_SIZE_BYTES = 10; 53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Byte order received in response to COMMAND_GET_RESPONSE 55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Refer TS 51.011 Section 9.2.1 56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_RFU_1 = 0; 57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_RFU_2 = 1; 58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_FILE_SIZE_1 = 2; 60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_FILE_SIZE_2 = 3; 61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_FILE_ID_1 = 4; 63c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_FILE_ID_2 = 5; 64c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_FILE_TYPE = 6; 65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_RFU_3 = 7; 66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_ACCESS_CONDITION_1 = 8; 67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_ACCESS_CONDITION_2 = 9; 68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_ACCESS_CONDITION_3 = 10; 69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_FILE_STATUS = 11; 70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_LENGTH = 12; 71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_STRUCTURE = 13; 72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int RESPONSE_DATA_RECORD_LENGTH = 14; 73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Events 76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Finished retrieving size of transparent EF; start loading. */ 78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int EVENT_GET_BINARY_SIZE_DONE = 4; 79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Finished loading contents of transparent EF; post result. */ 80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int EVENT_READ_BINARY_DONE = 5; 81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Finished retrieving size of records for linear-fixed EF; now load. */ 82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int EVENT_GET_RECORD_SIZE_DONE = 6; 83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Finished loading single record from a linear-fixed EF; post result. */ 84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int EVENT_READ_RECORD_DONE = 7; 85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Finished retrieving record size; post result. */ 86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int EVENT_GET_EF_LINEAR_RECORD_SIZE_DONE = 8; 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Finished retrieving image instance record; post result. */ 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int EVENT_READ_IMG_DONE = 9; 89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Finished retrieving icon data; post result. */ 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static protected final int EVENT_READ_ICON_DONE = 10; 91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // member variables 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected final CommandsInterface mCi; 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected final IccCard mParentCard; 95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected String mAid; 96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static class LoadLinearFixedContext { 98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int efid; 100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int recordNum, recordSize, countRecords; 101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean loadAll; 102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message onLoaded; 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ArrayList<byte[]> results; 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville LoadLinearFixedContext(int efid, int recordNum, Message onLoaded) { 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.efid = efid; 109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.recordNum = recordNum; 110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.onLoaded = onLoaded; 111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.loadAll = false; 112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville LoadLinearFixedContext(int efid, Message onLoaded) { 115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.efid = efid; 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.recordNum = 1; 117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.loadAll = true; 118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.onLoaded = onLoaded; 119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Default constructor 124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected IccFileHandler(IccCard card, String aid, CommandsInterface ci) { 126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mParentCard = card; 127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mAid = aid; 128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi = ci; 129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Public Methods 135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Load a record from a SIM Linear Fixed EF 138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileid EF id 140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param recordNum 1-based (not 0-based) record number 141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param onLoaded 142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)(onLoaded.obj)).result is the byte[] 144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void loadEFLinearFixed(int fileid, int recordNum, Message onLoaded) { 147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message response 148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville = obtainMessage(EVENT_GET_RECORD_SIZE_DONE, 149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new LoadLinearFixedContext(fileid, recordNum, onLoaded)); 150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.iccIOForApp(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid), 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, mAid, response); 153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Load a image instance record from a SIM Linear Fixed EF-IMG 157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param recordNum 1-based (not 0-based) record number 159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param onLoaded 160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)(onLoaded.obj)).result is the byte[] 162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void loadEFImgLinearFixed(int recordNum, Message onLoaded) { 165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message response = obtainMessage(EVENT_READ_IMG_DONE, 166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new LoadLinearFixedContext(IccConstants.EF_IMG, recordNum, 167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onLoaded)); 168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // TODO(): Verify when path changes are done. 170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.iccIOForApp(COMMAND_GET_RESPONSE, IccConstants.EF_IMG, "img", 171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordNum, READ_RECORD_MODE_ABSOLUTE, 172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GET_RESPONSE_EF_IMG_SIZE_BYTES, null, null, mAid, response); 173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * get record size for a linear fixed EF 177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileid EF id 179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param onLoaded ((AsnyncResult)(onLoaded.obj)).result is the recordSize[] 180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * int[0] is the record length int[1] is the total length of the EF 181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * file int[3] is the number of records in the EF file So int[0] * 182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * int[3] = int[1] 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void getEFLinearRecordSize(int fileid, Message onLoaded) { 185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message response 186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville = obtainMessage(EVENT_GET_EF_LINEAR_RECORD_SIZE_DONE, 187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new LoadLinearFixedContext(fileid, onLoaded)); 188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.iccIOForApp(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid), 189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, mAid, response); 190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Load all records from a SIM Linear Fixed EF 194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileid EF id 196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param onLoaded 197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)(onLoaded.obj)).result is an ArrayList<byte[]> 199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void loadEFLinearFixedAll(int fileid, Message onLoaded) { 202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message response = obtainMessage(EVENT_GET_RECORD_SIZE_DONE, 203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new LoadLinearFixedContext(fileid,onLoaded)); 204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.iccIOForApp(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid), 206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, mAid, response); 207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Load a SIM Transparent EF 211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileid EF id 213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param onLoaded 214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)(onLoaded.obj)).result is the byte[] 216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void loadEFTransparent(int fileid, Message onLoaded) { 220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message response = obtainMessage(EVENT_GET_BINARY_SIZE_DONE, 221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fileid, 0, onLoaded); 222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.iccIOForApp(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid), 224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, mAid, response); 225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Load a SIM Transparent EF-IMG. Used right after loadEFImgLinearFixed to 229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * retrive STK's icon data. 230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileid EF id 232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param onLoaded 233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)(onLoaded.obj)).result is the byte[] 235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void loadEFImgTransparent(int fileid, int highOffset, int lowOffset, 238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int length, Message onLoaded) { 239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message response = obtainMessage(EVENT_READ_ICON_DONE, fileid, 0, 240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onLoaded); 241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.iccIOForApp(COMMAND_READ_BINARY, fileid, "img", highOffset, lowOffset, 243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville length, null, null, mAid, response); 244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Update a record in a linear fixed EF 248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileid EF id 249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param recordNum 1-based (not 0-based) record number 250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param data must be exactly as long as the record in the EF 251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param pin2 for CHV2 operations, otherwist must be null 252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param onComplete onComplete.obj will be an AsyncResult 253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * onComplete.obj.userObj will be a IccIoResult on success 254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void updateEFLinearFixed(int fileid, int recordNum, byte[] data, 256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String pin2, Message onComplete) { 257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.iccIOForApp(COMMAND_UPDATE_RECORD, fileid, getEFPath(fileid), 258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordNum, READ_RECORD_MODE_ABSOLUTE, data.length, 259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville IccUtils.bytesToHexString(data), pin2, mAid, onComplete); 260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Update a transparent EF 264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileid EF id 265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param data must be exactly as long as the EF 266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void updateEFTransparent(int fileid, byte[] data, Message onComplete) { 268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.iccIOForApp(COMMAND_UPDATE_BINARY, fileid, getEFPath(fileid), 269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 0, 0, data.length, 270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville IccUtils.bytesToHexString(data), null, mAid, onComplete); 271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Abstract Methods 275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Private Methods 278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void sendResult(Message response, Object result, Throwable ex) { 280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (response == null) { 281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage(response, result, ex); 285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville response.sendToTarget(); 287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Overridden from Handler 290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void handleMessage(Message msg) { 292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult ar; 293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville IccIoResult result; 294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message response = null; 295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String str; 296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville LoadLinearFixedContext lc; 297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville IccException iccException; 299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte data[]; 300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int size; 301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int fileid; 302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int recordNum; 303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int recordSize[]; 304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (msg.what) { 307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_READ_IMG_DONE: 308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult) msg.obj; 309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville lc = (LoadLinearFixedContext) ar.userObj; 310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville result = (IccIoResult) ar.result; 311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville response = lc.onLoaded; 312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville iccException = result.getException(); 314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (iccException != null) { 315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, result.payload, ar.exception); 316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_READ_ICON_DONE: 319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult) msg.obj; 320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville response = (Message) ar.userObj; 321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville result = (IccIoResult) ar.result; 322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville iccException = result.getException(); 324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (iccException != null) { 325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, result.payload, ar.exception); 326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_EF_LINEAR_RECORD_SIZE_DONE: 329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville lc = (LoadLinearFixedContext) ar.userObj; 331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville result = (IccIoResult) ar.result; 332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville response = lc.onLoaded; 333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, null, ar.exception); 336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville iccException = result.getException(); 340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (iccException != null) { 341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, null, iccException); 342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = result.payload; 346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (TYPE_EF != data[RESPONSE_DATA_FILE_TYPE] || 348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_TYPE_LINEAR_FIXED != data[RESPONSE_DATA_STRUCTURE]) { 349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new IccFileTypeMismatch(); 350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordSize = new int[3]; 353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordSize[0] = data[RESPONSE_DATA_RECORD_LENGTH] & 0xFF; 354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordSize[1] = ((data[RESPONSE_DATA_FILE_SIZE_1] & 0xff) << 8) 355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + (data[RESPONSE_DATA_FILE_SIZE_2] & 0xff); 356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordSize[2] = recordSize[1] / recordSize[0]; 357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, recordSize, null); 359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_RECORD_SIZE_DONE: 361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville lc = (LoadLinearFixedContext) ar.userObj; 363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville result = (IccIoResult) ar.result; 364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville response = lc.onLoaded; 365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, null, ar.exception); 368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville iccException = result.getException(); 372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (iccException != null) { 374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, null, iccException); 375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = result.payload; 379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fileid = lc.efid; 380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordNum = lc.recordNum; 381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (TYPE_EF != data[RESPONSE_DATA_FILE_TYPE]) { 383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new IccFileTypeMismatch(); 384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (EF_TYPE_LINEAR_FIXED != data[RESPONSE_DATA_STRUCTURE]) { 387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new IccFileTypeMismatch(); 388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville lc.recordSize = data[RESPONSE_DATA_RECORD_LENGTH] & 0xFF; 391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville size = ((data[RESPONSE_DATA_FILE_SIZE_1] & 0xff) << 8) 393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + (data[RESPONSE_DATA_FILE_SIZE_2] & 0xff); 394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville lc.countRecords = size / lc.recordSize; 396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (lc.loadAll) { 398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville lc.results = new ArrayList<byte[]>(lc.countRecords); 399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.iccIOForApp(COMMAND_READ_RECORD, lc.efid, getEFPath(lc.efid), 402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville lc.recordNum, 403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville READ_RECORD_MODE_ABSOLUTE, 404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville lc.recordSize, null, null, mAid, 405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_READ_RECORD_DONE, lc)); 406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_BINARY_SIZE_DONE: 408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville response = (Message) ar.userObj; 410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville result = (IccIoResult) ar.result; 411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, null, ar.exception); 414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville iccException = result.getException(); 418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (iccException != null) { 420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, null, iccException); 421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = result.payload; 425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fileid = msg.arg1; 427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (TYPE_EF != data[RESPONSE_DATA_FILE_TYPE]) { 429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new IccFileTypeMismatch(); 430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (EF_TYPE_TRANSPARENT != data[RESPONSE_DATA_STRUCTURE]) { 433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new IccFileTypeMismatch(); 434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville size = ((data[RESPONSE_DATA_FILE_SIZE_1] & 0xff) << 8) 437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + (data[RESPONSE_DATA_FILE_SIZE_2] & 0xff); 438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.iccIOForApp(COMMAND_READ_BINARY, fileid, getEFPath(fileid), 440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 0, 0, size, null, null, mAid, 441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_READ_BINARY_DONE, 442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fileid, 0, response)); 443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_READ_RECORD_DONE: 446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville lc = (LoadLinearFixedContext) ar.userObj; 449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville result = (IccIoResult) ar.result; 450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville response = lc.onLoaded; 451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 452c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 453c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, null, ar.exception); 454c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville iccException = result.getException(); 458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (iccException != null) { 460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, null, iccException); 461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!lc.loadAll) { 465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, result.payload, null); 466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville lc.results.add(result.payload); 468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville lc.recordNum++; 470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (lc.recordNum > lc.countRecords) { 472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, lc.results, null); 473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.iccIOForApp(COMMAND_READ_RECORD, lc.efid, getEFPath(lc.efid), 475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville lc.recordNum, 476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville READ_RECORD_MODE_ABSOLUTE, 477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville lc.recordSize, null, null, mAid, 478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_READ_RECORD_DONE, lc)); 479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_READ_BINARY_DONE: 485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville response = (Message) ar.userObj; 487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville result = (IccIoResult) ar.result; 488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, null, ar.exception); 491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville iccException = result.getException(); 495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (iccException != null) { 497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, null, iccException); 498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, result.payload, null); 502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville }} catch (Exception exc) { 505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (response != null) { 506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendResult(response, null, exc); 507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("uncaught exception" + exc); 509c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Returns the root path of the EF file. 515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * i.e returns MasterFile + DFfile as a string. 516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Ex: For EF_ADN on a SIM, it will return "3F007F10" 517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * This function handles only EFids that are common to 518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * RUIM, SIM, USIM and other types of Icc cards. 519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param efId 521c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @return root path of the file. 522c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected String getCommonIccEFPath(int efid) { 524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch(efid) { 525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_ADN: 526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_FDN: 527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_MSISDN: 528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_SDN: 529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_EXT1: 530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_EXT2: 531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_EXT3: 532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return MF_SIM + DF_TELECOM; 533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_ICCID: 535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_PL: 536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return MF_SIM; 537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_IMG: 538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return MF_SIM + DF_TELECOM + DF_GRAPHICS; 539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return null; 541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected abstract String getEFPath(int efid); 544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected abstract void logd(String s); 545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected abstract void loge(String s); 547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void setAid(String aid) { 548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mAid = aid; 549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 552