10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Looper;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class AdnRecordLoader extends Handler {
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    final static String LOG_TAG = "RIL_AdnRecordLoader";
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Instance Variables
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private IccFileHandler mFh;
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int ef;
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int extensionEF;
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int pendingExtLoads;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Message userResponse;
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    String pin2;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // For "load one"
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int recordNumber;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // for "load all"
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    ArrayList<AdnRecord> adns; // only valid after EVENT_ADN_LOAD_ALL_DONE
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Either an AdnRecord or a reference to adns depending
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // if this is a load one or load all operation
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Object result;
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Event Constants
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final int EVENT_ADN_LOAD_DONE = 1;
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final int EVENT_EXT_RECORD_LOAD_DONE = 2;
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final int EVENT_ADN_LOAD_ALL_DONE = 3;
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final int EVENT_EF_LINEAR_RECORD_SIZE_DONE = 4;
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final int EVENT_UPDATE_RECORD_DONE = 5;
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Constructor
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public AdnRecordLoader(IccFileHandler fh) {
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // The telephony unit-test cases may create AdnRecords
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // in secondary threads
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super(Looper.getMainLooper());
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mFh = fh;
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Resulting AdnRecord is placed in response.obj.result
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * or response.obj.exception is set
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    loadFromEF(int ef, int extensionEF, int recordNumber,
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Message response) {
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.ef = ef;
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.extensionEF = extensionEF;
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.recordNumber = recordNumber;
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.userResponse = response;
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mFh.loadEFLinearFixed(
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ef, recordNumber,
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    obtainMessage(EVENT_ADN_LOAD_DONE));
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Resulting ArrayList&lt;adnRecord> is placed in response.obj.result
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * or response.obj.exception is set
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    loadAllFromEF(int ef, int extensionEF,
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Message response) {
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.ef = ef;
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.extensionEF = extensionEF;
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.userResponse = response;
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mFh.loadEFLinearFixedAll(
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ef,
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    obtainMessage(EVENT_ADN_LOAD_ALL_DONE));
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Write adn to a EF SIM record
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * It will get the record size of EF record and compose hex adn array
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * then write the hex array to EF record
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param adn is set with alphaTag and phone number
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param ef EF fileid
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param extensionEF extension EF fileid
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param recordNumber 1-based record index
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param pin2 for CHV2 operations, must be null if pin2 is not needed
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param response will be sent to its handler when completed
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    updateEF(AdnRecord adn, int ef, int extensionEF, int recordNumber,
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String pin2, Message response) {
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.ef = ef;
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.extensionEF = extensionEF;
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.recordNumber = recordNumber;
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.userResponse = response;
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.pin2 = pin2;
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mFh.getEFLinearRecordSize( ef,
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            obtainMessage(EVENT_EF_LINEAR_RECORD_SIZE_DONE, adn));
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Overridden from Handler
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    handleMessage(Message msg) {
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar;
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        byte data[];
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AdnRecord adn;
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            switch (msg.what) {
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_EF_LINEAR_RECORD_SIZE_DONE:
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ar = (AsyncResult)(msg.obj);
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    adn = (AdnRecord)(ar.userObj);
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (ar.exception != null) {
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        throw new RuntimeException("get EF record size failed",
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                ar.exception);
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    int[] recordSize = (int[])ar.result;
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // recordSize is int[3] array
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // int[0]  is the record length
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // int[1]  is the total length of the EF file
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // int[2]  is the number of records in the EF file
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // So int[0] * int[2] = int[1]
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                   if (recordSize.length != 3 || recordNumber > recordSize[2]) {
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        throw new RuntimeException("get wrong EF record size format",
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                ar.exception);
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    data = adn.buildAdnString(recordSize[0]);
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if(data == null) {
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        throw new RuntimeException("wrong ADN format",
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                ar.exception);
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mFh.updateEFLinearFixed(ef, recordNumber,
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            data, pin2, obtainMessage(EVENT_UPDATE_RECORD_DONE));
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    pendingExtLoads = 1;
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_UPDATE_RECORD_DONE:
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ar = (AsyncResult)(msg.obj);
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (ar.exception != null) {
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        throw new RuntimeException("update EF adn record failed",
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                ar.exception);
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    pendingExtLoads = 0;
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    result = null;
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_ADN_LOAD_DONE:
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ar = (AsyncResult)(msg.obj);
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    data = (byte[])(ar.result);
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (ar.exception != null) {
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        throw new RuntimeException("load failed", ar.exception);
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (false) {
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        Log.d(LOG_TAG,"ADN EF: 0x"
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            + Integer.toHexString(ef)
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            + ":" + recordNumber
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            + "\n" + IccUtils.bytesToHexString(data));
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    adn = new AdnRecord(ef, recordNumber, data);
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    result = adn;
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (adn.hasExtendedRecord()) {
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // If we have a valid value in the ext record field,
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // we're not done yet: we need to read the corresponding
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // ext record and append it
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        pendingExtLoads = 1;
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mFh.loadEFLinearFixed(
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            extensionEF, adn.extRecord,
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            obtainMessage(EVENT_EXT_RECORD_LOAD_DONE, adn));
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_EXT_RECORD_LOAD_DONE:
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ar = (AsyncResult)(msg.obj);
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    data = (byte[])(ar.result);
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    adn = (AdnRecord)(ar.userObj);
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (ar.exception != null) {
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        throw new RuntimeException("load failed", ar.exception);
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    Log.d(LOG_TAG,"ADN extension EF: 0x"
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        + Integer.toHexString(extensionEF)
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        + ":" + adn.extRecord
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        + "\n" + IccUtils.bytesToHexString(data));
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    adn.appendExtRecord(data);
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    pendingExtLoads--;
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // result should have been set in
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // EVENT_ADN_LOAD_DONE or EVENT_ADN_LOAD_ALL_DONE
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_ADN_LOAD_ALL_DONE:
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ar = (AsyncResult)(msg.obj);
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ArrayList<byte[]> datas = (ArrayList<byte[]>)(ar.result);
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (ar.exception != null) {
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        throw new RuntimeException("load failed", ar.exception);
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    adns = new ArrayList<AdnRecord>(datas.size());
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    result = adns;
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    pendingExtLoads = 0;
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    for(int i = 0, s = datas.size() ; i < s ; i++) {
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        adn = new AdnRecord(ef, 1 + i, datas.get(i));
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        adns.add(adn);
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (adn.hasExtendedRecord()) {
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            // If we have a valid value in the ext record field,
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            // we're not done yet: we need to read the corresponding
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            // ext record and append it
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            pendingExtLoads++;
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            mFh.loadEFLinearFixed(
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                extensionEF, adn.extRecord,
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                obtainMessage(EVENT_EXT_RECORD_LOAD_DONE, adn));
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RuntimeException exc) {
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (userResponse != null) {
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                AsyncResult.forMessage(userResponse)
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                .exception = exc;
2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                userResponse.sendToTarget();
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Loading is all or nothing--either every load succeeds
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // or we fail the whole thing.
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                userResponse = null;
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (userResponse != null && pendingExtLoads == 0) {
2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            AsyncResult.forMessage(userResponse).result
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                = result;
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            userResponse.sendToTarget();
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            userResponse = null;
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
285