134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh/*
234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * Copyright (C) 2009 The Android Open Source Project
334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh *
434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * Licensed under the Apache License, Version 2.0 (the "License");
534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * you may not use this file except in compliance with the License.
634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * You may obtain a copy of the License at
734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh *
834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh *      http://www.apache.org/licenses/LICENSE-2.0
934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh *
1034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * Unless required by applicable law or agreed to in writing, software
1134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * distributed under the License is distributed on an "AS IS" BASIS,
1234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * See the License for the specific language governing permissions and
1434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * limitations under the License.
1534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh */
1634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
1734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshpackage com.android.internal.telephony.gsm;
1834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
1934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport android.os.AsyncResult;
2034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport android.os.Handler;
2134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport android.os.Message;
2234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport android.util.Log;
2334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
2434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport com.android.internal.telephony.AdnRecord;
2534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport com.android.internal.telephony.AdnRecordCache;
2634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport com.android.internal.telephony.IccConstants;
2734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport com.android.internal.telephony.IccUtils;
2834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport com.android.internal.telephony.PhoneBase;
2934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
3034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport org.apache.harmony.luni.lang.reflect.ListOfTypes;
3134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
3234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport java.util.ArrayList;
3334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport java.util.HashMap;
3434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport java.util.Map;
3534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
3634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh/**
3734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * This class implements reading and parsing USIM records.
3834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * Refer to Spec 3GPP TS 31.102 for more details.
3934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh *
4034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * {@hide}
4134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh */
4234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshpublic class UsimPhoneBookManager extends Handler implements IccConstants {
4334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final String LOG_TAG = "GSM";
4434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final boolean DBG = true;
4534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private PbrFile mPbrFile;
4634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private Boolean mIsPbrPresent;
4734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private PhoneBase mPhone;
4834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private AdnRecordCache mAdnCache;
4934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private Object mLock = new Object();
5034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private ArrayList<AdnRecord> mPhoneBookRecords;
5134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private boolean mEmailPresentInIap = false;
5234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private int mEmailTagNumberInIap = 0;
5334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private ArrayList<byte[]> mIapFileRecord;
5434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private ArrayList<byte[]> mEmailFileRecord;
5534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private Map<Integer, ArrayList<String>> mEmailsForAdnRec;
5634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
5734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int EVENT_PBR_LOAD_DONE = 1;
5834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int EVENT_USIM_ADN_LOAD_DONE = 2;
5934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int EVENT_IAP_LOAD_DONE = 3;
6034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int EVENT_EMAIL_LOAD_DONE = 4;
6134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
6234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_TYPE1_TAG   = 0xA8;
6334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_TYPE2_TAG   = 0xA9;
6434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_TYPE3_TAG   = 0xAA;
6534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_EFADN_TAG   = 0xC0;
6634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_EFIAP_TAG   = 0xC1;
6734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_EFEXT1_TAG  = 0xC2;
6834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_EFSNE_TAG   = 0xC3;
6934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_EFANR_TAG   = 0xC4;
7034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_EFPBC_TAG   = 0xC5;
7134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_EFGRP_TAG   = 0xC6;
7234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_EFAAS_TAG   = 0xC7;
7334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_EFGSD_TAG   = 0xC8;
7434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_EFUID_TAG   = 0xC9;
7534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_EFEMAIL_TAG = 0xCA;
7634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final int USIM_EFCCP1_TAG  = 0xCB;
7734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
7834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    public UsimPhoneBookManager(PhoneBase phone, AdnRecordCache cache) {
7934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mPhone = phone;
8034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mPhoneBookRecords = new ArrayList<AdnRecord>();
8134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mPbrFile = null;
8234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        // We assume its present, after the first read this is updated.
8334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        // So we don't have to read from UICC if its not present on subsequent reads.
8434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mIsPbrPresent = true;
8534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mAdnCache = cache;
8634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
8734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
8834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    public void reset() {
8934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mPhoneBookRecords.clear();
9034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mIapFileRecord = null;
9134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mEmailFileRecord = null;
9234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mPbrFile = null;
9334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mIsPbrPresent = true;
9434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
9534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
9634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    public ArrayList<AdnRecord> loadEfFilesFromUsim() {
9734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        synchronized (mLock) {
9834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (!mPhoneBookRecords.isEmpty()) return mPhoneBookRecords;
9934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (!mIsPbrPresent) return null;
10034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
10134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            // Check if the PBR file is present in the cache, if not read it
10234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            // from the USIM.
10334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (mPbrFile == null) {
10434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                readPbrFileAndWait();
10534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
10634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
10734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (mPbrFile == null) return null;
10834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
10934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            int numRecs = mPbrFile.mFileIds.size();
11034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            for (int i = 0; i < numRecs; i++) {
11134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                readAdnFileAndWait(i);
11234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                readEmailFileAndWait(i);
11334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
11434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            // All EF files are loaded, post the response.
11534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
11634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        return mPhoneBookRecords;
11734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
11834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
11934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private void readPbrFileAndWait() {
12034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mPhone.getIccFileHandler().loadEFLinearFixedAll(EF_PBR, obtainMessage(EVENT_PBR_LOAD_DONE));
12134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        try {
12234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            mLock.wait();
12334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        } catch (InterruptedException e) {
12434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            Log.e(LOG_TAG, "Interrupted Exception in readAdnFileAndWait");
12534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
12634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
12734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
12834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private void readEmailFileAndWait(int recNum) {
12934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        Map <Integer,Integer> fileIds;
13034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        fileIds = mPbrFile.mFileIds.get(recNum);
13134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        if (fileIds == null) return;
13234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
13334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        if (fileIds.containsKey(USIM_EFEMAIL_TAG)) {
13434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            int efid = fileIds.get(USIM_EFEMAIL_TAG);
13534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            // Check if the EFEmail is a Type 1 file or a type 2 file.
13634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            // If mEmailPresentInIap is true, its a type 2 file.
13734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            // So we read the IAP file and then read the email records.
13834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            // instead of reading directly.
13934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (mEmailPresentInIap) {
14034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                readIapFileAndWait(fileIds.get(USIM_EFIAP_TAG));
14134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                if (mIapFileRecord == null) {
14234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    Log.e(LOG_TAG, "Error: IAP file is empty");
14334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    return;
14434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                }
14534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
14634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            // Read the EFEmail file.
14734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            mPhone.getIccFileHandler().loadEFLinearFixedAll(fileIds.get(USIM_EFEMAIL_TAG),
14834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    obtainMessage(EVENT_EMAIL_LOAD_DONE));
14934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            try {
15034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                mLock.wait();
15134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            } catch (InterruptedException e) {
15234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                Log.e(LOG_TAG, "Interrupted Exception in readEmailFileAndWait");
15334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
15434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
15534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (mEmailFileRecord == null) {
15634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                Log.e(LOG_TAG, "Error: Email file is empty");
15734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                return;
15834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
15934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            updatePhoneAdnRecord();
16034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
16134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
16234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
16334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
16434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private void readIapFileAndWait(int efid) {
16534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mPhone.getIccFileHandler().loadEFLinearFixedAll(efid, obtainMessage(EVENT_IAP_LOAD_DONE));
16634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        try {
16734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            mLock.wait();
16834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        } catch (InterruptedException e) {
16934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            Log.e(LOG_TAG, "Interrupted Exception in readIapFileAndWait");
17034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
17134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
17234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
17334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private void updatePhoneAdnRecord() {
17434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        if (mEmailFileRecord == null) return;
17534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        int numAdnRecs = mPhoneBookRecords.size();
17634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        if (mIapFileRecord != null) {
17734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            // The number of records in the IAP file is same as the number of records in ADN file.
17834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            // The order of the pointers in an EFIAP shall be the same as the order of file IDs
17934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            // that appear in the TLV object indicated by Tag 'A9' in the reference file record.
18034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            // i.e value of mEmailTagNumberInIap
18134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
18234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            for (int i = 0; i < numAdnRecs; i++) {
18334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                byte[] record = null;
18434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                try {
18534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    record = mIapFileRecord.get(i);
18634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                } catch (IndexOutOfBoundsException e) {
18734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    Log.e(LOG_TAG, "Error: Improper ICC card: No IAP record for ADN, continuing");
18834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    break;
18934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                }
19034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                int recNum = record[mEmailTagNumberInIap];
19134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
19234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                if (recNum != -1) {
19334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    String[] emails = new String[1];
19434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    // SIM record numbers are 1 based
19534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    emails[0] = readEmailRecord(recNum - 1);
19634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    AdnRecord rec = mPhoneBookRecords.get(i);
19734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    if (rec != null) {
19834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                        rec.setEmails(emails);
19934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    } else {
20034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                        // might be a record with only email
20134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                        rec = new AdnRecord("", "", emails);
20234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    }
20334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    mPhoneBookRecords.set(i, rec);
20434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                }
20534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
20634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
20734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
20834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        // ICC cards can be made such that they have an IAP file but all
20934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        // records are empty. So we read both type 1 and type 2 file
21034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        // email records, just to be sure.
21134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
21234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        int len = mPhoneBookRecords.size();
21334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        // Type 1 file, the number of records is the same as the number of
21434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        // records in the ADN file.
21534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        if (mEmailsForAdnRec == null) {
21634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            parseType1EmailFile(len);
21734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
21834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        for (int i = 0; i < numAdnRecs; i++) {
21934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            ArrayList<String> emailList = null;
22034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            try {
22134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                emailList = mEmailsForAdnRec.get(i);
22234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            } catch (IndexOutOfBoundsException e) {
22334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                break;
22434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
22534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (emailList == null) continue;
22634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
22734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            AdnRecord rec = mPhoneBookRecords.get(i);
22834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
22934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            String[] emails = new String[emailList.size()];
23034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            System.arraycopy(emailList.toArray(), 0, emails, 0, emailList.size());
23134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            rec.setEmails(emails);
23234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            mPhoneBookRecords.set(i, rec);
23334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
23434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
23534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
23634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    void parseType1EmailFile(int numRecs) {
23734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mEmailsForAdnRec = new HashMap<Integer, ArrayList<String>>();
23834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        byte[] emailRec = null;
23934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        for (int i = 0; i < numRecs; i++) {
24034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            try {
24134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                emailRec = mEmailFileRecord.get(i);
24234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            } catch (IndexOutOfBoundsException e) {
24334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                Log.e(LOG_TAG, "Error: Improper ICC card: No email record for ADN, continuing");
24434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                break;
24534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
24634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            int adnRecNum = emailRec[emailRec.length - 1];
24734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
24834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (adnRecNum == -1) {
24934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                continue;
25034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
25134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
25234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            String email = readEmailRecord(i);
25334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
25434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (email == null || email.equals("")) {
25534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                continue;
25634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
25734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
25834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            // SIM record numbers are 1 based.
25934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            ArrayList<String> val = mEmailsForAdnRec.get(adnRecNum - 1);
26034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (val == null) {
26134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                val = new ArrayList<String>();
26234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
26334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            val.add(email);
26434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            // SIM record numbers are 1 based.
26534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            mEmailsForAdnRec.put(adnRecNum - 1, val);
26634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
26734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
26834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
26934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private String readEmailRecord(int recNum) {
27034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        byte[] emailRec = null;
27134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        try {
27234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            emailRec = mEmailFileRecord.get(recNum);
27334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        } catch (IndexOutOfBoundsException e) {
27434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            return null;
27534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
27634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
27734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        // The length of the record is X+2 byte, where X bytes is the email address
27834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        String email = IccUtils.adnStringFieldToString(emailRec, 0, emailRec.length - 2);
27934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        return email;
28034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
28134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
28234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private void readAdnFileAndWait(int recNum) {
28334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        Map <Integer,Integer> fileIds;
28434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        fileIds = mPbrFile.mFileIds.get(recNum);
285036e21083d9936425687d7de29e95b2c458a7e4ajsh        if (fileIds == null || fileIds.isEmpty()) return;
28634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
287c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang
288c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang        int extEf = 0;
289c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang        // Only call fileIds.get while EFEXT1_TAG is available
290c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang        if (fileIds.containsKey(USIM_EFEXT1_TAG)) {
291c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang            extEf = fileIds.get(USIM_EFEXT1_TAG);
292c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang        }
293c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang
29434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mAdnCache.requestLoadAllAdnLike(fileIds.get(USIM_EFADN_TAG),
295c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang            extEf, obtainMessage(EVENT_USIM_ADN_LOAD_DONE));
29634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        try {
29734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            mLock.wait();
29834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        } catch (InterruptedException e) {
29934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            Log.e(LOG_TAG, "Interrupted Exception in readAdnFileAndWait");
30034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
30134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
30234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
30334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private void createPbrFile(ArrayList<byte[]> records) {
30434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        if (records == null) {
30534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            mPbrFile = null;
30634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            mIsPbrPresent = false;
30734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            return;
30834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
30934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        mPbrFile = new PbrFile(records);
31034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
31134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
31234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    @Override
31334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    public void handleMessage(Message msg) {
31434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        AsyncResult ar;
31534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
31634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        switch(msg.what) {
31734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        case EVENT_PBR_LOAD_DONE:
31834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            ar = (AsyncResult) msg.obj;
31934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (ar.exception == null) {
32034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                createPbrFile((ArrayList<byte[]>)ar.result);
32134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
32234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            synchronized (mLock) {
32334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                mLock.notify();
32434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
32534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            break;
32634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        case EVENT_USIM_ADN_LOAD_DONE:
32734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            log("Loading USIM ADN records done");
32834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            ar = (AsyncResult) msg.obj;
32934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (ar.exception == null) {
33034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                mPhoneBookRecords.addAll((ArrayList<AdnRecord>)ar.result);
33134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
33234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            synchronized (mLock) {
33334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                mLock.notify();
33434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
33534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            break;
33634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        case EVENT_IAP_LOAD_DONE:
33734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            log("Loading USIM IAP records done");
33834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            ar = (AsyncResult) msg.obj;
33934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (ar.exception == null) {
34034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                mIapFileRecord = ((ArrayList<byte[]>)ar.result);
34134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
34234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            synchronized (mLock) {
34334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                mLock.notify();
34434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
34534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            break;
34634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        case EVENT_EMAIL_LOAD_DONE:
34734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            log("Loading USIM Email records done");
34834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            ar = (AsyncResult) msg.obj;
34934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (ar.exception == null) {
35034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                mEmailFileRecord = ((ArrayList<byte[]>)ar.result);
35134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
35234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
35334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            synchronized (mLock) {
35434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                mLock.notify();
35534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
35634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            break;
35734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
35834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
35934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
36034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private class PbrFile {
36134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        // RecNum <EF Tag, efid>
36234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        HashMap<Integer,Map<Integer,Integer>> mFileIds;
36334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
36434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        PbrFile(ArrayList<byte[]> records) {
36534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            mFileIds = new HashMap<Integer, Map<Integer, Integer>>();
36634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            SimTlv recTlv;
36734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            int recNum = 0;
36834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            for (byte[] record: records) {
36934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                recTlv = new SimTlv(record, 0, record.length);
37034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                parseTag(recTlv, recNum);
37134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                recNum ++;
37234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
37334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
37434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
37534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        void parseTag(SimTlv tlv, int recNum) {
37634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            SimTlv tlvEf;
37734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            int tag;
37834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            byte[] data;
37934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            Map<Integer, Integer> val = new HashMap<Integer, Integer>();
38034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            do {
38134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                tag = tlv.getTag();
38234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                switch(tag) {
38334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                case USIM_TYPE1_TAG: // A8
38434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                case USIM_TYPE3_TAG: // AA
38534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                case USIM_TYPE2_TAG: // A9
38634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    data = tlv.getData();
38734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    tlvEf = new SimTlv(data, 0, data.length);
38834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    parseEf(tlvEf, val, tag);
38934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    break;
39034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                }
39134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            } while (tlv.nextObject());
39234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            mFileIds.put(recNum, val);
39334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
39434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
39534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        void parseEf(SimTlv tlv, Map<Integer, Integer> val, int parentTag) {
39634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            int tag;
39734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            byte[] data;
39834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            int tagNumberWithinParentTag = 0;
39934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            do {
40034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                tag = tlv.getTag();
40134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                if (parentTag == USIM_TYPE2_TAG && tag == USIM_EFEMAIL_TAG) {
40234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    mEmailPresentInIap = true;
40334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    mEmailTagNumberInIap = tagNumberWithinParentTag;
40434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                }
40534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                switch(tag) {
40634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    case USIM_EFEMAIL_TAG:
40734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    case USIM_EFADN_TAG:
40834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    case USIM_EFEXT1_TAG:
40934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    case USIM_EFANR_TAG:
41034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    case USIM_EFPBC_TAG:
41134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    case USIM_EFGRP_TAG:
41234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    case USIM_EFAAS_TAG:
41334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    case USIM_EFGSD_TAG:
41434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    case USIM_EFUID_TAG:
41534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    case USIM_EFCCP1_TAG:
41634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    case USIM_EFIAP_TAG:
41734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    case USIM_EFSNE_TAG:
41834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                        data = tlv.getData();
419a409128a7238b7b7a2b38f8b3732ca8905b89c71Kenny Root                        int efid = ((data[0] & 0xFF) << 8) | (data[1] & 0xFF);
42034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                        val.put(tag, efid);
42134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                        break;
42234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                }
42334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                tagNumberWithinParentTag ++;
42434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            } while(tlv.nextObject());
42534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
42634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
42734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
42834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private void log(String msg) {
42934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        if(DBG) Log.d(LOG_TAG, msg);
43034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
43134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh}
432