aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/com/android/internal/telephony/uicc/IccFileHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/com/android/internal/telephony/uicc/IccFileHandler.java')
-rw-r--r--src/java/com/android/internal/telephony/uicc/IccFileHandler.java91
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 33dd3819a..82663ee7b 100644
--- a/src/java/com/android/internal/telephony/uicc/IccFileHandler.java
+++ b/src/java/com/android/internal/telephony/uicc/IccFileHandler.java
@@ -291,7 +291,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);
}
/**
@@ -449,16 +449,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;
@@ -478,20 +491,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);
@@ -524,16 +549,26 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
+ IccUtils.bytesToHexString(data));
}
- 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,