diff options
Diffstat (limited to 'src/java/com/android/internal/telephony/uicc/IccFileHandler.java')
-rw-r--r-- | src/java/com/android/internal/telephony/uicc/IccFileHandler.java | 91 |
1 files changed, 63 insertions, 28 deletions
diff --git a/src/java/com/android/internal/telephony/uicc/IccFileHandler.java b/src/java/com/android/internal/telephony/uicc/IccFileHandler.java index 881b4c3e6..54e05f7ca 100644 --- a/src/java/com/android/internal/telephony/uicc/IccFileHandler.java +++ b/src/java/com/android/internal/telephony/uicc/IccFileHandler.java @@ -289,7 +289,7 @@ public abstract class IccFileHandler extends Handler implements IccConstants { fileid, 0, onLoaded); mCi.iccIOForApp(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid), - 0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, mAid, response); + 0, 0, 0, null, null, mAid, response); } /** @@ -447,16 +447,29 @@ public abstract class IccFileHandler extends Handler implements IccConstants { data = result.payload; - if (TYPE_EF != data[RESPONSE_DATA_FILE_TYPE] || - EF_TYPE_LINEAR_FIXED != data[RESPONSE_DATA_STRUCTURE]) { - throw new IccFileTypeMismatch(); - } + if (UiccTlvData.isUiccTlvData(data)) { + UiccTlvData tlvData = UiccTlvData.parse(data); - recordSize = new int[3]; - recordSize[0] = data[RESPONSE_DATA_RECORD_LENGTH] & 0xFF; - recordSize[1] = ((data[RESPONSE_DATA_FILE_SIZE_1] & 0xff) << 8) - + (data[RESPONSE_DATA_FILE_SIZE_2] & 0xff); - recordSize[2] = recordSize[1] / recordSize[0]; + if (tlvData.isIncomplete()) { + throw new IccFileTypeMismatch(); + } + + recordSize = new int[3]; + recordSize[0] = tlvData.mRecordSize; + recordSize[1] = tlvData.mFileSize; + recordSize[2] = tlvData.mNumRecords; + } else { + if (TYPE_EF != data[RESPONSE_DATA_FILE_TYPE] || + EF_TYPE_LINEAR_FIXED != data[RESPONSE_DATA_STRUCTURE]) { + throw new IccFileTypeMismatch(); + } + + recordSize = new int[3]; + recordSize[0] = data[RESPONSE_DATA_RECORD_LENGTH] & 0xFF; + recordSize[1] = ((data[RESPONSE_DATA_FILE_SIZE_1] & 0xff) << 8) + + (data[RESPONSE_DATA_FILE_SIZE_2] & 0xff); + recordSize[2] = recordSize[1] / recordSize[0]; + } sendResult(response, recordSize, null); break; @@ -475,20 +488,32 @@ public abstract class IccFileHandler extends Handler implements IccConstants { data = result.payload; path = lc.mPath; - if (TYPE_EF != data[RESPONSE_DATA_FILE_TYPE]) { - throw new IccFileTypeMismatch(); - } + if (UiccTlvData.isUiccTlvData(data)) { + UiccTlvData tlvData = UiccTlvData.parse(data); - if (EF_TYPE_LINEAR_FIXED != data[RESPONSE_DATA_STRUCTURE]) { - throw new IccFileTypeMismatch(); - } + if (tlvData.isIncomplete()) { + throw new IccFileTypeMismatch(); + } + + lc.mRecordSize = tlvData.mRecordSize; + lc.mCountRecords = tlvData.mNumRecords; + size = tlvData.mFileSize; + } else { + if (TYPE_EF != data[RESPONSE_DATA_FILE_TYPE]) { + throw new IccFileTypeMismatch(); + } + + if (EF_TYPE_LINEAR_FIXED != data[RESPONSE_DATA_STRUCTURE]) { + throw new IccFileTypeMismatch(); + } - lc.mRecordSize = data[RESPONSE_DATA_RECORD_LENGTH] & 0xFF; + lc.mRecordSize = data[RESPONSE_DATA_RECORD_LENGTH] & 0xFF; - size = ((data[RESPONSE_DATA_FILE_SIZE_1] & 0xff) << 8) - + (data[RESPONSE_DATA_FILE_SIZE_2] & 0xff); + size = ((data[RESPONSE_DATA_FILE_SIZE_1] & 0xff) << 8) + + (data[RESPONSE_DATA_FILE_SIZE_2] & 0xff); - lc.mCountRecords = size / lc.mRecordSize; + lc.mCountRecords = size / lc.mRecordSize; + } if (lc.mLoadAll) { lc.results = new ArrayList<byte[]>(lc.mCountRecords); @@ -516,16 +541,26 @@ public abstract class IccFileHandler extends Handler implements IccConstants { fileid = msg.arg1; - if (TYPE_EF != data[RESPONSE_DATA_FILE_TYPE]) { - throw new IccFileTypeMismatch(); - } + if (UiccTlvData.isUiccTlvData(data)) { + UiccTlvData tlvData = UiccTlvData.parse(data); - if (EF_TYPE_TRANSPARENT != data[RESPONSE_DATA_STRUCTURE]) { - throw new IccFileTypeMismatch(); - } + if (tlvData.mFileSize < 0) { + throw new IccFileTypeMismatch(); + } - size = ((data[RESPONSE_DATA_FILE_SIZE_1] & 0xff) << 8) - + (data[RESPONSE_DATA_FILE_SIZE_2] & 0xff); + size = tlvData.mFileSize; + } else { + if (TYPE_EF != data[RESPONSE_DATA_FILE_TYPE]) { + throw new IccFileTypeMismatch(); + } + + if (EF_TYPE_TRANSPARENT != data[RESPONSE_DATA_STRUCTURE]) { + throw new IccFileTypeMismatch(); + } + + size = ((data[RESPONSE_DATA_FILE_SIZE_1] & 0xff) << 8) + + (data[RESPONSE_DATA_FILE_SIZE_2] & 0xff); + } mCi.iccIOForApp(COMMAND_READ_BINARY, fileid, getEFPath(fileid), 0, 0, size, null, null, mAid, |