aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Helliwell <colin.helliwell@ln-systems.com>2018-01-01 18:42:28 +0100
committerAleksander Morgado <aleksander@aleksander.es>2018-01-01 18:42:28 +0100
commitc97b9d99e3ca62ff7af3b74afe05a9d80f16b8bb (patch)
treec3ecf25513cb29a1a07278eb10139341161e469f
parent8f26848ef00b343a15904bf7f8cd1a77de795b3e (diff)
broadband-modem: implement generic unlock retries loading
-rw-r--r--src/mm-broadband-modem.c116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index f82122b1..24625735 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -1334,6 +1334,120 @@ modem_load_unlock_required (MMIfaceModem *self,
/* Supported modes loading (Modem interface) */
typedef struct {
+ MMUnlockRetries *retries;
+ guint i;
+} LoadUnlockRetriesContext;
+
+typedef struct {
+ MMModemLock lock;
+ const gchar *command;
+} UnlockRetriesMap;
+
+static const UnlockRetriesMap unlock_retries_map [] = {
+ { MM_MODEM_LOCK_SIM_PIN, "+CSIM=10,\"0020000100\"" },
+ { MM_MODEM_LOCK_SIM_PUK, "+CSIM=10,\"002C000100\"" },
+ { MM_MODEM_LOCK_SIM_PIN2, "+CSIM=10,\"0020008100\"" },
+ { MM_MODEM_LOCK_SIM_PUK2, "+CSIM=10,\"002C008100\"" },
+};
+
+static void
+load_unlock_retries_context_free (LoadUnlockRetriesContext *ctx)
+{
+ g_object_unref (ctx->retries);
+ g_slice_free (LoadUnlockRetriesContext, ctx);
+}
+
+static MMUnlockRetries *
+load_unlock_retries_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return g_task_propagate_pointer (G_TASK (res), error);
+}
+
+static void load_unlock_retries_context_step (GTask *task);
+
+static void
+csim_ready (MMBaseModem *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ LoadUnlockRetriesContext *ctx;
+ const gchar *response;
+ GError *error = NULL;
+
+ ctx = g_task_get_task_data (task);
+
+ response = mm_base_modem_at_command_finish (self, res, &error);
+ if (!response) {
+ mm_dbg ("Couldn't load retry count for lock '%s': %s",
+ mm_modem_lock_get_string (unlock_retries_map[ctx->i].lock),
+ error->message);
+ g_error_free (error);
+ } else {
+ gint val;
+ GError *error = NULL;
+
+ val = mm_parse_csim_response (response, &error);
+ if (val < 0) {
+ mm_warn ("Parse error in step %d: %s.", ctx->i, error->message);
+ mm_dbg ("Couldn't parse retry count value for lock '%s'",
+ mm_modem_lock_get_string (unlock_retries_map[ctx->i].lock));
+ } else
+ mm_unlock_retries_set (ctx->retries, unlock_retries_map[ctx->i].lock, val);
+ }
+
+ /* Go to next lock value */
+ ctx->i++;
+ load_unlock_retries_context_step (task);
+}
+
+static void
+load_unlock_retries_context_step (GTask *task)
+{
+ MMBroadbandModem *self;
+ LoadUnlockRetriesContext *ctx;
+
+ self = g_task_get_source_object (task);
+ ctx = g_task_get_task_data (task);
+
+ if (ctx->i == G_N_ELEMENTS (unlock_retries_map)) {
+ g_task_return_pointer (task, g_object_ref (ctx->retries), g_object_unref);
+ g_object_unref (task);
+ return;
+ }
+
+ mm_base_modem_at_command (
+ MM_BASE_MODEM (self),
+ unlock_retries_map[ctx->i].command,
+ 3,
+ FALSE,
+ (GAsyncReadyCallback)csim_ready,
+ task);
+}
+
+static void
+load_unlock_retries (MMIfaceModem *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+ LoadUnlockRetriesContext *ctx;
+
+ task = g_task_new (self, NULL, callback, user_data);
+
+ ctx = g_slice_new0 (LoadUnlockRetriesContext);
+ ctx->retries = mm_unlock_retries_new ();
+ ctx->i = 0;
+ g_task_set_task_data (task, ctx, (GDestroyNotify)load_unlock_retries_context_free);
+
+ load_unlock_retries_context_step (task);
+}
+
+/*****************************************************************************/
+/* Supported modes loading (Modem interface) */
+
+typedef struct {
MMModemMode mode;
gboolean run_cnti;
gboolean run_ws46;
@@ -10881,6 +10995,8 @@ iface_modem_init (MMIfaceModem *iface)
iface->load_own_numbers_finish = modem_load_own_numbers_finish;
iface->load_unlock_required = modem_load_unlock_required;
iface->load_unlock_required_finish = modem_load_unlock_required_finish;
+ iface->load_unlock_retries = load_unlock_retries;
+ iface->load_unlock_retries_finish = load_unlock_retries_finish;
iface->create_sim = modem_create_sim;
iface->create_sim_finish = modem_create_sim_finish;
iface->load_supported_modes = modem_load_supported_modes;