diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-07 17:34:53 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-23 19:09:54 +0200 |
commit | 8e1c9421aaf5853a3a4cbfa831dbb2b2718bb734 (patch) | |
tree | d45032d49f56d33259b56478fc4f0f950fe5906f | |
parent | 50b65fa28f46c95c82ad8d1d6c4c0587904dc54c (diff) |
broadband-modem-qmi: consolidate Serving System response/indication processing
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 306 |
1 files changed, 121 insertions, 185 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index a606878e..5f07f491 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -2791,12 +2791,10 @@ qmi_radio_interface_list_to_access_technologies (GArray *radio_interfaces) } static void -get_serving_system_ready (QmiClientNas *client, - GAsyncResult *res, - RunRegistrationChecksContext *ctx) +common_process_serving_system (MMBroadbandModemQmi *self, + QmiMessageNasGetServingSystemOutput *response_output, + QmiIndicationNasServingSystemOutput *indication_output) { - QmiMessageNasGetServingSystemOutput *output; - GError *error = NULL; QmiNasRegistrationState registration_state; QmiNasAttachState cs_attach_state; QmiNasAttachState ps_attach_state; @@ -2813,41 +2811,39 @@ get_serving_system_ready (QmiClientNas *client, MMModem3gppRegistrationState mm_cs_registration_state; MMModem3gppRegistrationState mm_ps_registration_state; - output = qmi_client_nas_get_serving_system_finish (client, res, &error); - if (!output) { - g_prefix_error (&error, "QMI operation failed: "); - g_simple_async_result_take_error (ctx->result, error); - run_registration_checks_context_complete_and_free (ctx); - return; - } - - if (!qmi_message_nas_get_serving_system_output_get_result (output, &error)) { - g_prefix_error (&error, "Couldn't get serving system: "); - g_simple_async_result_take_error (ctx->result, error); - qmi_message_nas_get_serving_system_output_unref (output); - run_registration_checks_context_complete_and_free (ctx); - return; - } - - qmi_message_nas_get_serving_system_output_get_serving_system ( - output, - ®istration_state, - &cs_attach_state, - &ps_attach_state, - &selected_network, - &radio_interfaces, - NULL); + if (response_output) + qmi_message_nas_get_serving_system_output_get_serving_system ( + response_output, + ®istration_state, + &cs_attach_state, + &ps_attach_state, + &selected_network, + &radio_interfaces, + NULL); + else + qmi_indication_nas_serving_system_output_get_serving_system ( + indication_output, + ®istration_state, + &cs_attach_state, + &ps_attach_state, + &selected_network, + &radio_interfaces, + NULL); - /* If we're getting reported about registration NOT in a 3GPP system, - * just return with error */ + /* Only process 3GPP info */ if (selected_network != QMI_NAS_NETWORK_TYPE_3GPP) { - g_simple_async_result_set_error ( - ctx->result, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "Cannot get 3GPP registration state, serving system is not 3GPP"); - qmi_message_nas_get_serving_system_output_unref (output); - run_registration_checks_context_complete_and_free (ctx); + g_free (self->priv->current_operator_id); + self->priv->current_operator_id = NULL; + g_free (self->priv->current_operator_description); + self->priv->current_operator_description = NULL; + mm_iface_modem_3gpp_update_cs_registration_state ( + MM_IFACE_MODEM_3GPP (self), + MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN, + 0, 0, 0); + mm_iface_modem_3gpp_update_ps_registration_state ( + MM_IFACE_MODEM_3GPP (self), + MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN, + 0, 0, 0); return; } @@ -2855,7 +2851,10 @@ get_serving_system_ready (QmiClientNas *client, * TODO: QMI may report per-access-technology roaming indicators, for when * the modem is connected to more than one network. How to handle those? */ roaming = QMI_NAS_ROAMING_INDICATOR_STATUS_OFF; - qmi_message_nas_get_serving_system_output_get_roaming_indicator (output, &roaming, NULL); + if (response_output) + qmi_message_nas_get_serving_system_output_get_roaming_indicator (response_output, &roaming, NULL); + else + qmi_indication_nas_serving_system_output_get_roaming_indicator (indication_output, &roaming, NULL); /* Build MM registration states */ mm_cs_registration_state = @@ -2874,39 +2873,56 @@ get_serving_system_ready (QmiClientNas *client, qmi_radio_interface_list_to_access_technologies (radio_interfaces); /* Get and cache operator ID/name */ - if (qmi_message_nas_get_serving_system_output_get_current_plmn ( - output, - &mcc, - &mnc, - &description, - NULL)) { + if ((response_output && + qmi_message_nas_get_serving_system_output_get_current_plmn ( + response_output, + &mcc, + &mnc, + &description, + NULL)) || + (indication_output && + qmi_indication_nas_serving_system_output_get_current_plmn ( + indication_output, + &mcc, + &mnc, + &description, + NULL))) { /* When we don't have information about leading PCS digit, guess best */ - g_free (ctx->self->priv->current_operator_id); + g_free (self->priv->current_operator_id); if (mnc >= 100) - ctx->self->priv->current_operator_id = + self->priv->current_operator_id = g_strdup_printf ("%.3" G_GUINT16_FORMAT "%.3" G_GUINT16_FORMAT, mcc, mnc); else - ctx->self->priv->current_operator_id = + self->priv->current_operator_id = g_strdup_printf ("%.3" G_GUINT16_FORMAT "%.2" G_GUINT16_FORMAT, mcc, mnc); - g_free (ctx->self->priv->current_operator_description); - ctx->self->priv->current_operator_description = g_strdup (description); + g_free (self->priv->current_operator_description); + self->priv->current_operator_description = g_strdup (description); } /* If MNC comes with PCS digit, we must make sure the additional * leading '0' is added */ - if (qmi_message_nas_get_serving_system_output_get_mnc_pcs_digit_include_status ( - output, - &mcc, - &mnc, - &has_pcs_digit, - NULL) && has_pcs_digit) { - g_free (ctx->self->priv->current_operator_id); - ctx->self->priv->current_operator_id = + if (((response_output && + qmi_message_nas_get_serving_system_output_get_mnc_pcs_digit_include_status ( + response_output, + &mcc, + &mnc, + &has_pcs_digit, + NULL)) || + (indication_output && + qmi_indication_nas_serving_system_output_get_mnc_pcs_digit_include_status ( + indication_output, + &mcc, + &mnc, + &has_pcs_digit, + NULL))) && + has_pcs_digit) { + g_free (self->priv->current_operator_id); + self->priv->current_operator_id = g_strdup_printf ("%.3" G_GUINT16_FORMAT "%.3" G_GUINT16_FORMAT, mcc, mnc); @@ -2915,26 +2931,56 @@ get_serving_system_ready (QmiClientNas *client, /* Get 3GPP location LAC and CI */ lac = 0; cid = 0; - qmi_message_nas_get_serving_system_output_get_lac_3gpp (output, &lac, NULL); - qmi_message_nas_get_serving_system_output_get_cid_3gpp (output, &cid, NULL); + if (response_output) { + qmi_message_nas_get_serving_system_output_get_lac_3gpp (response_output, &lac, NULL); + qmi_message_nas_get_serving_system_output_get_cid_3gpp (response_output, &cid, NULL); + } else { + qmi_indication_nas_serving_system_output_get_lac_3gpp (indication_output, &lac, NULL); + qmi_indication_nas_serving_system_output_get_cid_3gpp (indication_output, &cid, NULL); + } /* Report new registration states */ - if (ctx->cs_supported) - mm_iface_modem_3gpp_update_cs_registration_state ( - MM_IFACE_MODEM_3GPP (ctx->self), - mm_cs_registration_state, - mm_access_technologies, - lac, - cid); + mm_iface_modem_3gpp_update_cs_registration_state ( + MM_IFACE_MODEM_3GPP (self), + mm_cs_registration_state, + mm_access_technologies, + lac, + cid); - if (ctx->ps_supported) - mm_iface_modem_3gpp_update_ps_registration_state ( - MM_IFACE_MODEM_3GPP (ctx->self), - mm_ps_registration_state, - mm_access_technologies, - lac, - cid); + mm_iface_modem_3gpp_update_ps_registration_state ( + MM_IFACE_MODEM_3GPP (self), + mm_ps_registration_state, + mm_access_technologies, + lac, + cid); +} + +static void +get_serving_system_ready (QmiClientNas *client, + GAsyncResult *res, + RunRegistrationChecksContext *ctx) +{ + QmiMessageNasGetServingSystemOutput *output; + GError *error = NULL; + + output = qmi_client_nas_get_serving_system_finish (client, res, &error); + if (!output) { + g_prefix_error (&error, "QMI operation failed: "); + g_simple_async_result_take_error (ctx->result, error); + run_registration_checks_context_complete_and_free (ctx); + return; + } + + if (!qmi_message_nas_get_serving_system_output_get_result (output, &error)) { + g_prefix_error (&error, "Couldn't get serving system: "); + g_simple_async_result_take_error (ctx->result, error); + qmi_message_nas_get_serving_system_output_unref (output); + run_registration_checks_context_complete_and_free (ctx); + return; + } + + common_process_serving_system (ctx->self, output, NULL); g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); qmi_message_nas_get_serving_system_output_unref (output); @@ -3719,117 +3765,7 @@ serving_system_indication_cb (QmiClientNas *client, MMBroadbandModemQmi *self, QmiIndicationNasServingSystemOutput *output) { - QmiNasRegistrationState registration_state; - QmiNasAttachState cs_attach_state; - QmiNasAttachState ps_attach_state; - QmiNasNetworkType selected_network; - GArray *radio_interfaces; - - qmi_indication_nas_serving_system_output_get_serving_system ( - output, - ®istration_state, - &cs_attach_state, - &ps_attach_state, - &selected_network, - &radio_interfaces, - NULL); - - /* 3GPP specific processing */ - if (selected_network == QMI_NAS_NETWORK_TYPE_3GPP) { - QmiNasRoamingIndicatorStatus roaming; - guint16 mcc; - guint16 mnc; - const gchar *description; - gboolean has_pcs_digit; - guint16 lac; - guint32 cid; - MMModemAccessTechnology mm_access_technologies; - MMModem3gppRegistrationState mm_cs_registration_state; - MMModem3gppRegistrationState mm_ps_registration_state; - - /* Get roaming status. - * TODO: QMI may report per-access-technology roaming indicators, for when - * the modem is connected to more than one network. How to handle those? */ - roaming = QMI_NAS_ROAMING_INDICATOR_STATUS_OFF; - qmi_indication_nas_serving_system_output_get_roaming_indicator (output, &roaming, NULL); - - /* Build MM registration states */ - mm_cs_registration_state = - qmi_registration_state_to_3gpp_registration_state ( - cs_attach_state, - registration_state, - (roaming == QMI_NAS_ROAMING_INDICATOR_STATUS_ON)); - mm_ps_registration_state = - qmi_registration_state_to_3gpp_registration_state ( - ps_attach_state, - registration_state, - (roaming == QMI_NAS_ROAMING_INDICATOR_STATUS_ON)); - - /* Build access technologies mask */ - mm_access_technologies = - qmi_radio_interface_list_to_access_technologies (radio_interfaces); - - /* Get and cache operator ID/name */ - if (qmi_indication_nas_serving_system_output_get_current_plmn ( - output, - &mcc, - &mnc, - &description, - NULL)) { - /* When we don't have information about leading PCS digit, guess best */ - g_free (self->priv->current_operator_id); - if (mnc >= 100) - self->priv->current_operator_id = - g_strdup_printf ("%.3" G_GUINT16_FORMAT "%.3" G_GUINT16_FORMAT, - mcc, - mnc); - else - self->priv->current_operator_id = - g_strdup_printf ("%.3" G_GUINT16_FORMAT "%.2" G_GUINT16_FORMAT, - mcc, - mnc); - - g_free (self->priv->current_operator_description); - self->priv->current_operator_description = g_strdup (description); - } - - /* If MNC comes with PCS digit, we must make sure the additional - * leading '0' is added */ - if (qmi_indication_nas_serving_system_output_get_mnc_pcs_digit_include_status ( - output, - &mcc, - &mnc, - &has_pcs_digit, - NULL) && has_pcs_digit) { - g_free (self->priv->current_operator_id); - self->priv->current_operator_id = - g_strdup_printf ("%.3" G_GUINT16_FORMAT "%.3" G_GUINT16_FORMAT, - mcc, - mnc); - } - - /* Get 3GPP location LAC and CI */ - lac = 0; - cid = 0; - qmi_indication_nas_serving_system_output_get_lac_3gpp (output, &lac, NULL); - qmi_indication_nas_serving_system_output_get_cid_3gpp (output, &cid, NULL); - - /* Report new registration states */ - - mm_iface_modem_3gpp_update_cs_registration_state ( - MM_IFACE_MODEM_3GPP (self), - mm_cs_registration_state, - mm_access_technologies, - lac, - cid); - - mm_iface_modem_3gpp_update_ps_registration_state ( - MM_IFACE_MODEM_3GPP (self), - mm_ps_registration_state, - mm_access_technologies, - lac, - cid); - } + common_process_serving_system (self, NULL, output); } static void |