static void get_iccid_cb(struct qmi_result *result, void *user_data) { struct cb_data *cbd = user_data; ofono_sim_read_cb_t cb = cbd->cb; unsigned char iccid[10]; int iccid_len, len; char *str; DBG(""); if (qmi_result_set_error(result, NULL)) { CALLBACK_WITH_FAILURE(cb, NULL, 0, cbd->data); return; } str = qmi_result_get_string(result, QMI_DMS_RESULT_ICCID); if (!str) { CALLBACK_WITH_FAILURE(cb, NULL, 0, cbd->data); return; } len = strlen(str); if (len > 20) { CALLBACK_WITH_FAILURE(cb, NULL, 0, cbd->data); return; } sim_encode_bcd_number(str, iccid); iccid_len = len / 2; qmi_free(str); CALLBACK_WITH_SUCCESS(cb, iccid, iccid_len, cbd->data); }
static void get_rssi_cb(struct qmi_result *result, void *user_data) { struct cb_data *cbd = user_data; ofono_netreg_strength_cb_t cb = cbd->cb; const struct qmi_nas_signal_strength *ss; uint16_t len; int strength; DBG(""); if (qmi_result_set_error(result, NULL)) { CALLBACK_WITH_FAILURE(cb, -1, cbd->data); return; } ss = qmi_result_get(result, QMI_NAS_RESULT_SIGNAL_STRENGTH, &len); if (!ss) { CALLBACK_WITH_FAILURE(cb, -1, cbd->data); return; } DBG("signal with %d dBm on %d", ss->dbm, ss->rat); strength = dbm_to_strength(ss->dbm); CALLBACK_WITH_SUCCESS(cb, strength, cbd->data); }
static void get_pin_status_cb(struct qmi_result *result, void *user_data) { struct cb_data *cbd = user_data; ofono_sim_passwd_cb_t cb = cbd->cb; struct sim_data *data = cbd->user; const struct qmi_dms_pin_status *pin; uint16_t len; int pin_type; DBG(""); if (qmi_result_set_error(result, NULL)) { CALLBACK_WITH_FAILURE(cb, -1, cbd->data); return; } pin = qmi_result_get(result, QMI_DMS_RESULT_PIN1_STATUS, &len); if (!pin) { CALLBACK_WITH_FAILURE(cb, -1, cbd->data); return; } DBG("PIN 1 status %d", pin->status); switch (pin->status) { case QMI_DMS_PIN_ENABLED_UNVERIFIED: pin_type = OFONO_SIM_PASSWORD_SIM_PIN; break; case QMI_DMS_PIN_ENABLED_VERIFIED: case QMI_DMS_PIN_DISABLED: pin_type = OFONO_SIM_PASSWORD_NONE; break; default: pin_type = OFONO_SIM_PASSWORD_INVALID; break; } data->retries[OFONO_SIM_PASSWORD_SIM_PIN] = pin->verify_retries; data->retries[OFONO_SIM_PASSWORD_SIM_PUK] = pin->unblock_retries; pin = qmi_result_get(result, QMI_DMS_RESULT_PIN2_STATUS, &len); if (!pin) goto done; DBG("PIN 2 status %d", pin->status); data->retries[OFONO_SIM_PASSWORD_SIM_PIN2] = pin->verify_retries; data->retries[OFONO_SIM_PASSWORD_SIM_PUK2] = pin->unblock_retries; done: CALLBACK_WITH_SUCCESS(cb, pin_type, cbd->data); }
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 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 void register_net_cb(struct qmi_result *result, void *user_data) { struct cb_data *cbd = user_data; ofono_netreg_register_cb_t cb = cbd->cb; uint16_t error; DBG(""); if (qmi_result_set_error(result, &error)) { if (error == 26) { /* no effect */ goto done; } CALLBACK_WITH_FAILURE(cb, cbd->data); return; } done: CALLBACK_WITH_SUCCESS(cb, cbd->data); }
static void get_ss_info_cb(struct qmi_result *result, void *user_data) { struct cb_data *cbd = user_data; ofono_netreg_status_cb_t cb = cbd->cb; struct netreg_data *data = cbd->user; int status, lac, cellid, tech; DBG(""); if (qmi_result_set_error(result, NULL)) { CALLBACK_WITH_FAILURE(cb, -1, -1, -1, -1, cbd->data); return; } if (!extract_ss_info(result, &status, &lac, &cellid, &tech, &data->operator)) { CALLBACK_WITH_FAILURE(cb, -1, -1, -1, -1, cbd->data); return; } CALLBACK_WITH_SUCCESS(cb, status, lac, cellid, tech, cbd->data); }
static void get_imsi_cb(struct qmi_result *result, void *user_data) { struct cb_data *cbd = user_data; ofono_sim_imsi_cb_t cb = cbd->cb; char *str; DBG(""); if (qmi_result_set_error(result, NULL)) { CALLBACK_WITH_FAILURE(cb, NULL, cbd->data); return; } str = qmi_result_get_string(result, QMI_DMS_RESULT_IMSI); if (!str) { CALLBACK_WITH_FAILURE(cb, NULL, cbd->data); return; } CALLBACK_WITH_SUCCESS(cb, str, cbd->data); qmi_free(str); }
static void scan_nets_cb(struct qmi_result *result, void *user_data) { struct cb_data *cbd = user_data; ofono_netreg_operator_list_cb_t cb = cbd->cb; struct ofono_network_operator *list; const struct qmi_nas_network_list *netlist; const struct qmi_nas_network_rat *netrat; const void *ptr; uint16_t len, num, offset, i; DBG(""); if (qmi_result_set_error(result, NULL)) { CALLBACK_WITH_FAILURE(cb, 0, NULL, cbd->data); return; } ptr = qmi_result_get(result, QMI_NAS_RESULT_NETWORK_LIST, &len); if (!ptr) { CALLBACK_WITH_FAILURE(cb, 0, NULL, cbd->data); return; } netlist = ptr; num = GUINT16_FROM_LE(netlist->count); DBG("found %d operators", num); list = g_try_new0(struct ofono_network_operator, num); if (!list) { CALLBACK_WITH_FAILURE(cb, 0, NULL, cbd->data); return; } offset = 2; for (i = 0; i < num; i++) { const struct qmi_nas_network_info *netinfo = ptr + offset; snprintf(list[i].mcc, OFONO_MAX_MCC_LENGTH + 1, "%03d", GUINT16_FROM_LE(netinfo->mcc)); snprintf(list[i].mnc, OFONO_MAX_MNC_LENGTH + 1, "%02d", GUINT16_FROM_LE(netinfo->mnc)); strncpy(list[i].name, netinfo->desc, netinfo->desc_len); list[i].name[netinfo->desc_len] = '\0'; if (netinfo->status & 0x10) list[i].status = 3; else if (netinfo->status & 0x01) list[i].status = 2; else if (netinfo->status & 0x02) list[i].status = 1; else list[i].status = 0; list[i].tech = -1; DBG("%s (%s:%s) status %d", list[i].name, list[i].mcc, list[i].mnc, list[i].status); offset += sizeof(struct qmi_nas_network_info) + netinfo->desc_len; } netrat = qmi_result_get(result, QMI_NAS_RESULT_NETWORK_RAT, &len); if (!netrat) goto done; if (GUINT16_FROM_LE(netrat->count) != num) goto done; for (i = 0; i < num; i++) { DBG("%03d:%02d %d", netrat->info[i].mcc, netrat->info[i].mnc, netrat->info[i].rat); list[i].tech = qmi_nas_rat_to_tech(netrat->info[i].rat); } done: CALLBACK_WITH_SUCCESS(cb, num, list, cbd->data); g_free(list); }