RIL changes for supporting generic SIM communication.
Exposes four new commands through RIL.java:
- RIL_REQUEST_SIM_TRANSMIT_BASIC (AT+CSIM - TS 27.007)
- RIL_REQUEST_SIM_OPEN_CHANNEL (AT+CCHO - TS 27.007)
- RIL_REQUEST_SIM_CLOSE_CHANNEL (AT+CCHC - TS 27.007)
- RIL_REQUEST_SIM_TRANSMIT_CHANNEL (AT+CGLA - TS 27.007)
Change-Id: Iee4d950d37a6097493cd945e611c914c40827215
diff --git a/src/java/com/android/internal/telephony/CommandException.java b/src/java/com/android/internal/telephony/CommandException.java
index 550e91c..80338ae 100644
--- a/src/java/com/android/internal/telephony/CommandException.java
+++ b/src/java/com/android/internal/telephony/CommandException.java
@@ -42,6 +42,8 @@
MODE_NOT_SUPPORTED,
FDN_CHECK_FAILURE,
ILLEGAL_SIM_OR_ME,
+ MISSING_RESOURCE,
+ NO_SUCH_ELEMENT,
}
public CommandException(Error e) {
@@ -83,6 +85,10 @@
return new CommandException(Error.FDN_CHECK_FAILURE);
case RILConstants.ILLEGAL_SIM_OR_ME:
return new CommandException(Error.ILLEGAL_SIM_OR_ME);
+ case RILConstants.MISSING_RESOURCE:
+ return new CommandException(Error.MISSING_RESOURCE);
+ case RILConstants.NO_SUCH_ELEMENT:
+ return new CommandException(Error.NO_SUCH_ELEMENT);
default:
Rlog.e("GSM", "Unrecognized RIL errno " + ril_errno);
return new CommandException(Error.INVALID_RESPONSE);
diff --git a/src/java/com/android/internal/telephony/CommandsInterface.java b/src/java/com/android/internal/telephony/CommandsInterface.java
index 670d976..252bc77 100644
--- a/src/java/com/android/internal/telephony/CommandsInterface.java
+++ b/src/java/com/android/internal/telephony/CommandsInterface.java
@@ -1677,6 +1677,65 @@
*/
public void testingEmergencyCall();
+ /**
+ * Open a logical channel to the SIM.
+ *
+ * Input parameters equivalent to TS 27.007 AT+CCHO command.
+ *
+ * @param AID Application id. See ETSI 102.221 and 101.220.
+ * @param response Callback message. response.obj will be an int [1] with
+ * element [0] set to the id of the logical channel. If set to 0,
+ * the channel is invalid.
+ */
+ public void iccOpenLogicalChannel(String AID, Message response);
+
+ /**
+ * Close a previously opened logical channel to the SIM.
+ *
+ * Input parameters equivalent to TS 27.007 AT+CCHC command.
+ *
+ * @param channel Channel id. Id of the channel to be closed.
+ * @param response Callback message.
+ */
+ public void iccCloseLogicalChannel(int channel, Message response);
+
+ /**
+ * Exchange APDUs with the SIM on a logical channel.
+ *
+ * Input parameters equivalent to TS 27.007 AT+CGLA command.
+ *
+ * @param channel Channel id of the channel to use for communication. Has to
+ * be greater than zero.
+ * @param cla Class of the APDU command.
+ * @param instruction Instruction of the APDU command.
+ * @param p1 P1 value of the APDU command.
+ * @param p2 P2 value of the APDU command.
+ * @param p3 P3 value of the APDU command. If p3 is negative a 4 byte APDU
+ * is sent to the SIM.
+ * @param data Data to be sent with the APDU.
+ * @param response Callback message. response.obj.userObj will be
+ * an IccIoResult on success.
+ */
+ public void iccTransmitApduLogicalChannel(int channel, int cla, int instruction,
+ int p1, int p2, int p3, String data, Message response);
+
+ /**
+ * Exchange APDUs with the SIM on a basic channel.
+ *
+ * Input parameters equivalent to TS 27.007 AT+CSIM command.
+ *
+ * @param cla Class of the APDU command.
+ * @param instruction Instruction of the APDU command.
+ * @param p1 P1 value of the APDU command.
+ * @param p2 P2 value of the APDU command.
+ * @param p3 P3 value of the APDU command. If p3 is negative a 4 byte APDU
+ * is sent to the SIM.
+ * @param data Data to be sent with the APDU.
+ * @param response Callback message. response.obj.userObj will be
+ * an IccIoResult on success.
+ */
+ public void iccTransmitApduBasicChannel(int cla, int instruction, int p1, int p2,
+ int p3, String data, Message response);
/**
* @return version of the ril.
diff --git a/src/java/com/android/internal/telephony/RIL.java b/src/java/com/android/internal/telephony/RIL.java
index a9b2c29..9b9408b 100644
--- a/src/java/com/android/internal/telephony/RIL.java
+++ b/src/java/com/android/internal/telephony/RIL.java
@@ -2436,6 +2436,10 @@
case RIL_REQUEST_SET_INITIAL_ATTACH_APN: ret = responseVoid(p); break;
case RIL_REQUEST_IMS_REGISTRATION_STATE: ret = responseInts(p); break;
case RIL_REQUEST_IMS_SEND_SMS: ret = responseSMS(p); break;
+ case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: ret = responseICC_IO(p); break;
+ case RIL_REQUEST_SIM_OPEN_CHANNEL: ret = responseInts(p); break;
+ case RIL_REQUEST_SIM_CLOSE_CHANNEL: ret = responseVoid(p); break;
+ case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: ret = responseICC_IO(p); break;
default:
throw new RuntimeException("Unrecognized solicited response: " + rr.mRequest);
//break;
@@ -3741,6 +3745,10 @@
case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "RIL_REQUEST_SET_INITIAL_ATTACH_APN";
case RIL_REQUEST_IMS_REGISTRATION_STATE: return "RIL_REQUEST_IMS_REGISTRATION_STATE";
case RIL_REQUEST_IMS_SEND_SMS: return "RIL_REQUEST_IMS_SEND_SMS";
+ case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: return "RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC";
+ case RIL_REQUEST_SIM_OPEN_CHANNEL: return "RIL_REQUEST_SIM_OPEN_CHANNEL";
+ case RIL_REQUEST_SIM_CLOSE_CHANNEL: return "RIL_REQUEST_SIM_CLOSE_CHANNEL";
+ case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: return "RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL";
default: return "<unknown request>";
}
}
@@ -4111,4 +4119,81 @@
pw.println(" mLastNITZTimeInfo=" + mLastNITZTimeInfo);
pw.println(" mTestingEmergencyCall=" + mTestingEmergencyCall.get());
}
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void iccOpenLogicalChannel(String AID, Message response) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SIM_OPEN_CHANNEL, response);
+ rr.mParcel.writeString(AID);
+
+ if (RILJ_LOGD)
+ riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ send(rr);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void iccCloseLogicalChannel(int channel, Message response) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SIM_CLOSE_CHANNEL, response);
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(channel);
+
+ if (RILJ_LOGD)
+ riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ send(rr);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void iccTransmitApduLogicalChannel(int channel, int cla, int instruction,
+ int p1, int p2, int p3, String data, Message response) {
+ if (channel <= 0) {
+ throw new RuntimeException(
+ "Invalid channel in iccTransmitApduLogicalChannel: " + channel);
+ }
+
+ iccTransmitApduHelper(channel, cla, instruction, p1, p2, p3, data, response);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void iccTransmitApduBasicChannel(int cla, int instruction, int p1, int p2,
+ int p3, String data, Message response) {
+ iccTransmitApduHelper(0, cla, instruction, p1, p2, p3, data, response);
+ }
+
+ /*
+ * Helper function for the iccTransmitApdu* commands above.
+ */
+ private void iccTransmitApduHelper(int channel, int cla, int instruction,
+ int p1, int p2, int p3, String data, Message response) {
+ RILRequest rr;
+ if (channel == 0)
+ rr = RILRequest.obtain(RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, response);
+ else
+ rr = RILRequest.obtain(RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, response);
+
+ rr.mParcel.writeInt(channel);
+ rr.mParcel.writeInt(cla);
+ rr.mParcel.writeInt(instruction);
+ rr.mParcel.writeInt(p1);
+ rr.mParcel.writeInt(p2);
+ rr.mParcel.writeInt(p3);
+ rr.mParcel.writeString(data);
+
+ if (RILJ_LOGD)
+ riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ send(rr);
+ }
}
diff --git a/src/java/com/android/internal/telephony/sip/SipCommandInterface.java b/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
index ae1b110..3fc4e85 100644
--- a/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
+++ b/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
@@ -556,4 +556,22 @@
public void setInitialAttachApn(String apn, String protocol, int authType, String username,
String password, Message result) {
}
+
+ @Override
+ public void iccOpenLogicalChannel(String AID, Message response) {
+ }
+
+ @Override
+ public void iccCloseLogicalChannel(int channel, Message response) {
+ }
+
+ @Override
+ public void iccTransmitApduLogicalChannel(int channel, int cla, int instruction,
+ int p1, int p2, int p3, String data, Message response) {
+ }
+
+ @Override
+ public void iccTransmitApduBasicChannel(int cla, int instruction, int p1, int p2,
+ int p3, String data, Message response) {
+ }
}
diff --git a/src/java/com/android/internal/telephony/test/SimulatedCommands.java b/src/java/com/android/internal/telephony/test/SimulatedCommands.java
index c7164b7..28e4d64 100644
--- a/src/java/com/android/internal/telephony/test/SimulatedCommands.java
+++ b/src/java/com/android/internal/telephony/test/SimulatedCommands.java
@@ -1678,4 +1678,26 @@
int retry, int messageRef, Message response){
unimplemented(response);
}
+
+ @Override
+ public void iccOpenLogicalChannel(String AID, Message response) {
+ unimplemented(response);
+ }
+
+ @Override
+ public void iccCloseLogicalChannel(int channel, Message response) {
+ unimplemented(response);
+ }
+
+ @Override
+ public void iccTransmitApduLogicalChannel(int channel, int cla, int instruction,
+ int p1, int p2, int p3, String data, Message response) {
+ unimplemented(response);
+ }
+
+ @Override
+ public void iccTransmitApduBasicChannel(int cla, int instruction, int p1, int p2,
+ int p3, String data, Message response) {
+ unimplemented(response);
+ }
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/gsm/UsimDataDownloadCommands.java b/tests/telephonytests/src/com/android/internal/telephony/gsm/UsimDataDownloadCommands.java
index d9dfe72..72d2d62 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/gsm/UsimDataDownloadCommands.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/gsm/UsimDataDownloadCommands.java
@@ -645,4 +645,22 @@
public void iccIOForApp(int command, int fileid, String path, int p1, int p2, int p3,
String data, String pin2, String aid, Message response) {
}
+
+ @Override
+ public void iccOpenLogicalChannel(String AID, Message response) {
+ }
+
+ @Override
+ public void iccCloseLogicalChannel(int channel, Message response) {
+ }
+
+ @Override
+ public void iccTransmitApduLogicalChannel(int channel, int cla, int instruction,
+ int p1, int p2, int p3, String data, Message response) {
+ }
+
+ @Override
+ public void iccTransmitApduBasicChannel(int cla, int instruction, int p1, int p2,
+ int p3, String data, Message response) {
+ }
}