diff options
author | Dan Williams <dcbw@redhat.com> | 2010-08-26 12:35:23 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2010-08-26 12:35:23 -0500 |
commit | 37e4a0b1a88911ad21a792cda663a3e16cc855ee (patch) | |
tree | 839b7dc884c8fa0e10d43dfd281581db54b02a2f /src | |
parent | 7657f138b3e635b0850e051064fd0323836dd7ec (diff) |
gsm: ensure unlock retries is updated on incorrect PIN entry
If the modem returns an error (like "+CME ERROR: incorrect password"
or even just ERROR) make sure we recheck PIN status and thus also
recheck the number of unlock retries instead of just returning the
error to the caller.
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-generic-gsm.c | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c index 1dc835c0..3d0e3986 100644 --- a/src/mm-generic-gsm.c +++ b/src/mm-generic-gsm.c @@ -1424,6 +1424,7 @@ get_card_info (MMModem *modem, } #define PIN_PORT_TAG "pin-port" +#define SAVED_ERROR_TAG "error" static void pin_puk_recheck_done (MMModem *modem, GError *error, gpointer user_data); @@ -1443,6 +1444,7 @@ pin_puk_recheck_done (MMModem *modem, GError *error, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; MMSerialPort *port; + GError *saved_error; /* Clear the pin check timeout to ensure that it won't ever get a * stale MMCallbackInfo if the modem got removed. We'll reschedule it here @@ -1483,6 +1485,13 @@ pin_puk_recheck_done (MMModem *modem, GError *error, gpointer user_data) if (modem && port) mm_serial_port_close (port); + /* If we have a saved error from sending PIN/PUK, return that to callers */ + saved_error = mm_callback_info_get_data (info, SAVED_ERROR_TAG); + if (saved_error) { + g_clear_error (&info->error); + info->error = saved_error; + } + mm_callback_info_schedule (info); } @@ -1495,10 +1504,18 @@ send_puk_done (MMAtSerialPort *port, MMCallbackInfo *info = (MMCallbackInfo *) user_data; if (error) { - info->error = g_error_copy (error); - mm_callback_info_schedule (info); - mm_serial_port_close (MM_SERIAL_PORT (port)); - return; + if (error->domain != MM_MOBILE_ERROR) { + info->error = g_error_copy (error); + mm_callback_info_schedule (info); + mm_serial_port_close (MM_SERIAL_PORT (port)); + return; + } else { + /* Keep the real error around so we can send it back + * when we're done rechecking CPIN status. + */ + mm_callback_info_set_data (info, SAVED_ERROR_TAG, + g_error_copy (error), NULL); + } } /* Get latest PIN status */ @@ -1550,10 +1567,18 @@ send_pin_done (MMAtSerialPort *port, MMCallbackInfo *info = (MMCallbackInfo *) user_data; if (error) { - info->error = g_error_copy (error); - mm_callback_info_schedule (info); - mm_serial_port_close (MM_SERIAL_PORT (port)); - return; + if (error->domain != MM_MOBILE_ERROR) { + info->error = g_error_copy (error); + mm_callback_info_schedule (info); + mm_serial_port_close (MM_SERIAL_PORT (port)); + return; + } else { + /* Keep the real error around so we can send it back + * when we're done rechecking CPIN status. + */ + mm_callback_info_set_data (info, SAVED_ERROR_TAG, + g_error_copy (error), NULL); + } } /* Get latest PIN status */ |