diff options
author | Dan Williams <dcbw@redhat.com> | 2012-08-27 10:24:50 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2012-08-29 08:53:15 -0500 |
commit | 0b051f9c7033143c56f59267794d1cadf4bd3416 (patch) | |
tree | 31ed3d6d41bd079dde0b7dbbda822a0eaa6f8aa3 | |
parent | c21e29c50b5661308fb3b223c05f6942c06dc15d (diff) |
gsm: better handling of IMSI response
Moto EZX devices prefix the response with "+CIMI:" while most
devices do not.
-rw-r--r-- | src/mm-generic-gsm.c | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c index ac401cc5..dac005b8 100644 --- a/src/mm-generic-gsm.c +++ b/src/mm-generic-gsm.c @@ -2423,6 +2423,45 @@ get_imei (MMModemGsmCard *modem, } static void +get_imsi_done (MMAtSerialPort *port, + GString *response, + GError *error, + gpointer user_data) +{ + MMCallbackInfo *info = (MMCallbackInfo *) user_data; + const char *p; + char *str; + guint32 i = 0; + + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + if (error) + info->error = g_error_copy (error); + else { + /* strip any prefix and quotes; the IMSI is 15 digits */ + p = mm_strip_tag (response->str, "+CIMI:"); + while (p && *p && !isdigit (*p)) + p++; + str = g_strdup (p); + while (i < 15 && str && isdigit (str[i])) + i++; + if (i == 15) { + str[i] = '\0'; + mm_callback_info_set_result (info, str, g_free); + } else { + info->error = g_error_new_literal (MM_MODEM_ERROR, + MM_MODEM_ERROR_GENERAL, + "Failed to parse IMSI response"); + } + } + + mm_callback_info_schedule (info); +} + +static void get_imsi (MMModemGsmCard *modem, MMModemStringFn callback, gpointer user_data) @@ -2437,7 +2476,7 @@ get_imsi (MMModemGsmCard *modem, mm_callback_info_schedule (info); else { g_clear_error (&info->error); - mm_at_serial_port_queue_command_cached (port, "+CIMI", 3, get_string_done, info); + mm_at_serial_port_queue_command_cached (port, "+CIMI", 3, get_imsi_done, info); } } |