AdnRecordLoaderpublic class AdnRecordLoader extends android.os.Handler
Fields Summary |
---|
static final String | LOG_TAG | static final boolean | VDBG | private IccFileHandler | mFh | int | mEf | int | mExtensionEF | int | mPendingExtLoads | android.os.Message | mUserResponse | String | mPin2 | int | mRecordNumber | ArrayList | mAdns | Object | mResult | static final int | EVENT_ADN_LOAD_DONE | static final int | EVENT_EXT_RECORD_LOAD_DONE | static final int | EVENT_ADN_LOAD_ALL_DONE | static final int | EVENT_EF_LINEAR_RECORD_SIZE_DONE | static final int | EVENT_UPDATE_RECORD_DONE |
Constructors Summary |
---|
AdnRecordLoader(IccFileHandler fh)
//***** Constructor
// The telephony unit-test cases may create AdnRecords
// in secondary threads
super(Looper.getMainLooper());
mFh = fh;
|
Methods Summary |
---|
public void | handleMessage(android.os.Message msg)
AsyncResult ar;
byte data[];
AdnRecord adn;
try {
switch (msg.what) {
case EVENT_EF_LINEAR_RECORD_SIZE_DONE:
ar = (AsyncResult)(msg.obj);
adn = (AdnRecord)(ar.userObj);
if (ar.exception != null) {
throw new RuntimeException("get EF record size failed",
ar.exception);
}
int[] recordSize = (int[])ar.result;
// recordSize is int[3] array
// int[0] is the record length
// int[1] is the total length of the EF file
// int[2] is the number of records in the EF file
// So int[0] * int[2] = int[1]
if (recordSize.length != 3 || mRecordNumber > recordSize[2]) {
throw new RuntimeException("get wrong EF record size format",
ar.exception);
}
data = adn.buildAdnString(recordSize[0]);
if(data == null) {
throw new RuntimeException("wrong ADN format",
ar.exception);
}
mFh.updateEFLinearFixed(mEf, mRecordNumber,
data, mPin2, obtainMessage(EVENT_UPDATE_RECORD_DONE));
mPendingExtLoads = 1;
break;
case EVENT_UPDATE_RECORD_DONE:
ar = (AsyncResult)(msg.obj);
if (ar.exception != null) {
throw new RuntimeException("update EF adn record failed",
ar.exception);
}
mPendingExtLoads = 0;
mResult = null;
break;
case EVENT_ADN_LOAD_DONE:
ar = (AsyncResult)(msg.obj);
data = (byte[])(ar.result);
if (ar.exception != null) {
throw new RuntimeException("load failed", ar.exception);
}
if (VDBG) {
Rlog.d(LOG_TAG,"ADN EF: 0x"
+ Integer.toHexString(mEf)
+ ":" + mRecordNumber
+ "\n" + IccUtils.bytesToHexString(data));
}
adn = new AdnRecord(mEf, mRecordNumber, data);
mResult = adn;
if (adn.hasExtendedRecord()) {
// If we have a valid value in the ext record field,
// we're not done yet: we need to read the corresponding
// ext record and append it
mPendingExtLoads = 1;
mFh.loadEFLinearFixed(
mExtensionEF, adn.mExtRecord,
obtainMessage(EVENT_EXT_RECORD_LOAD_DONE, adn));
}
break;
case EVENT_EXT_RECORD_LOAD_DONE:
ar = (AsyncResult)(msg.obj);
data = (byte[])(ar.result);
adn = (AdnRecord)(ar.userObj);
if (ar.exception != null) {
throw new RuntimeException("load failed", ar.exception);
}
Rlog.d(LOG_TAG,"ADN extension EF: 0x"
+ Integer.toHexString(mExtensionEF)
+ ":" + adn.mExtRecord
+ "\n" + IccUtils.bytesToHexString(data));
adn.appendExtRecord(data);
mPendingExtLoads--;
// result should have been set in
// EVENT_ADN_LOAD_DONE or EVENT_ADN_LOAD_ALL_DONE
break;
case EVENT_ADN_LOAD_ALL_DONE:
ar = (AsyncResult)(msg.obj);
ArrayList<byte[]> datas = (ArrayList<byte[]>)(ar.result);
if (ar.exception != null) {
throw new RuntimeException("load failed", ar.exception);
}
mAdns = new ArrayList<AdnRecord>(datas.size());
mResult = mAdns;
mPendingExtLoads = 0;
for(int i = 0, s = datas.size() ; i < s ; i++) {
adn = new AdnRecord(mEf, 1 + i, datas.get(i));
mAdns.add(adn);
if (adn.hasExtendedRecord()) {
// If we have a valid value in the ext record field,
// we're not done yet: we need to read the corresponding
// ext record and append it
mPendingExtLoads++;
mFh.loadEFLinearFixed(
mExtensionEF, adn.mExtRecord,
obtainMessage(EVENT_EXT_RECORD_LOAD_DONE, adn));
}
}
break;
}
} catch (RuntimeException exc) {
if (mUserResponse != null) {
AsyncResult.forMessage(mUserResponse)
.exception = exc;
mUserResponse.sendToTarget();
// Loading is all or nothing--either every load succeeds
// or we fail the whole thing.
mUserResponse = null;
}
return;
}
if (mUserResponse != null && mPendingExtLoads == 0) {
AsyncResult.forMessage(mUserResponse).result
= mResult;
mUserResponse.sendToTarget();
mUserResponse = null;
}
| public void | loadAllFromEF(int ef, int extensionEF, android.os.Message response)Resulting ArrayList<adnRecord> is placed in response.obj.result
or response.obj.exception is set
mEf = ef;
mExtensionEF = extensionEF;
mUserResponse = response;
mFh.loadEFLinearFixedAll(
ef,
obtainMessage(EVENT_ADN_LOAD_ALL_DONE));
| public void | loadFromEF(int ef, int extensionEF, int recordNumber, android.os.Message response)Resulting AdnRecord is placed in response.obj.result
or response.obj.exception is set
mEf = ef;
mExtensionEF = extensionEF;
mRecordNumber = recordNumber;
mUserResponse = response;
mFh.loadEFLinearFixed(
ef, recordNumber,
obtainMessage(EVENT_ADN_LOAD_DONE));
| public void | updateEF(AdnRecord adn, int ef, int extensionEF, int recordNumber, java.lang.String pin2, android.os.Message response)Write adn to a EF SIM record
It will get the record size of EF record and compose hex adn array
then write the hex array to EF record
mEf = ef;
mExtensionEF = extensionEF;
mRecordNumber = recordNumber;
mUserResponse = response;
mPin2 = pin2;
mFh.getEFLinearRecordSize( ef,
obtainMessage(EVENT_EF_LINEAR_RECORD_SIZE_DONE, adn));
|
|