int g_ril_reply_parse_set_facility_lock(GRil *gril, const struct ril_msg *message) { struct parcel rilp; int retries = -1, numint; g_ril_init_parcel(message, &rilp); /* mako reply has no payload for call barring */ if (parcel_data_avail(&rilp) == 0) goto end; numint = parcel_r_int32(&rilp); if (numint != 1) { ofono_error("%s: wrong format", __func__); goto end; } retries = parcel_r_int32(&rilp); if (rilp.malformed) { ofono_error("%s: malformed parcel", __func__); goto end; } end: g_ril_append_print_buf(gril, "{%d}", retries); g_ril_print_response(gril, message); return retries; }
static void ril_call_barring_set_cb(struct ril_msg *message, gpointer user_data) { struct cb_data *cbd = user_data; ofono_call_barring_set_cb_t cb = cbd->cb; struct barring_data *bd = cbd->user; struct parcel rilp; int retries = -1; if (message->error != RIL_E_SUCCESS) goto error; g_ril_init_parcel(message, &rilp); /* mako reply has no payload for call barring */ if (parcel_data_avail(&rilp) == 0) goto done; if (parcel_r_int32(&rilp) != 1) goto error; retries = parcel_r_int32(&rilp); if (rilp.malformed) goto error; done: g_ril_append_print_buf(bd->ril, "{%d}", retries); g_ril_print_response(bd->ril, message); CALLBACK_WITH_SUCCESS(cb, cbd->data); return; error: CALLBACK_WITH_FAILURE(cb, cbd->data); }
int *g_ril_reply_parse_retries(GRil *gril, const struct ril_msg *message, enum ofono_sim_password_type passwd_type) { struct parcel rilp; int i, numint; int *retries = g_try_malloc0(sizeof(int) * OFONO_SIM_PASSWORD_INVALID); if (retries == NULL) { ofono_error("%s: out of memory", __func__); goto no_data; } for (i = 0; i < OFONO_SIM_PASSWORD_INVALID; ++i) retries[i] = -1; g_ril_init_parcel(message, &rilp); /* maguro/infineon: no data is returned */ if (parcel_data_avail(&rilp) == 0) goto no_data; numint = parcel_r_int32(&rilp); switch (g_ril_vendor(gril)) { case OFONO_RIL_VENDOR_AOSP: case OFONO_RIL_VENDOR_QCOM_MSIM: /* * The number of retries is valid only when a wrong password has * been introduced in Nexus 4. TODO: check Nexus 5 behaviour. */ if (message->error == RIL_E_PASSWORD_INCORRECT) retries[passwd_type] = parcel_r_int32(&rilp); g_ril_append_print_buf(gril, "{%d}", retries[passwd_type]); break; case OFONO_RIL_VENDOR_MTK: /* * Some versions of MTK modem return just the retries for the * password just entered while others return the retries for all * passwords. */ if (numint == 1) { retries[passwd_type] = parcel_r_int32(&rilp); g_ril_append_print_buf(gril, "{%d}", retries[passwd_type]); } else if (numint == 4) { retries[OFONO_SIM_PASSWORD_SIM_PIN] = parcel_r_int32(&rilp); retries[OFONO_SIM_PASSWORD_SIM_PIN2] = parcel_r_int32(&rilp); retries[OFONO_SIM_PASSWORD_SIM_PUK] = parcel_r_int32(&rilp); retries[OFONO_SIM_PASSWORD_SIM_PUK2] = parcel_r_int32(&rilp); g_ril_append_print_buf(gril, "{pin %d, pin2 %d, puk %d, puk2 %d}", retries[OFONO_SIM_PASSWORD_SIM_PIN], retries[OFONO_SIM_PASSWORD_SIM_PIN2], retries[OFONO_SIM_PASSWORD_SIM_PUK], retries[OFONO_SIM_PASSWORD_SIM_PUK2]); } else { ofono_error("%s: wrong format", __func__); goto no_data; } break; case OFONO_RIL_VENDOR_INFINEON: ofono_error("%s: infineon type should not arrive here", __func__); g_assert(FALSE); break; } if (rilp.malformed) { ofono_error("%s: malformed parcel", __func__); goto no_data; } g_ril_print_response(gril, message); return retries; no_data: g_free(retries); return NULL; }
int g_ril_unsol_parse_signal_strength(GRil *gril, const struct ril_msg *message, int ril_tech) { struct parcel rilp; int gw_sigstr, gw_signal, cdma_dbm, evdo_dbm; int lte_sigstr = -1, lte_rsrp = -1, lte_rssnr = -1; int lte_signal; int signal; g_ril_init_parcel(message, &rilp); /* RIL_SignalStrength_v5 */ /* GW_SignalStrength */ gw_sigstr = parcel_r_int32(&rilp); gw_signal = get_gsm_strength(gw_sigstr); parcel_r_int32(&rilp); /* bitErrorRate */ /* * CDMA/EVDO values are not processed as CDMA is not supported */ /* CDMA_SignalStrength */ cdma_dbm = parcel_r_int32(&rilp); parcel_r_int32(&rilp); /* ecio */ /* EVDO_SignalStrength */ evdo_dbm = parcel_r_int32(&rilp); parcel_r_int32(&rilp); /* ecio */ parcel_r_int32(&rilp); /* signalNoiseRatio */ /* Present only for RIL_SignalStrength_v6 or newer */ if (parcel_data_avail(&rilp) > 0) { /* LTE_SignalStrength */ lte_sigstr = parcel_r_int32(&rilp); lte_rsrp = parcel_r_int32(&rilp); parcel_r_int32(&rilp); /* rsrq */ lte_rssnr = parcel_r_int32(&rilp); parcel_r_int32(&rilp); /* cqi */ lte_signal = get_lte_strength(lte_sigstr, lte_rsrp, lte_rssnr); } else { lte_signal = -1; } g_ril_append_print_buf(gril, "{gw: %d, cdma: %d, evdo: %d, lte: %d %d %d}", gw_sigstr, cdma_dbm, evdo_dbm, lte_sigstr, lte_rsrp, lte_rssnr); if (message->unsolicited) g_ril_print_unsol(gril, message); else g_ril_print_response(gril, message); /* Return the first valid one */ if (gw_signal != -1 && lte_signal != -1) if (ril_tech == RADIO_TECH_LTE) signal = lte_signal; else signal = gw_signal; else if (gw_signal != -1) signal = gw_signal; else if (lte_signal != -1) signal = lte_signal; else signal = -1; return signal; }