1767a662ecde33c3979bf02b793d392aca0403162Wink Saville/*
2767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Copyright (C) 2008 The Android Open Source Project
3767a662ecde33c3979bf02b793d392aca0403162Wink Saville *
4767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5767a662ecde33c3979bf02b793d392aca0403162Wink Saville * you may not use this file except in compliance with the License.
6767a662ecde33c3979bf02b793d392aca0403162Wink Saville * You may obtain a copy of the License at
7767a662ecde33c3979bf02b793d392aca0403162Wink Saville *
8767a662ecde33c3979bf02b793d392aca0403162Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9767a662ecde33c3979bf02b793d392aca0403162Wink Saville *
10767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Unless required by applicable law or agreed to in writing, software
11767a662ecde33c3979bf02b793d392aca0403162Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12767a662ecde33c3979bf02b793d392aca0403162Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13767a662ecde33c3979bf02b793d392aca0403162Wink Saville * See the License for the specific language governing permissions and
14767a662ecde33c3979bf02b793d392aca0403162Wink Saville * limitations under the License.
15767a662ecde33c3979bf02b793d392aca0403162Wink Saville */
16767a662ecde33c3979bf02b793d392aca0403162Wink Saville
17767a662ecde33c3979bf02b793d392aca0403162Wink Savillepackage com.android.internal.telephony;
18767a662ecde33c3979bf02b793d392aca0403162Wink Saville
19767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.*;
20767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.util.Log;
21767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport java.util.ArrayList;
22767a662ecde33c3979bf02b793d392aca0403162Wink Saville
23767a662ecde33c3979bf02b793d392aca0403162Wink Saville/**
24767a662ecde33c3979bf02b793d392aca0403162Wink Saville * {@hide}
25767a662ecde33c3979bf02b793d392aca0403162Wink Saville */
26469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganeshpublic abstract class IccFileHandler extends Handler implements IccConstants {
27767a662ecde33c3979bf02b793d392aca0403162Wink Saville
28767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //from TS 11.11 9.1 or elsewhere
29767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int COMMAND_READ_BINARY = 0xb0;
30767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int COMMAND_UPDATE_BINARY = 0xd6;
31767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int COMMAND_READ_RECORD = 0xb2;
32767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int COMMAND_UPDATE_RECORD = 0xdc;
33767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int COMMAND_SEEK = 0xa2;
34767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int COMMAND_GET_RESPONSE = 0xc0;
35767a662ecde33c3979bf02b793d392aca0403162Wink Saville
36767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // from TS 11.11 9.2.5
37767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int READ_RECORD_MODE_ABSOLUTE = 4;
38767a662ecde33c3979bf02b793d392aca0403162Wink Saville
39767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //***** types of files  TS 11.11 9.3
40767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int EF_TYPE_TRANSPARENT = 0;
41767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int EF_TYPE_LINEAR_FIXED = 1;
42767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int EF_TYPE_CYCLIC = 3;
43767a662ecde33c3979bf02b793d392aca0403162Wink Saville
44767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //***** types of files  TS 11.11 9.3
45767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int TYPE_RFU = 0;
46767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int TYPE_MF  = 1;
47767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int TYPE_DF  = 2;
48767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int TYPE_EF  = 4;
49767a662ecde33c3979bf02b793d392aca0403162Wink Saville
50767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // size of GET_RESPONSE for EF's
51767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int GET_RESPONSE_EF_SIZE_BYTES = 15;
52767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int GET_RESPONSE_EF_IMG_SIZE_BYTES = 10;
53767a662ecde33c3979bf02b793d392aca0403162Wink Saville
54767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // Byte order received in response to COMMAND_GET_RESPONSE
55767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // Refer TS 51.011 Section 9.2.1
56767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_RFU_1 = 0;
57767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_RFU_2 = 1;
58767a662ecde33c3979bf02b793d392aca0403162Wink Saville
59767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_FILE_SIZE_1 = 2;
60767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_FILE_SIZE_2 = 3;
61767a662ecde33c3979bf02b793d392aca0403162Wink Saville
62767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_FILE_ID_1 = 4;
63767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_FILE_ID_2 = 5;
64767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_FILE_TYPE = 6;
65767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_RFU_3 = 7;
66767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_ACCESS_CONDITION_1 = 8;
67767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_ACCESS_CONDITION_2 = 9;
68767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_ACCESS_CONDITION_3 = 10;
69767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_FILE_STATUS = 11;
70767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_LENGTH = 12;
71767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_STRUCTURE = 13;
72767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int RESPONSE_DATA_RECORD_LENGTH = 14;
73767a662ecde33c3979bf02b793d392aca0403162Wink Saville
74767a662ecde33c3979bf02b793d392aca0403162Wink Saville
75767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //***** Events
76767a662ecde33c3979bf02b793d392aca0403162Wink Saville
77767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /** Finished retrieving size of transparent EF; start loading. */
78767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int EVENT_GET_BINARY_SIZE_DONE = 4;
79767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /** Finished loading contents of transparent EF; post result. */
80767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int EVENT_READ_BINARY_DONE = 5;
81767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /** Finished retrieving size of records for linear-fixed EF; now load. */
82767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int EVENT_GET_RECORD_SIZE_DONE = 6;
83767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /** Finished loading single record from a linear-fixed EF; post result. */
84767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int EVENT_READ_RECORD_DONE = 7;
85767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /** Finished retrieving record size; post result. */
86767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int EVENT_GET_EF_LINEAR_RECORD_SIZE_DONE = 8;
87767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /** Finished retrieving image instance record; post result. */
88767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int EVENT_READ_IMG_DONE = 9;
89767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /** Finished retrieving icon data; post result. */
90767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static protected final int EVENT_READ_ICON_DONE = 10;
91767a662ecde33c3979bf02b793d392aca0403162Wink Saville
92767a662ecde33c3979bf02b793d392aca0403162Wink Saville     // member variables
93767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected PhoneBase phone;
94767a662ecde33c3979bf02b793d392aca0403162Wink Saville
95767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static class LoadLinearFixedContext {
96767a662ecde33c3979bf02b793d392aca0403162Wink Saville
97767a662ecde33c3979bf02b793d392aca0403162Wink Saville        int efid;
98767a662ecde33c3979bf02b793d392aca0403162Wink Saville        int recordNum, recordSize, countRecords;
99767a662ecde33c3979bf02b793d392aca0403162Wink Saville        boolean loadAll;
100767a662ecde33c3979bf02b793d392aca0403162Wink Saville
101767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Message onLoaded;
102767a662ecde33c3979bf02b793d392aca0403162Wink Saville
103767a662ecde33c3979bf02b793d392aca0403162Wink Saville        ArrayList<byte[]> results;
104767a662ecde33c3979bf02b793d392aca0403162Wink Saville
105767a662ecde33c3979bf02b793d392aca0403162Wink Saville        LoadLinearFixedContext(int efid, int recordNum, Message onLoaded) {
106767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.efid = efid;
107767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.recordNum = recordNum;
108767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.onLoaded = onLoaded;
109767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.loadAll = false;
110767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
111767a662ecde33c3979bf02b793d392aca0403162Wink Saville
112767a662ecde33c3979bf02b793d392aca0403162Wink Saville        LoadLinearFixedContext(int efid, Message onLoaded) {
113767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.efid = efid;
114767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.recordNum = 1;
115767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.loadAll = true;
116767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.onLoaded = onLoaded;
117767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
118767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
119767a662ecde33c3979bf02b793d392aca0403162Wink Saville
120767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
121767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Default constructor
122767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
123767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected IccFileHandler(PhoneBase phone) {
124767a662ecde33c3979bf02b793d392aca0403162Wink Saville        super();
125767a662ecde33c3979bf02b793d392aca0403162Wink Saville        this.phone = phone;
126767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
127767a662ecde33c3979bf02b793d392aca0403162Wink Saville
128767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void dispose() {
129767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
130767a662ecde33c3979bf02b793d392aca0403162Wink Saville
131767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //***** Public Methods
132767a662ecde33c3979bf02b793d392aca0403162Wink Saville
133767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
134767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Load a record from a SIM Linear Fixed EF
135767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
136767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param fileid EF id
137767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param recordNum 1-based (not 0-based) record number
138767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param onLoaded
139767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
140767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * ((AsyncResult)(onLoaded.obj)).result is the byte[]
141767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
142767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
143767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void loadEFLinearFixed(int fileid, int recordNum, Message onLoaded) {
144767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Message response
145767a662ecde33c3979bf02b793d392aca0403162Wink Saville            = obtainMessage(EVENT_GET_RECORD_SIZE_DONE,
146767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        new LoadLinearFixedContext(fileid, recordNum, onLoaded));
147767a662ecde33c3979bf02b793d392aca0403162Wink Saville
148469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        phone.mCM.iccIO(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid),
149767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, response);
150767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
151767a662ecde33c3979bf02b793d392aca0403162Wink Saville
152767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
153767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Load a image instance record from a SIM Linear Fixed EF-IMG
154767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
155767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param recordNum 1-based (not 0-based) record number
156767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param onLoaded
157767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
158767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * ((AsyncResult)(onLoaded.obj)).result is the byte[]
159767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
160767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
161767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void loadEFImgLinearFixed(int recordNum, Message onLoaded) {
162767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Message response = obtainMessage(EVENT_READ_IMG_DONE,
163767a662ecde33c3979bf02b793d392aca0403162Wink Saville                new LoadLinearFixedContext(IccConstants.EF_IMG, recordNum,
164767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        onLoaded));
165767a662ecde33c3979bf02b793d392aca0403162Wink Saville
166469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        // TODO(): Verify when path changes are done.
167767a662ecde33c3979bf02b793d392aca0403162Wink Saville        phone.mCM.iccIO(COMMAND_GET_RESPONSE, IccConstants.EF_IMG, "img",
168767a662ecde33c3979bf02b793d392aca0403162Wink Saville                recordNum, READ_RECORD_MODE_ABSOLUTE,
169767a662ecde33c3979bf02b793d392aca0403162Wink Saville                GET_RESPONSE_EF_IMG_SIZE_BYTES, null, null, response);
170767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
171767a662ecde33c3979bf02b793d392aca0403162Wink Saville
172767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
173767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * get record size for a linear fixed EF
174767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
175767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param fileid EF id
176767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param onLoaded ((AsnyncResult)(onLoaded.obj)).result is the recordSize[]
177767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *        int[0] is the record length int[1] is the total length of the EF
178767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *        file int[3] is the number of records in the EF file So int[0] *
179767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *        int[3] = int[1]
180767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
181767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getEFLinearRecordSize(int fileid, Message onLoaded) {
182767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Message response
183767a662ecde33c3979bf02b793d392aca0403162Wink Saville                = obtainMessage(EVENT_GET_EF_LINEAR_RECORD_SIZE_DONE,
184767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        new LoadLinearFixedContext(fileid, onLoaded));
185469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        phone.mCM.iccIO(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid),
186767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, response);
187767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
188767a662ecde33c3979bf02b793d392aca0403162Wink Saville
189767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
190767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Load all records from a SIM Linear Fixed EF
191767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
192767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param fileid EF id
193767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param onLoaded
194767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
195767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * ((AsyncResult)(onLoaded.obj)).result is an ArrayList<byte[]>
196767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
197767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
198767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void loadEFLinearFixedAll(int fileid, Message onLoaded) {
199767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Message response = obtainMessage(EVENT_GET_RECORD_SIZE_DONE,
200767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        new LoadLinearFixedContext(fileid,onLoaded));
201767a662ecde33c3979bf02b793d392aca0403162Wink Saville
202469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        phone.mCM.iccIO(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid),
203767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, response);
204767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
205767a662ecde33c3979bf02b793d392aca0403162Wink Saville
206767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
207767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Load a SIM Transparent EF
208767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
209767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param fileid EF id
210767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param onLoaded
211767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
212767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * ((AsyncResult)(onLoaded.obj)).result is the byte[]
213767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
214767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
215767a662ecde33c3979bf02b793d392aca0403162Wink Saville
216767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void loadEFTransparent(int fileid, Message onLoaded) {
217767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Message response = obtainMessage(EVENT_GET_BINARY_SIZE_DONE,
218767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        fileid, 0, onLoaded);
219767a662ecde33c3979bf02b793d392aca0403162Wink Saville
220469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        phone.mCM.iccIO(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid),
221767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, response);
222767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
223767a662ecde33c3979bf02b793d392aca0403162Wink Saville
224767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
225767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Load a SIM Transparent EF-IMG. Used right after loadEFImgLinearFixed to
226767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * retrive STK's icon data.
227767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
228767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param fileid EF id
229767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param onLoaded
230767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
231767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * ((AsyncResult)(onLoaded.obj)).result is the byte[]
232767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
233767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
234767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void loadEFImgTransparent(int fileid, int highOffset, int lowOffset,
235767a662ecde33c3979bf02b793d392aca0403162Wink Saville            int length, Message onLoaded) {
236767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Message response = obtainMessage(EVENT_READ_ICON_DONE, fileid, 0,
237767a662ecde33c3979bf02b793d392aca0403162Wink Saville                onLoaded);
238767a662ecde33c3979bf02b793d392aca0403162Wink Saville
239767a662ecde33c3979bf02b793d392aca0403162Wink Saville        phone.mCM.iccIO(COMMAND_READ_BINARY, fileid, "img", highOffset, lowOffset,
240767a662ecde33c3979bf02b793d392aca0403162Wink Saville                length, null, null, response);
241767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
242767a662ecde33c3979bf02b793d392aca0403162Wink Saville
243767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
244767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Update a record in a linear fixed EF
245767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param fileid EF id
246767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param recordNum 1-based (not 0-based) record number
247767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param data must be exactly as long as the record in the EF
248767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param pin2 for CHV2 operations, otherwist must be null
249767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param onComplete onComplete.obj will be an AsyncResult
250767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *                   onComplete.obj.userObj will be a IccIoResult on success
251767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
252767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void updateEFLinearFixed(int fileid, int recordNum, byte[] data,
253767a662ecde33c3979bf02b793d392aca0403162Wink Saville            String pin2, Message onComplete) {
254469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        phone.mCM.iccIO(COMMAND_UPDATE_RECORD, fileid, getEFPath(fileid),
255767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        recordNum, READ_RECORD_MODE_ABSOLUTE, data.length,
256767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        IccUtils.bytesToHexString(data), pin2, onComplete);
257767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
258767a662ecde33c3979bf02b793d392aca0403162Wink Saville
259767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
260767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Update a transparent EF
261767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param fileid EF id
262767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param data must be exactly as long as the EF
263767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
264767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void updateEFTransparent(int fileid, byte[] data, Message onComplete) {
265469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        phone.mCM.iccIO(COMMAND_UPDATE_BINARY, fileid, getEFPath(fileid),
266767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        0, 0, data.length,
267767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        IccUtils.bytesToHexString(data), null, onComplete);
268767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
269767a662ecde33c3979bf02b793d392aca0403162Wink Saville
270767a662ecde33c3979bf02b793d392aca0403162Wink Saville
271767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //***** Abstract Methods
272767a662ecde33c3979bf02b793d392aca0403162Wink Saville
273767a662ecde33c3979bf02b793d392aca0403162Wink Saville
274767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //***** Private Methods
275767a662ecde33c3979bf02b793d392aca0403162Wink Saville
276767a662ecde33c3979bf02b793d392aca0403162Wink Saville    private void sendResult(Message response, Object result, Throwable ex) {
277767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (response == null) {
278767a662ecde33c3979bf02b793d392aca0403162Wink Saville            return;
279767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
280767a662ecde33c3979bf02b793d392aca0403162Wink Saville
281767a662ecde33c3979bf02b793d392aca0403162Wink Saville        AsyncResult.forMessage(response, result, ex);
282767a662ecde33c3979bf02b793d392aca0403162Wink Saville
283767a662ecde33c3979bf02b793d392aca0403162Wink Saville        response.sendToTarget();
284767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
285767a662ecde33c3979bf02b793d392aca0403162Wink Saville
286767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //***** Overridden from Handler
287767a662ecde33c3979bf02b793d392aca0403162Wink Saville
288767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void handleMessage(Message msg) {
289767a662ecde33c3979bf02b793d392aca0403162Wink Saville        AsyncResult ar;
290767a662ecde33c3979bf02b793d392aca0403162Wink Saville        IccIoResult result;
291767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Message response = null;
292767a662ecde33c3979bf02b793d392aca0403162Wink Saville        String str;
293767a662ecde33c3979bf02b793d392aca0403162Wink Saville        LoadLinearFixedContext lc;
294767a662ecde33c3979bf02b793d392aca0403162Wink Saville
295767a662ecde33c3979bf02b793d392aca0403162Wink Saville        IccException iccException;
296767a662ecde33c3979bf02b793d392aca0403162Wink Saville        byte data[];
297767a662ecde33c3979bf02b793d392aca0403162Wink Saville        int size;
298767a662ecde33c3979bf02b793d392aca0403162Wink Saville        int fileid;
299767a662ecde33c3979bf02b793d392aca0403162Wink Saville        int recordNum;
300767a662ecde33c3979bf02b793d392aca0403162Wink Saville        int recordSize[];
301767a662ecde33c3979bf02b793d392aca0403162Wink Saville
302767a662ecde33c3979bf02b793d392aca0403162Wink Saville        try {
303767a662ecde33c3979bf02b793d392aca0403162Wink Saville            switch (msg.what) {
304767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_READ_IMG_DONE:
305767a662ecde33c3979bf02b793d392aca0403162Wink Saville                ar = (AsyncResult) msg.obj;
306767a662ecde33c3979bf02b793d392aca0403162Wink Saville                lc = (LoadLinearFixedContext) ar.userObj;
307767a662ecde33c3979bf02b793d392aca0403162Wink Saville                result = (IccIoResult) ar.result;
308767a662ecde33c3979bf02b793d392aca0403162Wink Saville                response = lc.onLoaded;
309767a662ecde33c3979bf02b793d392aca0403162Wink Saville
310767a662ecde33c3979bf02b793d392aca0403162Wink Saville                iccException = result.getException();
311767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (iccException != null) {
312767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    sendResult(response, result.payload, ar.exception);
313767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
314767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
315767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_READ_ICON_DONE:
316767a662ecde33c3979bf02b793d392aca0403162Wink Saville                ar = (AsyncResult) msg.obj;
317767a662ecde33c3979bf02b793d392aca0403162Wink Saville                response = (Message) ar.userObj;
318767a662ecde33c3979bf02b793d392aca0403162Wink Saville                result = (IccIoResult) ar.result;
319767a662ecde33c3979bf02b793d392aca0403162Wink Saville
320767a662ecde33c3979bf02b793d392aca0403162Wink Saville                iccException = result.getException();
321767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (iccException != null) {
322767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    sendResult(response, result.payload, ar.exception);
323767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
324767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
325767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_GET_EF_LINEAR_RECORD_SIZE_DONE:
326767a662ecde33c3979bf02b793d392aca0403162Wink Saville                ar = (AsyncResult)msg.obj;
327767a662ecde33c3979bf02b793d392aca0403162Wink Saville                lc = (LoadLinearFixedContext) ar.userObj;
328767a662ecde33c3979bf02b793d392aca0403162Wink Saville                result = (IccIoResult) ar.result;
329767a662ecde33c3979bf02b793d392aca0403162Wink Saville                response = lc.onLoaded;
330767a662ecde33c3979bf02b793d392aca0403162Wink Saville
331767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (ar.exception != null) {
332767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    sendResult(response, null, ar.exception);
333767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    break;
334767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
335767a662ecde33c3979bf02b793d392aca0403162Wink Saville
336767a662ecde33c3979bf02b793d392aca0403162Wink Saville                iccException = result.getException();
337767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (iccException != null) {
338767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    sendResult(response, null, iccException);
339767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    break;
340767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
341767a662ecde33c3979bf02b793d392aca0403162Wink Saville
342767a662ecde33c3979bf02b793d392aca0403162Wink Saville                data = result.payload;
343767a662ecde33c3979bf02b793d392aca0403162Wink Saville
344767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (TYPE_EF != data[RESPONSE_DATA_FILE_TYPE] ||
345767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    EF_TYPE_LINEAR_FIXED != data[RESPONSE_DATA_STRUCTURE]) {
346767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    throw new IccFileTypeMismatch();
347767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
348767a662ecde33c3979bf02b793d392aca0403162Wink Saville
349767a662ecde33c3979bf02b793d392aca0403162Wink Saville                recordSize = new int[3];
350767a662ecde33c3979bf02b793d392aca0403162Wink Saville                recordSize[0] = data[RESPONSE_DATA_RECORD_LENGTH] & 0xFF;
351767a662ecde33c3979bf02b793d392aca0403162Wink Saville                recordSize[1] = ((data[RESPONSE_DATA_FILE_SIZE_1] & 0xff) << 8)
352767a662ecde33c3979bf02b793d392aca0403162Wink Saville                       + (data[RESPONSE_DATA_FILE_SIZE_2] & 0xff);
353767a662ecde33c3979bf02b793d392aca0403162Wink Saville                recordSize[2] = recordSize[1] / recordSize[0];
354767a662ecde33c3979bf02b793d392aca0403162Wink Saville
355767a662ecde33c3979bf02b793d392aca0403162Wink Saville                sendResult(response, recordSize, null);
356767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
357767a662ecde33c3979bf02b793d392aca0403162Wink Saville             case EVENT_GET_RECORD_SIZE_DONE:
358767a662ecde33c3979bf02b793d392aca0403162Wink Saville                ar = (AsyncResult)msg.obj;
359767a662ecde33c3979bf02b793d392aca0403162Wink Saville                lc = (LoadLinearFixedContext) ar.userObj;
360767a662ecde33c3979bf02b793d392aca0403162Wink Saville                result = (IccIoResult) ar.result;
361767a662ecde33c3979bf02b793d392aca0403162Wink Saville                response = lc.onLoaded;
362767a662ecde33c3979bf02b793d392aca0403162Wink Saville
363767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (ar.exception != null) {
364767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    sendResult(response, null, ar.exception);
365767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    break;
366767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
367767a662ecde33c3979bf02b793d392aca0403162Wink Saville
368767a662ecde33c3979bf02b793d392aca0403162Wink Saville                iccException = result.getException();
369767a662ecde33c3979bf02b793d392aca0403162Wink Saville
370767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (iccException != null) {
371767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    sendResult(response, null, iccException);
372767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    break;
373767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
374767a662ecde33c3979bf02b793d392aca0403162Wink Saville
375767a662ecde33c3979bf02b793d392aca0403162Wink Saville                data = result.payload;
376767a662ecde33c3979bf02b793d392aca0403162Wink Saville                fileid = lc.efid;
377767a662ecde33c3979bf02b793d392aca0403162Wink Saville                recordNum = lc.recordNum;
378767a662ecde33c3979bf02b793d392aca0403162Wink Saville
379767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (TYPE_EF != data[RESPONSE_DATA_FILE_TYPE]) {
380767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    throw new IccFileTypeMismatch();
381767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
382767a662ecde33c3979bf02b793d392aca0403162Wink Saville
383767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (EF_TYPE_LINEAR_FIXED != data[RESPONSE_DATA_STRUCTURE]) {
384767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    throw new IccFileTypeMismatch();
385767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
386767a662ecde33c3979bf02b793d392aca0403162Wink Saville
387767a662ecde33c3979bf02b793d392aca0403162Wink Saville                lc.recordSize = data[RESPONSE_DATA_RECORD_LENGTH] & 0xFF;
388767a662ecde33c3979bf02b793d392aca0403162Wink Saville
389767a662ecde33c3979bf02b793d392aca0403162Wink Saville                size = ((data[RESPONSE_DATA_FILE_SIZE_1] & 0xff) << 8)
390767a662ecde33c3979bf02b793d392aca0403162Wink Saville                       + (data[RESPONSE_DATA_FILE_SIZE_2] & 0xff);
391767a662ecde33c3979bf02b793d392aca0403162Wink Saville
392767a662ecde33c3979bf02b793d392aca0403162Wink Saville                lc.countRecords = size / lc.recordSize;
393767a662ecde33c3979bf02b793d392aca0403162Wink Saville
394767a662ecde33c3979bf02b793d392aca0403162Wink Saville                 if (lc.loadAll) {
395767a662ecde33c3979bf02b793d392aca0403162Wink Saville                     lc.results = new ArrayList<byte[]>(lc.countRecords);
396767a662ecde33c3979bf02b793d392aca0403162Wink Saville                 }
397767a662ecde33c3979bf02b793d392aca0403162Wink Saville
398469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh                 phone.mCM.iccIO(COMMAND_READ_RECORD, lc.efid, getEFPath(lc.efid),
399767a662ecde33c3979bf02b793d392aca0403162Wink Saville                         lc.recordNum,
400767a662ecde33c3979bf02b793d392aca0403162Wink Saville                         READ_RECORD_MODE_ABSOLUTE,
401767a662ecde33c3979bf02b793d392aca0403162Wink Saville                         lc.recordSize, null, null,
402767a662ecde33c3979bf02b793d392aca0403162Wink Saville                         obtainMessage(EVENT_READ_RECORD_DONE, lc));
403767a662ecde33c3979bf02b793d392aca0403162Wink Saville                 break;
404767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_GET_BINARY_SIZE_DONE:
405767a662ecde33c3979bf02b793d392aca0403162Wink Saville                ar = (AsyncResult)msg.obj;
406767a662ecde33c3979bf02b793d392aca0403162Wink Saville                response = (Message) ar.userObj;
407767a662ecde33c3979bf02b793d392aca0403162Wink Saville                result = (IccIoResult) ar.result;
408767a662ecde33c3979bf02b793d392aca0403162Wink Saville
409767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (ar.exception != null) {
410767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    sendResult(response, null, ar.exception);
411767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    break;
412767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
413767a662ecde33c3979bf02b793d392aca0403162Wink Saville
414767a662ecde33c3979bf02b793d392aca0403162Wink Saville                iccException = result.getException();
415767a662ecde33c3979bf02b793d392aca0403162Wink Saville
416767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (iccException != null) {
417767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    sendResult(response, null, iccException);
418767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    break;
419767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
420767a662ecde33c3979bf02b793d392aca0403162Wink Saville
421767a662ecde33c3979bf02b793d392aca0403162Wink Saville                data = result.payload;
422767a662ecde33c3979bf02b793d392aca0403162Wink Saville
423767a662ecde33c3979bf02b793d392aca0403162Wink Saville                fileid = msg.arg1;
424767a662ecde33c3979bf02b793d392aca0403162Wink Saville
425767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (TYPE_EF != data[RESPONSE_DATA_FILE_TYPE]) {
426767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    throw new IccFileTypeMismatch();
427767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
428767a662ecde33c3979bf02b793d392aca0403162Wink Saville
429767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (EF_TYPE_TRANSPARENT != data[RESPONSE_DATA_STRUCTURE]) {
430767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    throw new IccFileTypeMismatch();
431767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
432767a662ecde33c3979bf02b793d392aca0403162Wink Saville
433767a662ecde33c3979bf02b793d392aca0403162Wink Saville                size = ((data[RESPONSE_DATA_FILE_SIZE_1] & 0xff) << 8)
434767a662ecde33c3979bf02b793d392aca0403162Wink Saville                       + (data[RESPONSE_DATA_FILE_SIZE_2] & 0xff);
435767a662ecde33c3979bf02b793d392aca0403162Wink Saville
436469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh                phone.mCM.iccIO(COMMAND_READ_BINARY, fileid, getEFPath(fileid),
437767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                0, 0, size, null, null,
438767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                obtainMessage(EVENT_READ_BINARY_DONE,
439767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                              fileid, 0, response));
440767a662ecde33c3979bf02b793d392aca0403162Wink Saville            break;
441767a662ecde33c3979bf02b793d392aca0403162Wink Saville
442767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_READ_RECORD_DONE:
443767a662ecde33c3979bf02b793d392aca0403162Wink Saville
444767a662ecde33c3979bf02b793d392aca0403162Wink Saville                ar = (AsyncResult)msg.obj;
445767a662ecde33c3979bf02b793d392aca0403162Wink Saville                lc = (LoadLinearFixedContext) ar.userObj;
446767a662ecde33c3979bf02b793d392aca0403162Wink Saville                result = (IccIoResult) ar.result;
447767a662ecde33c3979bf02b793d392aca0403162Wink Saville                response = lc.onLoaded;
448767a662ecde33c3979bf02b793d392aca0403162Wink Saville
449767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (ar.exception != null) {
450767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    sendResult(response, null, ar.exception);
451767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    break;
452767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
453767a662ecde33c3979bf02b793d392aca0403162Wink Saville
454767a662ecde33c3979bf02b793d392aca0403162Wink Saville                iccException = result.getException();
455767a662ecde33c3979bf02b793d392aca0403162Wink Saville
456767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (iccException != null) {
457767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    sendResult(response, null, iccException);
458767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    break;
459767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
460767a662ecde33c3979bf02b793d392aca0403162Wink Saville
461767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (!lc.loadAll) {
462767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    sendResult(response, result.payload, null);
463767a662ecde33c3979bf02b793d392aca0403162Wink Saville                } else {
464767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    lc.results.add(result.payload);
465767a662ecde33c3979bf02b793d392aca0403162Wink Saville
466767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    lc.recordNum++;
467767a662ecde33c3979bf02b793d392aca0403162Wink Saville
468767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    if (lc.recordNum > lc.countRecords) {
469767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        sendResult(response, lc.results, null);
470767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    } else {
471469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh                        phone.mCM.iccIO(COMMAND_READ_RECORD, lc.efid, getEFPath(lc.efid),
472767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                    lc.recordNum,
473767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                    READ_RECORD_MODE_ABSOLUTE,
474767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                    lc.recordSize, null, null,
475767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                    obtainMessage(EVENT_READ_RECORD_DONE, lc));
476767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    }
477767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
478767a662ecde33c3979bf02b793d392aca0403162Wink Saville
479767a662ecde33c3979bf02b793d392aca0403162Wink Saville            break;
480767a662ecde33c3979bf02b793d392aca0403162Wink Saville
481767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_READ_BINARY_DONE:
482767a662ecde33c3979bf02b793d392aca0403162Wink Saville                ar = (AsyncResult)msg.obj;
483767a662ecde33c3979bf02b793d392aca0403162Wink Saville                response = (Message) ar.userObj;
484767a662ecde33c3979bf02b793d392aca0403162Wink Saville                result = (IccIoResult) ar.result;
485767a662ecde33c3979bf02b793d392aca0403162Wink Saville
486767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (ar.exception != null) {
487767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    sendResult(response, null, ar.exception);
488767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    break;
489767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
490767a662ecde33c3979bf02b793d392aca0403162Wink Saville
491767a662ecde33c3979bf02b793d392aca0403162Wink Saville                iccException = result.getException();
492767a662ecde33c3979bf02b793d392aca0403162Wink Saville
493767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (iccException != null) {
494767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    sendResult(response, null, iccException);
495767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    break;
496767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
497767a662ecde33c3979bf02b793d392aca0403162Wink Saville
498767a662ecde33c3979bf02b793d392aca0403162Wink Saville                sendResult(response, result.payload, null);
499767a662ecde33c3979bf02b793d392aca0403162Wink Saville            break;
500767a662ecde33c3979bf02b793d392aca0403162Wink Saville
501767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }} catch (Exception exc) {
502767a662ecde33c3979bf02b793d392aca0403162Wink Saville            if (response != null) {
503767a662ecde33c3979bf02b793d392aca0403162Wink Saville                sendResult(response, null, exc);
504767a662ecde33c3979bf02b793d392aca0403162Wink Saville            } else {
505767a662ecde33c3979bf02b793d392aca0403162Wink Saville                loge("uncaught exception" + exc);
506767a662ecde33c3979bf02b793d392aca0403162Wink Saville            }
507767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
508767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
509767a662ecde33c3979bf02b793d392aca0403162Wink Saville
510469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh    /**
511469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh     * Returns the root path of the EF file.
512469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh     * i.e returns MasterFile + DFfile as a string.
513469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh     * Ex: For EF_ADN on a SIM, it will return "3F007F10"
514469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh     * This function handles only EFids that are common to
515469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh     * RUIM, SIM, USIM and other types of Icc cards.
516469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh     *
517469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh     * @param efId
518469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh     * @return root path of the file.
519469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh     */
520469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh    protected String getCommonIccEFPath(int efid) {
521469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        switch(efid) {
522469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        case EF_ADN:
523469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        case EF_FDN:
524469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        case EF_MSISDN:
525469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        case EF_SDN:
526469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        case EF_EXT1:
527469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        case EF_EXT2:
528469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        case EF_EXT3:
529469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh            return MF_SIM + DF_TELECOM;
530469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh
531469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        case EF_ICCID:
532469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh            return MF_SIM;
533469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        case EF_IMG:
534469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh            return MF_SIM + DF_TELECOM + DF_GRAPHICS;
535469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        }
536469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh        return null;
537469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh    }
538469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh
539469d5ba4cd963e9a6b39bb0514f7cf54ea503b30Jaikumar Ganesh    protected abstract String getEFPath(int efid);
540767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected abstract void logd(String s);
541767a662ecde33c3979bf02b793d392aca0403162Wink Saville
542767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected abstract void loge(String s);
543767a662ecde33c3979bf02b793d392aca0403162Wink Saville
544767a662ecde33c3979bf02b793d392aca0403162Wink Saville}
545