aboutsummaryrefslogtreecommitdiff
path: root/plugins/ublox
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2019-12-18 14:56:50 +0100
committerDan Williams <dcbw@redhat.com>2020-01-06 20:17:08 +0000
commita1966222e9df597f5b6ab98cc383b7065463967e (patch)
treefebce9121e461db50a0a68b7105ac7261511f23d /plugins/ublox
parent32fcac5ce7f76dae7b1eafbd663d1eb2970b5567 (diff)
ublox: use common re-registration logic when needed
If the modem requires +COPS re-registration after setting bands or 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. This will also make the u-blox plugin use the common +COPS set command implemented in the broadband modem object, which has the fallback to use the MCCMNC encoded in the current charset if needed.
Diffstat (limited to 'plugins/ublox')
-rw-r--r--plugins/ublox/mm-broadband-modem-ublox.c110
1 files changed, 21 insertions, 89 deletions
diff --git a/plugins/ublox/mm-broadband-modem-ublox.c b/plugins/ublox/mm-broadband-modem-ublox.c
index c0b3ef7d..b714ec10 100644
--- a/plugins/ublox/mm-broadband-modem-ublox.c
+++ b/plugins/ublox/mm-broadband-modem-ublox.c
@@ -35,14 +35,12 @@
#include "mm-ublox-enums-types.h"
static void iface_modem_init (MMIfaceModem *iface);
-static void iface_modem_3gpp_init (MMIfaceModem3gpp *iface);
static void iface_modem_voice_init (MMIfaceModemVoice *iface);
static MMIfaceModemVoice *iface_modem_voice_parent;
G_DEFINE_TYPE_EXTENDED (MMBroadbandModemUblox, mm_broadband_modem_ublox, MM_TYPE_BROADBAND_MODEM, 0,
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init)
- G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_3GPP, iface_modem_3gpp_init)
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_VOICE, iface_modem_voice_init))
@@ -63,9 +61,6 @@ struct _MMBroadbandModemUbloxPrivate {
/* AT command configuration */
UbloxSupportConfig support_config;
- /* Operator ID for manual registration */
- gchar *operator_id;
-
/* Voice +UCALLSTAT support */
GRegex *ucallstat_regex;
@@ -354,6 +349,24 @@ common_set_current_modes_bands_finish (MMIfaceModem *self,
static void set_current_modes_bands_step (GTask *task);
static void
+set_current_modes_bands_reregister_in_network_ready (MMIfaceModem3gpp *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ SetCurrentModesBandsContext *ctx;
+
+ ctx = (SetCurrentModesBandsContext *) g_task_get_task_data (task);
+ g_assert (ctx);
+
+ /* propagate the error if none already set */
+ mm_iface_modem_3gpp_reregister_in_network_finish (self, res, ctx->saved_error ? NULL : &ctx->saved_error);
+
+ /* Go to next step (release power operation) regardless of the result */
+ ctx->step++;
+ set_current_modes_bands_step (task);
+}
+
+static void
set_current_modes_bands_after_command_ready (MMBaseModem *self,
GAsyncResult *res,
GTask *task)
@@ -514,22 +527,9 @@ set_current_modes_bands_step (GTask *task)
case SET_CURRENT_MODES_BANDS_STEP_AFTER_COMMAND:
/* If COPS required around the set command, run it unconditionally */
if (ctx->self->priv->support_config.method == SETTINGS_UPDATE_METHOD_COPS) {
- gchar *command;
-
- /* If the user sent a specific network to use, lock it in. */
- if (ctx->self->priv->operator_id)
- command = g_strdup_printf ("+COPS=1,2,\"%s\"", ctx->self->priv->operator_id);
- else
- command = g_strdup ("+COPS=0");
-
- mm_base_modem_at_command (
- MM_BASE_MODEM (ctx->self),
- command,
- 120,
- FALSE,
- (GAsyncReadyCallback) set_current_modes_bands_after_command_ready,
- task);
- g_free (command);
+ mm_iface_modem_3gpp_reregister_in_network (MM_IFACE_MODEM_3GPP (ctx->self),
+ (GAsyncReadyCallback) set_current_modes_bands_reregister_in_network_ready,
+ task);
return;
}
/* If CFUN required, see if we need to recover power */
@@ -794,66 +794,6 @@ common_modem_power_operation (MMBroadbandModemUblox *self,
task);
}
-/*****************************************************************************/
-/* 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)
-{
- MMBroadbandModemUblox *self = MM_BROADBAND_MODEM_UBLOX (_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->operator_id);
- self->priv->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);
-}
-
static void
modem_reset (MMIfaceModem *self,
GAsyncReadyCallback callback,
@@ -1915,13 +1855,6 @@ iface_modem_init (MMIfaceModem *iface)
}
static void
-iface_modem_3gpp_init (MMIfaceModem3gpp *iface)
-{
- iface->register_in_network = register_in_network;
- iface->register_in_network_finish = register_in_network_finish;
-}
-
-static void
iface_modem_voice_init (MMIfaceModemVoice *iface)
{
iface_modem_voice_parent = g_type_interface_peek_parent (iface);
@@ -1951,7 +1884,6 @@ finalize (GObject *object)
g_regex_unref (self->priv->ucallstat_regex);
if (self->priv->udtmfd_regex)
g_regex_unref (self->priv->udtmfd_regex);
- g_free (self->priv->operator_id);
G_OBJECT_CLASS (mm_broadband_modem_ublox_parent_class)->finalize (object);
}