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 android.os.AsyncResult;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.SparseArray;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.gsm.UsimPhoneBookManager;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Iterator;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic final class AdnRecordCache extends Handler implements IccConstants {
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Instance Variables
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private IccFileHandler mFh;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private UsimPhoneBookManager mUsimPhoneBookManager;
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Indexed by EF ID
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    SparseArray<ArrayList<AdnRecord>> adnLikeFiles
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        = new SparseArray<ArrayList<AdnRecord>>();
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // People waiting for ADN-like files to be loaded
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    SparseArray<ArrayList<Message>> adnLikeWaiters
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        = new SparseArray<ArrayList<Message>>();
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // People waiting for adn record to be updated
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    SparseArray<Message> userWriteResponse = new SparseArray<Message>();
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Event Constants
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final int EVENT_LOAD_ALL_ADN_LIKE_DONE = 1;
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final int EVENT_UPDATE_ADN_DONE = 2;
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Constructor
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public AdnRecordCache(IccFileHandler fh) {
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mFh = fh;
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mUsimPhoneBookManager = new UsimPhoneBookManager(mFh, this);
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Called from SIMRecords
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Called from SIMRecords.onRadioNotAvailable and SIMRecords.handleSimRefresh.
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void reset() {
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        adnLikeFiles.clear();
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mUsimPhoneBookManager.reset();
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        clearWaiters();
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        clearUserWriters();
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void clearWaiters() {
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int size = adnLikeWaiters.size();
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0; i < size; i++) {
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ArrayList<Message> waiters = adnLikeWaiters.valueAt(i);
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            AsyncResult ar = new AsyncResult(null, null, new RuntimeException("AdnCache reset"));
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            notifyWaiters(waiters, ar);
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        adnLikeWaiters.clear();
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void clearUserWriters() {
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int size = userWriteResponse.size();
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0; i < size; i++) {
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sendErrorResponse(userWriteResponse.valueAt(i), "AdnCace reset");
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        userWriteResponse.clear();
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return List of AdnRecords for efid if we've already loaded them this
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * radio session, or null if we haven't
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public ArrayList<AdnRecord>
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getRecordsIfLoaded(int efid) {
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return adnLikeFiles.get(efid);
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns extension ef associated with ADN-like EF or -1 if
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * we don't know.
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * See 3GPP TS 51.011 for this mapping
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int extensionEfForEf(int efid) {
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (efid) {
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EF_MBDN: return EF_EXT6;
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EF_ADN: return EF_EXT1;
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EF_SDN: return EF_EXT3;
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EF_FDN: return EF_EXT2;
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EF_MSISDN: return EF_EXT1;
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EF_PBR: return 0; // The EF PBR doesn't have an extension record
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default: return -1;
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void sendErrorResponse(Message response, String errString) {
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (response != null) {
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Exception e = new RuntimeException(errString);
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            AsyncResult.forMessage(response).exception = e;
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            response.sendToTarget();
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Update an ADN-like record in EF by record index
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param efid must be one among EF_ADN, EF_FDN, and EF_SDN
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param adn is the new adn to be stored
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param recordIndex is the 1-based adn record index
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param pin2 is required to update EF_FDN, otherwise must be null
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param response message to be posted when done
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *        response.exception hold the exception in error
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void updateAdnByIndex(int efid, AdnRecord adn, int recordIndex, String pin2,
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Message response) {
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int extensionEF = extensionEfForEf(efid);
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (extensionEF < 0) {
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sendErrorResponse(response, "EF is not known ADN-like EF:" + efid);
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Message pendingResponse = userWriteResponse.get(efid);
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (pendingResponse != null) {
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sendErrorResponse(response, "Have pending update for EF:" + efid);
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        userWriteResponse.put(efid, response);
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        new AdnRecordLoader(mFh).updateEF(adn, efid, extensionEF,
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                recordIndex, pin2,
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                obtainMessage(EVENT_UPDATE_ADN_DONE, efid, recordIndex, adn));
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Replace oldAdn with newAdn in ADN-like record in EF
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The ADN-like records must be read through requestLoadAllAdnLike() before
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param efid must be one of EF_ADN, EF_FDN, and EF_SDN
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param oldAdn is the adn to be replaced
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *        If oldAdn.isEmpty() is ture, it insert the newAdn
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param newAdn is the adn to be stored
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *        If newAdn.isEmpty() is true, it delete the oldAdn
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param pin2 is required to update EF_FDN, otherwise must be null
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param response message to be posted when done
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *        response.exception hold the exception in error
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void updateAdnBySearch(int efid, AdnRecord oldAdn, AdnRecord newAdn,
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String pin2, Message response) {
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int extensionEF;
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        extensionEF = extensionEfForEf(efid);
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (extensionEF < 0) {
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sendErrorResponse(response, "EF is not known ADN-like EF:" + efid);
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ArrayList<AdnRecord>  oldAdnList;
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (efid == EF_PBR) {
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            oldAdnList = mUsimPhoneBookManager.loadEfFilesFromUsim();
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            oldAdnList = getRecordsIfLoaded(efid);
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (oldAdnList == null) {
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sendErrorResponse(response, "Adn list not exist for EF:" + efid);
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int index = -1;
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int count = 1;
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (Iterator<AdnRecord> it = oldAdnList.iterator(); it.hasNext(); ) {
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (oldAdn.isEqual(it.next())) {
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                index = count;
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            count++;
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (index == -1) {
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sendErrorResponse(response, "Adn record don't exist for " + oldAdn);
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (efid == EF_PBR) {
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            AdnRecord foundAdn = oldAdnList.get(index-1);
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            efid = foundAdn.efid;
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            extensionEF = foundAdn.extRecord;
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            index = foundAdn.recordNumber;
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            newAdn.efid = efid;
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            newAdn.extRecord = extensionEF;
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            newAdn.recordNumber = index;
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Message pendingResponse = userWriteResponse.get(efid);
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (pendingResponse != null) {
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sendErrorResponse(response, "Have pending update for EF:" + efid);
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        userWriteResponse.put(efid, response);
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        new AdnRecordLoader(mFh).updateEF(newAdn, efid, extensionEF,
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                index, pin2,
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                obtainMessage(EVENT_UPDATE_ADN_DONE, efid, index, newAdn));
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Responds with exception (in response) if efid is not a known ADN-like
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * record
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    requestLoadAllAdnLike (int efid, int extensionEf, Message response) {
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ArrayList<Message> waiters;
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ArrayList<AdnRecord> result;
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (efid == EF_PBR) {
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            result = mUsimPhoneBookManager.loadEfFilesFromUsim();
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            result = getRecordsIfLoaded(efid);
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Have we already loaded this efid?
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (result != null) {
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (response != null) {
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                AsyncResult.forMessage(response).result = result;
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                response.sendToTarget();
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Have we already *started* loading this efid?
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        waiters = adnLikeWaiters.get(efid);
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (waiters != null) {
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // There's a pending request for this EF already
2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // just add ourselves to it
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            waiters.add(response);
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Start loading efid
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        waiters = new ArrayList<Message>();
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        waiters.add(response);
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        adnLikeWaiters.put(efid, waiters);
2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (extensionEf < 0) {
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // respond with error if not known ADN-like record
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (response != null) {
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                AsyncResult.forMessage(response).exception
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    = new RuntimeException("EF is not known ADN-like EF:" + efid);
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                response.sendToTarget();
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        new AdnRecordLoader(mFh).loadAllFromEF(efid, extensionEf,
3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            obtainMessage(EVENT_LOAD_ALL_ADN_LIKE_DONE, efid, 0));
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Private methods
3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    notifyWaiters(ArrayList<Message> waiters, AsyncResult ar) {
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (waiters == null) {
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0, s = waiters.size() ; i < s ; i++) {
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Message waiter = waiters.get(i);
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            AsyncResult.forMessage(waiter, ar.result, ar.exception);
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            waiter.sendToTarget();
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Overridden from Handler
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    handleMessage(Message msg) {
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar;
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int efid;
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch(msg.what) {
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_LOAD_ALL_ADN_LIKE_DONE:
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                /* arg1 is efid, obj.result is ArrayList<AdnRecord>*/
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult) msg.obj;
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                efid = msg.arg1;
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ArrayList<Message> waiters;
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                waiters = adnLikeWaiters.get(efid);
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                adnLikeWaiters.delete(efid);
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception == null) {
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    adnLikeFiles.put(efid, (ArrayList<AdnRecord>) ar.result);
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                notifyWaiters(waiters, ar);
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_UPDATE_ADN_DONE:
3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                efid = msg.arg1;
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                int index = msg.arg2;
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                AdnRecord adn = (AdnRecord) (ar.userObj);
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception == null) {
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    adnLikeFiles.get(efid).set(index - 1, adn);
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mUsimPhoneBookManager.invalidateCache();
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Message response = userWriteResponse.get(efid);
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                userWriteResponse.delete(efid);
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                AsyncResult.forMessage(response, null, ar.exception);
3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                response.sendToTarget();
3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
365