case AT_CME_ERROR_SIM_PIN2_REQD:
case AT_CME_ERROR_SIM_PUK2_REQD:
case AT_CME_ERROR_SIM_BLOCKED:
+ case AT_CME_ERROR_INCORRECT_PASSWORD:
return RADIO_STATE_SIM_LOCKED_OR_ABSENT;
case AT_CME_ERROR_SIM_FAILURE:
case AT_CME_ERROR_SIM_BUSY:
- case AT_CME_ERROR_SIM_WRONG:
case AT_CME_ERROR_SIM_POWERED_DOWN:
+ case AT_CME_ERROR_SIM_WRONG:
default:
return RADIO_STATE_SIM_NOT_READY;
}
case AT_CME_ERROR_PH_SIM_PIN_REQD:
case AT_CME_ERROR_PH_FSIM_PIN_REQD:
case AT_CME_ERROR_SIM_PIN_REQD:
+ case AT_CME_ERROR_INCORRECT_PASSWORD:
card_status->card_state = RIL_CARDSTATE_PRESENT;
card_status->universal_pin_state = RIL_PINSTATE_ENABLED_NOT_VERIFIED;
app_index = 3;
break;
case AT_CME_ERROR_SIM_FAILURE:
case AT_CME_ERROR_SIM_BUSY:
- case AT_CME_ERROR_SIM_WRONG:
case AT_CME_ERROR_SIM_POWERED_DOWN:
+ case AT_CME_ERROR_SIM_WRONG:
default:
card_status->card_state = RIL_CARDSTATE_PRESENT;
card_status->universal_pin_state = RIL_PINSTATE_UNKNOWN;
RIL_onRequestComplete(t, RIL_E_SUCCESS, &card_status, sizeof(card_status));
} else {
radio_state = at2ril_sim_status(response->status, response->error, response->data, response->data_count);
- if(ril_globals.radio_state != radio_state) {
- ril_globals.radio_state = radio_state;
- RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, NULL, 0);
- }
+ ril_globals.radio_state = radio_state;
+
+ RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, NULL, 0);
}
LOGD("Handled AT+CPIN response");
return AT_RESPONSE_HANDLED_OK;
}
+int at_cpin_unlock_expect(struct at_response *response, void *data, RIL_Token t)
+{
+ int tries = -1;
+ int code = 0;
+
+ if(response->status == AT_STATUS_UNDEF)
+ return AT_RESPONSE_UNHANDELD_REASON_STATUS;
+
+ if(at_status_error(response->status)) {
+ if(response->status == AT_STATUS_CME_ERROR && response->error != NULL) {
+ code = atoi(response->error);
+
+ if(code == AT_CME_ERROR_INCORRECT_PASSWORD)
+ RIL_onRequestComplete(t, RIL_E_PASSWORD_INCORRECT, &tries, sizeof(int *));
+ } else {
+ RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0);
+ }
+ } else {
+ RIL_onRequestComplete(t, RIL_E_SUCCESS, &tries, sizeof(int *));
+ }
+
+ // Update radio state
+ at_send_expect_to_func("AT+CPIN?", NULL, NULL, 0x0000, at_cpin_expect);
+
+ return AT_RESPONSE_HANDLED_OK;
+}
+
void ril_request_get_sim_status(RIL_Token t, void *data, size_t length)
{
at_send_expect_to_func("AT+CPIN?", NULL, NULL, t, at_cpin_expect);
}
+
+void ril_request_enter_sim_pin(RIL_Token t, void *data, size_t length)
+{
+ char *pin = ((char **) data)[0];
+
+ at_send_expect_to_func("AT+CPIN", pin, NULL, t, at_cpin_unlock_expect);
+}