diff options
author | Dan Williams <dcbw@redhat.com> | 2012-08-27 10:24:50 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2012-08-27 10:24:50 -0500 |
commit | 9466c0ae2209008b56567a6f87b4fcbd8d6f4063 (patch) | |
tree | ceeeb474757241629d9c4dee4795ccaa1aee8563 | |
parent | 164da2f6adf18406b6669c58a0cb26a94b5da5bf (diff) |
gsm: better handling of IMSI response
Moto EZX devices prefix the response with +CIMI:, plus some Option
devices suffix it with ",XXXXX" where X is a firmware version or
something.
-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 9172cfaf..567c9415 100644 --- a/src/mm-generic-gsm.c +++ b/src/mm-generic-gsm.c @@ -2545,6 +2545,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) @@ -2559,7 +2598,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); } } |