at_send_expect_to_func("AT+CPIN", pin, NULL, t, at_cpin_unlock_expect);
}
+
+int at_crsm_expect(struct at_response *response, void *data, RIL_Token t)
+{
+ RIL_SIM_IO_Response sim_io_response;
+ struct at_response_data **response_data = NULL;
+ int response_data_count = 0;
+
+ if(response->status == AT_STATUS_UNDEF)
+ return AT_RESPONSE_UNHANDELD_REASON_STATUS;
+
+ if(response->data == NULL || response->data_count <= 0) {
+ LOGE("No data given to AT+CRSM response!");
+ return AT_RESPONSE_HANDLED_ERROR;
+ }
+
+ LOGE("Caught valid +CRSM response!");
+
+ response_data_count = at_response_data_process(&response_data, response->data[0], strlen(response->data[0]));
+ if(response_data_count < 3)
+ goto error_data;
+
+ memset(&sim_io_response, 0, sizeof(RIL_SIM_IO_Response));
+
+ if(response_data[0]->type != AT_RESPONSE_DATA_NUMERIC)
+ goto error_data;
+ sim_io_response.sw1 = response_data[0]->value.n;
+
+ if(response_data[1]->type != AT_RESPONSE_DATA_NUMERIC)
+ goto error_data;
+ sim_io_response.sw2 = response_data[1]->value.n;
+
+ if(response_data[2]->type != AT_RESPONSE_DATA_STRING)
+ goto error_data;
+ sim_io_response.simResponse = response_data[2]->value.s;
+
+ RIL_onRequestComplete(t, RIL_E_SUCCESS, &sim_io_response, sizeof(RIL_SIM_IO_Response));
+
+ at_response_data_free(response_data, response_data_count);
+
+ return AT_RESPONSE_HANDLED_OK;
+
+error_data:
+ LOGE("No valid data fiven to AT+CRSM response!");
+
+ at_response_data_free(response_data, response_data_count);
+ return AT_RESPONSE_HANDLED_ERROR;
+}
+
+void ril_request_sim_io(RIL_Token t, void *data, size_t length)
+{
+ RIL_SIM_IO *sim_io_request = NULL;
+ char *sim_io_data;
+
+ if(data == NULL || length <= 0) {
+ RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0);
+ return;
+ }
+
+ sim_io_request = (RIL_SIM_IO *) data;
+
+ // TODO: add delay if SIM is slow (from device flags)
+
+ if(sim_io_request->data == NULL) {
+ asprintf(&sim_io_data, "%d,%d,%d,%d,%d",
+ sim_io_request->command, sim_io_request->fileid,
+ sim_io_request->p1, sim_io_request->p2, sim_io_request->p3);
+ } else {
+ asprintf(&sim_io_data, "%d,%d,%d,%d,%d,%s",
+ sim_io_request->command, sim_io_request->fileid,
+ sim_io_request->p1, sim_io_request->p2, sim_io_request->p3, sim_io_request->data);
+ }
+
+ at_send_expect_to_func("AT+CRSM", sim_io_data, NULL, t, at_crsm_expect);
+
+ free(sim_io_data);
+}