diff options
author | Dan Williams <dcbw@redhat.com> | 2010-02-09 22:58:44 -0800 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2010-02-09 22:58:44 -0800 |
commit | 95dd4b5be1ebb0408be6e282eb20e2c45df1f253 (patch) | |
tree | 2a0515859897a2b2880e1590bb0c34f791dc7d50 /src | |
parent | 953095466d210b76d785175957af0cb686fc5c04 (diff) |
gsm: try initial PIN check a few times in case SIM is busy
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-generic-gsm.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c index 4718d6fc..fb141915 100644 --- a/src/mm-generic-gsm.c +++ b/src/mm-generic-gsm.c @@ -51,6 +51,8 @@ typedef struct { gboolean valid; gboolean pin_checked; + guint32 pin_check_tries; + guint pin_check_timeout; char *oper_code; char *oper_name; @@ -297,6 +299,20 @@ check_valid (MMGenericGsm *self) mm_modem_base_set_valid (MM_MODEM_BASE (self), new_valid); } + +static void initial_pin_check_done (MMModem *modem, GError *error, gpointer user_data); + +static gboolean +pin_check_again (gpointer user_data) +{ + MMGenericGsm *self = MM_GENERIC_GSM (user_data); + MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (self); + + priv->pin_check_timeout = 0; + mm_generic_gsm_check_pin (self, initial_pin_check_done, GUINT_TO_POINTER (TRUE)); + return FALSE; +} + static void initial_pin_check_done (MMModem *modem, GError *error, gpointer user_data) { @@ -306,10 +322,18 @@ initial_pin_check_done (MMModem *modem, GError *error, gpointer user_data) /* modem could have been removed before we get here, in which case * 'modem' will be NULL. */ - if (modem) { - g_return_if_fail (MM_IS_GENERIC_GSM (modem)); - priv = MM_GENERIC_GSM_GET_PRIVATE (modem); + if (!modem) + return; + g_return_if_fail (MM_IS_GENERIC_GSM (modem)); + priv = MM_GENERIC_GSM_GET_PRIVATE (modem); + + if (error && priv->pin_check_tries++ < 3) { + /* Try it again a few times */ + if (priv->pin_check_timeout) + g_source_remove (priv->pin_check_timeout); + priv->pin_check_timeout = g_timeout_add_seconds (2, pin_check_again, modem); + } else { priv->pin_checked = TRUE; if (close_port) mm_serial_port_close (priv->primary); @@ -2284,6 +2308,9 @@ finalize (GObject *object) mm_generic_gsm_pending_registration_stop (MM_GENERIC_GSM (object)); + if (priv->pin_check_timeout) + g_source_remove (priv->pin_check_timeout); + g_free (priv->oper_code); g_free (priv->oper_name); |