From 88983fd1572cc912ad0f905caf172a976f6433f0 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Wed, 18 Dec 2019 15:02:37 +0100 Subject: [PATCH] cinterion: use common re-registration logic when needed If the modem requires +COPS re-registration after setting modes, use the common logic provided by the 3GPP interface, which already knows e.g. whether the registration was automatic or the actual requested operator id in case of being manual. --- .../cinterion/mm-broadband-modem-cinterion.c | 89 ++++--------------- 1 file changed, 18 insertions(+), 71 deletions(-) diff --git a/plugins/cinterion/mm-broadband-modem-cinterion.c b/plugins/cinterion/mm-broadband-modem-cinterion.c index a99db326..fc6381d8 100644 --- a/plugins/cinterion/mm-broadband-modem-cinterion.c +++ b/plugins/cinterion/mm-broadband-modem-cinterion.c @@ -74,9 +74,6 @@ struct _MMBroadbandModemCinterionPrivate { /* Command to go into sleep mode */ gchar *sleep_mode_cmd; - /* Cached manual selection attempt */ - gchar *manual_operator_id; - /* Cached supported bands in Cinterion format */ guint supported_bands; @@ -1053,6 +1050,20 @@ set_current_modes_finish (MMIfaceModem *self, return g_task_propagate_boolean (G_TASK (res), error); } +static void +set_current_modes_reregister_in_network_ready (MMIfaceModem3gpp *self, + GAsyncResult *res, + GTask *task) +{ + GError *error = NULL; + + if (!mm_iface_modem_3gpp_reregister_in_network_finish (self, res, &error)) + g_task_return_error (task, error); + else + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} + static void allowed_access_technology_update_ready (MMBroadbandModemCinterion *self, GAsyncResult *res, @@ -1105,10 +1116,10 @@ set_current_modes (MMIfaceModem *_self, * AT+COPS=,,, (i.e. just without a last value). Instead, we need to * re-run the last manual/automatic selection command which succeeded, * (or auto by default if none was launched) */ - if (self->priv->manual_operator_id) - command = g_strdup_printf ("+COPS=1,2,\"%s\"", self->priv->manual_operator_id); - else - command = g_strdup ("+COPS=0"); + mm_iface_modem_3gpp_reregister_in_network (MM_IFACE_MODEM_3GPP (self), + (GAsyncReadyCallback) set_current_modes_reregister_in_network_ready, + task); + return; } mm_base_modem_at_command ( @@ -1122,66 +1133,6 @@ set_current_modes (MMIfaceModem *_self, g_free (command); } -/*****************************************************************************/ -/* Register in network (3GPP interface) */ - -static gboolean -register_in_network_finish (MMIfaceModem3gpp *self, - GAsyncResult *res, - GError **error) -{ - return g_task_propagate_boolean (G_TASK (res), error); -} - -static void -cops_write_ready (MMBaseModem *_self, - GAsyncResult *res, - GTask *task) -{ - MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self); - GError *error = NULL; - - if (!mm_base_modem_at_command_full_finish (_self, res, &error)) - g_task_return_error (task, error); - else { - g_free (self->priv->manual_operator_id); - self->priv->manual_operator_id = g_strdup (g_task_get_task_data (task)); - g_task_return_boolean (task, TRUE); - } - g_object_unref (task); -} - -static void -register_in_network (MMIfaceModem3gpp *self, - const gchar *operator_id, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GTask *task; - gchar *command; - - task = g_task_new (self, cancellable, callback, user_data); - g_task_set_task_data (task, g_strdup (operator_id), g_free); - - /* If the user sent a specific network to use, lock it in. */ - if (operator_id) - command = g_strdup_printf ("+COPS=1,2,\"%s\"", operator_id); - else - command = g_strdup ("+COPS=0"); - - mm_base_modem_at_command_full (MM_BASE_MODEM (self), - mm_base_modem_peek_best_at_port (MM_BASE_MODEM (self), NULL), - command, - 120, - FALSE, - FALSE, /* raw */ - cancellable, - (GAsyncReadyCallback)cops_write_ready, - task); - g_free (command); -} - /*****************************************************************************/ /* Supported bands (Modem interface) */ @@ -1865,7 +1816,6 @@ finalize (GObject *object) MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (object); g_free (self->priv->sleep_mode_cmd); - g_free (self->priv->manual_operator_id); if (self->priv->cnmi_supported_mode) g_array_unref (self->priv->cnmi_supported_mode); @@ -1930,9 +1880,6 @@ iface_modem_3gpp_init (MMIfaceModem3gpp *iface) iface->setup_unsolicited_events_finish = modem_3gpp_setup_cleanup_unsolicited_events_finish; iface->cleanup_unsolicited_events = modem_3gpp_cleanup_unsolicited_events; iface->cleanup_unsolicited_events_finish = modem_3gpp_setup_cleanup_unsolicited_events_finish; - - iface->register_in_network = register_in_network; - iface->register_in_network_finish = register_in_network_finish; } static void