diff options
author | Dan Williams <dcbw@redhat.com> | 2010-03-04 19:01:13 -0800 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2010-03-04 19:01:13 -0800 |
commit | 021ca1244e2be8afcf6bdb552866263dc20c9285 (patch) | |
tree | 8cfe275f8ed97a4fe8927ce352e53ed2bbcba504 | |
parent | 3457adefefa8bedd0349e6ac3d5cebcacf958000 (diff) |
gsm: postpone PIN/PUK success reply until we know updated unlock status
Don't return until we know what the updated lock status is. Fixes an
issue where callers that send the PIN before the modem is enabled
(remember, some modems can't be enabled until the PIN is entered, so
sometimes we have to send the PIN before it's enabled) would get
the reply too early and get failures from other operations.
-rw-r--r-- | src/mm-generic-gsm.c | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c index 6f88a031..9e38b29a 100644 --- a/src/mm-generic-gsm.c +++ b/src/mm-generic-gsm.c @@ -799,23 +799,24 @@ get_card_info (MMModem *modem, mm_serial_port_queue_command_cached (priv->primary, "+CGMR", 3, get_version_done, info); } +#define PIN_CLOSE_PORT_TAG "close-port" + static void pin_puk_recheck_done (MMModem *modem, GError *error, gpointer user_data) { - gboolean close_port = !!user_data; + MMCallbackInfo *info = (MMCallbackInfo *) user_data; + gboolean close_port = !!mm_callback_info_get_data (info, PIN_CLOSE_PORT_TAG); /* 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)); + info->error = mm_modem_check_removed (modem, error); - if (close_port) - mm_serial_port_close (MM_GENERIC_GSM_GET_PRIVATE (modem)->primary); - } -} + if (modem && close_port) + mm_serial_port_close (MM_GENERIC_GSM_GET_PRIVATE (modem)->primary); -#define PIN_CLOSE_PORT_TAG "close-port" + mm_callback_info_schedule (info); +} static void send_puk_done (MMSerialPort *port, @@ -826,15 +827,16 @@ send_puk_done (MMSerialPort *port, MMCallbackInfo *info = (MMCallbackInfo *) user_data; gboolean close_port = !!mm_callback_info_get_data (info, PIN_CLOSE_PORT_TAG); - if (error) + if (error) { info->error = g_error_copy (error); + mm_callback_info_schedule (info); + if (close_port) + mm_serial_port_close (port); + return; + } - /* Get latest PUK status */ - mm_generic_gsm_check_pin (MM_GENERIC_GSM (info->modem), - pin_puk_recheck_done, - GUINT_TO_POINTER (close_port)); - - mm_callback_info_schedule (info); + /* Get latest PIN status */ + mm_generic_gsm_check_pin (MM_GENERIC_GSM (info->modem), pin_puk_recheck_done, info); } static void @@ -886,15 +888,16 @@ send_pin_done (MMSerialPort *port, MMCallbackInfo *info = (MMCallbackInfo *) user_data; gboolean close_port = !!mm_callback_info_get_data (info, PIN_CLOSE_PORT_TAG); - if (error) + if (error) { info->error = g_error_copy (error); + mm_callback_info_schedule (info); + if (close_port) + mm_serial_port_close (port); + return; + } /* Get latest PIN status */ - mm_generic_gsm_check_pin (MM_GENERIC_GSM (info->modem), - pin_puk_recheck_done, - GUINT_TO_POINTER (close_port)); - - mm_callback_info_schedule (info); + mm_generic_gsm_check_pin (MM_GENERIC_GSM (info->modem), pin_puk_recheck_done, info); } static void |