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