aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2012-08-27 10:24:50 -0500
committerDan Williams <dcbw@redhat.com>2012-08-29 08:53:15 -0500
commit0b051f9c7033143c56f59267794d1cadf4bd3416 (patch)
tree31ed3d6d41bd079dde0b7dbbda822a0eaa6f8aa3
parentc21e29c50b5661308fb3b223c05f6942c06dc15d (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.c41
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);
}
}