/** * Get the current card status. * * This must be freed using freeCardStatus. * @return: On success returns RIL_E_SUCCESS. */ static int getCardStatus(RIL_CardStatus_v6 **pp_card_status) { RIL_CardState card_state; int num_apps; SIM_Status sim_status = getSIMStatus(); if (sim_status == SIM_ABSENT) { card_state = RIL_CARDSTATE_ABSENT; num_apps = 0; } else { card_state = RIL_CARDSTATE_PRESENT; num_apps = 1; } /* Allocate and initialize base card status. */ RIL_CardStatus_v6 *p_card_status = malloc(sizeof(RIL_CardStatus_v6)); p_card_status->card_state = card_state; p_card_status->universal_pin_state = RIL_PINSTATE_UNKNOWN; p_card_status->gsm_umts_subscription_app_index = -1; p_card_status->cdma_subscription_app_index = -1; p_card_status->num_applications = num_apps; /* Initialize application status. */ int i; for (i = 0; i < RIL_CARD_MAX_APPS; i++) p_card_status->applications[i] = app_status_array[SIM_ABSENT]; /* Pickup the appropriate application status that reflects sim_status for gsm. */ if (num_apps != 0) { UICC_Type uicc_type = getUICCType(); /* Only support one app, gsm/wcdma. */ p_card_status->num_applications = 1; p_card_status->gsm_umts_subscription_app_index = 0; /* Get the correct app status. */ p_card_status->applications[0] = app_status_array[sim_status]; if (uicc_type == UICC_TYPE_SIM) ALOGI("[Card type discovery]: Legacy SIM"); else { /* defaulting to USIM */ ALOGI("[Card type discovery]: USIM"); p_card_status->applications[0].app_type = RIL_APPTYPE_USIM; } } *pp_card_status = p_card_status; return RIL_E_SUCCESS; }
void _requestRegistrationStateWCDMA(void *data, size_t datalen, RIL_Token t) { int wait = 20,ret = -1; int sim_status = getSIMStatus(0); int is_lock = 0; if(sim_status == SIM_PIN || sim_status == SIM_PUK){ is_lock = 1; }else if(sim_status == SIM_ABSENT) wait = 2; while(wait-- && ret == -1){ ret = _requestRegistrationStateWCDMASub(data,RIL_REQUEST_VOICE_REGISTRATION_STATE,datalen,t); if(is_lock) break; LOGD("_requestRegistrationStateWCDMA wait = %d",wait); if(ret ) sleep(1); } }
/** * SIM ready means any commands that access the SIM will work, including: * AT+CPIN, AT+CSMS, AT+CNMI, AT+CRSM * (all SMS-related commands). */ void pollSIMState(void *param) { if (((int) param) != 1 && getRadioState() != RADIO_STATE_SIM_NOT_READY && getRadioState() != RADIO_STATE_SIM_LOCKED_OR_ABSENT) /* No longer valid to poll. */ return; switch (getSIMStatus()) { case SIM_NOT_READY: ALOGI("SIM_NOT_READY, poll for sim state."); enqueueRILEvent(RIL_EVENT_QUEUE_PRIO, pollSIMState, NULL, &TIMEVAL_SIMPOLL); return; case SIM_PIN2: case SIM_PUK2: case SIM_PUK2_PERM_BLOCKED: case SIM_READY: setRadioState(RADIO_STATE_SIM_READY); enqueueRILEvent(RIL_EVENT_QUEUE_PRIO, setPollSIMState, (void *) 1, NULL); return; case SIM_ABSENT: setRadioState(RADIO_STATE_SIM_LOCKED_OR_ABSENT); enqueueRILEvent(RIL_EVENT_QUEUE_PRIO, setPollSIMState, (void *) 0, NULL); return; case SIM_PIN: case SIM_PUK: case SIM_NETWORK_PERSO: case SIM_NETWORK_SUBSET_PERSO: case SIM_SERVICE_PROVIDER_PERSO: case SIM_CORPORATE_PERSO: case SIM_SIM_PERSO: case SIM_STERICSSON_LOCK: case SIM_BLOCKED: case SIM_PERM_BLOCKED: case SIM_NETWORK_PERSO_PUK: case SIM_NETWORK_SUBSET_PERSO_PUK: case SIM_SERVICE_PROVIDER_PERSO_PUK: case SIM_CORPORATE_PERSO_PUK: /* pass through, do not break */ default: setRadioState(RADIO_STATE_SIM_LOCKED_OR_ABSENT); enqueueRILEvent(RIL_EVENT_QUEUE_PRIO, setPollSIMState, (void *) 1, NULL); return; } }