static void load_unlock_retries_ready (MMBaseModem *self, GAsyncResult *res, GSimpleAsyncResult *operation_result) { const gchar *response; GError *error = NULL; int pin1, puk1, pin2, puk2; response = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error); if (!response) { mm_dbg ("Couldn't query unlock retries: '%s'", error->message); g_simple_async_result_take_error (operation_result, error); g_simple_async_result_complete (operation_result); g_object_unref (operation_result); return; } /* That's right; no +CPNNUM: prefix, it looks like this: * * AT+CPNNUM * PIN1=3; PUK1=10; PIN2=3; PUK2=10 * OK */ if (sscanf (response, "PIN1=%d; PUK1=%d; PIN2=%d; PUK2=%d", &pin1, &puk1, &pin2, &puk2) == 4) { MMUnlockRetries *retries; retries = mm_unlock_retries_new (); mm_unlock_retries_set (retries, MM_MODEM_LOCK_SIM_PIN, pin1); mm_unlock_retries_set (retries, MM_MODEM_LOCK_SIM_PUK, puk1); mm_unlock_retries_set (retries, MM_MODEM_LOCK_SIM_PIN2, pin2); mm_unlock_retries_set (retries, MM_MODEM_LOCK_SIM_PUK2, puk2); g_simple_async_result_set_op_res_gpointer (operation_result, retries, (GDestroyNotify)g_object_unref); } else { g_simple_async_result_set_error (operation_result, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "Invalid unlock retries response: '%s'", response); } g_simple_async_result_complete (operation_result); g_object_unref (operation_result); }
MMUnlockRetries * mm_unlock_retries_new_from_dictionary (GVariant *dictionary) { GVariantIter iter; guint key, value; MMUnlockRetries *self; self = mm_unlock_retries_new (); if (!dictionary) return self; g_variant_iter_init (&iter, dictionary); while (g_variant_iter_next (&iter, "{uu}", &key, &value)) { mm_unlock_retries_set (self, (MMModemLock)key, value); } return self; }
static MMUnlockRetries * load_unlock_retries_finish (MMIfaceModem *self, GAsyncResult *res, GError **error) { MMUnlockRetries *unlock_retries; const gchar *response; gint matched; guint a, b, c ,d; response = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, error); if (!response) return NULL; matched = sscanf (response, "*EPIN: %d, %d, %d, %d", &a, &b, &c, &d); if (matched != 4) { g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "Could not parse PIN retries results: '%s'", response); return NULL; } if (a > 998) { g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "Invalid PIN attempts left: '%u'", a); return NULL; } unlock_retries = mm_unlock_retries_new (); mm_unlock_retries_set (unlock_retries, MM_MODEM_LOCK_SIM_PIN, a); mm_unlock_retries_set (unlock_retries, MM_MODEM_LOCK_SIM_PUK, b); mm_unlock_retries_set (unlock_retries, MM_MODEM_LOCK_SIM_PIN2, c); mm_unlock_retries_set (unlock_retries, MM_MODEM_LOCK_SIM_PUK2, d); return unlock_retries; }