static void get_uim_state(struct qmi_result *result, void *user_data) { struct ofono_sim *sim = user_data; uint8_t state; DBG(""); if (qmi_result_set_error(result, NULL)) goto done; if (qmi_result_get_uint8(result, QMI_DMS_RESULT_UIM_STATE, &state)) process_uim_state(sim, state); done: ofono_sim_register(sim); }
static gboolean ril_sim_register(gpointer user) { struct ofono_sim *sim = user; DBG(""); ofono_sim_register(sim); /* * We use g_idle_add here to make sure that the presence of the SIM * interface is signalled before signalling anything else from the said * interface, as ofono_sim_register also uses g_idle_add. */ g_idle_add(listen_and_get_sim_status, sim); return FALSE; }
static void set_event_cb(struct qmi_result *result, void *user_data) { struct ofono_sim *sim = user_data; struct sim_data *data = ofono_sim_get_data(sim); DBG(""); if (qmi_result_set_error(result, NULL)) goto done; if (qmi_service_send(data->dms, QMI_DMS_GET_UIM_STATE, NULL, get_uim_state, sim, NULL) > 0) return; done: ofono_sim_register(sim); }
static gboolean ril_sim_register(gpointer user) { struct ofono_sim *sim = user; struct sim_data *sd = ofono_sim_get_data(sim); DBG(""); ofono_sim_register(sim); if (sd->ril_state_watch != NULL && !ofono_sim_add_state_watch(sim, sd->ril_state_watch, sd->modem, NULL)) ofono_error("Error registering ril sim watch"); /* * We use g_idle_add here to make sure that the presence of the SIM * interface is signalled before signalling anything else from the said * interface, as ofono_sim_register also uses g_idle_add. */ g_idle_add(listen_and_get_sim_status, sim); return FALSE; }
static void create_dms_cb(struct qmi_service *service, void *user_data) { struct ofono_sim *sim = user_data; struct sim_data *data = ofono_sim_get_data(sim); struct qmi_param *param; DBG(""); if (!service) { ofono_error("Failed to request DMS service"); ofono_sim_remove(sim); return; } data->dms = qmi_service_ref(service); qmi_service_register(data->dms, QMI_DMS_EVENT, event_notify, sim, NULL); param = qmi_param_new(); if (!param) goto done; qmi_param_append_uint8(param, QMI_DMS_PARAM_REPORT_PIN_STATUS, 0x01); qmi_param_append_uint8(param, QMI_DMS_PARAM_REPORT_OPER_MODE, 0x01); qmi_param_append_uint8(param, QMI_DMS_PARAM_REPORT_UIM_STATE, 0x01); if (qmi_service_send(data->dms, QMI_DMS_SET_EVENT, param, set_event_cb, sim, NULL) > 0) return; qmi_param_free(param); done: ofono_sim_register(sim); }
static void sim_status_cb(struct ril_msg *message, gpointer user_data) { struct ofono_sim *sim = user_data; struct sim_data *sd = ofono_sim_get_data(sim); struct sim_app *apps[MAX_UICC_APPS]; struct sim_status status; guint i = 0; guint search_index = -1; struct parcel rilp; DBG(""); if (ril_util_parse_sim_status(sd->ril, message, &status, apps) && status.num_apps) { DBG("num_apps: %d gsm_umts_index: %d", status.num_apps, status.gsm_umts_index); /* TODO(CDMA): need some kind of logic to * set the correct app_index, */ search_index = status.gsm_umts_index; for (i = 0; i < status.num_apps; i++) { if (i == search_index && apps[i]->app_type != RIL_APPTYPE_UNKNOWN) { current_active_app = apps[i]->app_type; configure_active_app(sd, apps[i], i); set_pin_lock_state(sim, apps[i]); break; } } if (sd->sim_registered == FALSE) { ofono_sim_register(sim); sd->sim_registered = TRUE; } else { /* TODO: There doesn't seem to be any other * way to force the core SIM code to * recheck the PIN. * Wouldn't __ofono_sim_refresh be * more appropriate call here?? * __ofono_sim_refresh(sim, NULL, TRUE, TRUE); */ DBG("sd->card_state:%u", sd->card_state); if (sd->card_state != RIL_CARDSTATE_PRESENT) { ofono_sim_inserted_notify(sim, TRUE); sd->card_state = RIL_CARDSTATE_PRESENT; sd->removed = FALSE; } } if (current_passwd) { if (!strcmp(current_passwd, defaultpasswd)) { __ofono_sim_recheck_pin(sim); } else if (sd->passwd_state != OFONO_SIM_PASSWORD_SIM_PIN) { __ofono_sim_recheck_pin(sim); } else if (sd->passwd_state == OFONO_SIM_PASSWORD_SIM_PIN) { parcel_init(&rilp); parcel_w_int32(&rilp, ENTER_SIM_PIN_PARAMS); parcel_w_string(&rilp, current_passwd); parcel_w_string(&rilp, sd->aid_str); g_ril_send(sd->ril, RIL_REQUEST_ENTER_SIM_PIN, rilp.data, rilp.size, NULL, NULL, g_free); parcel_free(&rilp); } } else { __ofono_sim_recheck_pin(sim); } if (current_online_state == RIL_ONLINE_PREF) { parcel_init(&rilp); parcel_w_int32(&rilp, 1); parcel_w_int32(&rilp, 1); ofono_info("RIL_REQUEST_RADIO_POWER ON"); g_ril_send(sd->ril, RIL_REQUEST_RADIO_POWER, rilp.data, rilp.size, NULL, NULL, g_free); parcel_free(&rilp); current_online_state = RIL_ONLINE; } ril_util_free_sim_apps(apps, status.num_apps); } else { if (current_online_state == RIL_ONLINE) current_online_state = RIL_ONLINE_PREF; if (status.card_state == RIL_CARDSTATE_ABSENT) { DBG("sd->card_state:%u,status.card_state:%u,", sd->card_state, status.card_state); ofono_info("RIL_CARDSTATE_ABSENT"); ofono_sim_inserted_notify(sim, FALSE); if (sd->card_state == RIL_CARDSTATE_PRESENT) sd->removed = TRUE; sd->card_state = RIL_CARDSTATE_ABSENT; if (current_passwd) g_stpcpy(current_passwd, defaultpasswd); sd->initialized = FALSE; } } /* TODO: if no SIM present, handle emergency calling. */ }