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-27 10:24:50 -0500
commit9466c0ae2209008b56567a6f87b4fcbd8d6f4063 (patch)
treeceeeb474757241629d9c4dee4795ccaa1aee8563
parent164da2f6adf18406b6669c58a0cb26a94b5da5bf (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.c41
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);
}
}