summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/mm-modem-huawei-gsm.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/plugins/mm-modem-huawei-gsm.c b/plugins/mm-modem-huawei-gsm.c
index b7859443f..919720021 100644
--- a/plugins/mm-modem-huawei-gsm.c
+++ b/plugins/mm-modem-huawei-gsm.c
@@ -32,6 +32,7 @@
#include "mm-serial-parsers.h"
#include "mm-log.h"
#include "mm-utils.h"
+#include "mm-modem-helpers.h"
static void modem_init (MMModem *modem_class);
static void modem_gsm_network_init (MMModemGsmNetwork *gsm_network_class);
@@ -738,6 +739,93 @@ do_enable_power_up_done (MMGenericGsm *gsm,
/*****************************************************************************/
static void
+parent_get_iccid_cb (MMModem *modem,
+ const char *response,
+ GError *error,
+ gpointer user_data)
+{
+ MMCallbackInfo *info = user_data;
+
+ if (error)
+ info->error = g_error_copy (error);
+ else
+ mm_callback_info_set_result (info, g_strdup (response), g_free);
+
+ mm_callback_info_schedule (info);
+}
+
+static void
+get_sim_iccid_done (MMAtSerialPort *port,
+ GString *response,
+ GError *error,
+ gpointer user_data)
+{
+ MMCallbackInfo *info = user_data;
+ const char *p;
+ char *parsed;
+ GError *local = NULL;
+
+ /* If the modem has already been removed, return without
+ * scheduling callback */
+ if (mm_callback_info_check_modem_removed (info))
+ return;
+
+ if (error) {
+ /* Fall back to parent AT+CRSM */
+ mm_serial_port_close (MM_SERIAL_PORT (port));
+ MM_GENERIC_GSM_CLASS (mm_modem_huawei_gsm_parent_class)->get_sim_iccid (MM_GENERIC_GSM (info->modem), parent_get_iccid_cb, info);
+ return;
+ }
+
+ p = mm_strip_tag (response->str, "^ICCID:");
+ if (!p) {
+ info->error = g_error_new_literal (MM_MODEM_ERROR,
+ MM_MODEM_ERROR_GENERAL,
+ "Failed to parse !ICCID response");
+ goto done;
+ }
+
+ parsed = mm_gsm_parse_iccid (p, TRUE, &local);
+ if (parsed)
+ mm_callback_info_set_result (info, g_strdup (parsed), g_free);
+ else {
+ g_assert (local);
+ info->error = local;
+ }
+
+done:
+ mm_serial_port_close (MM_SERIAL_PORT (port));
+ mm_callback_info_schedule (info);
+}
+
+static void
+get_sim_iccid (MMGenericGsm *modem,
+ MMModemStringFn callback,
+ gpointer callback_data)
+{
+ MMAtSerialPort *port;
+ MMCallbackInfo *info;
+ GError *error = NULL;
+
+ port = mm_generic_gsm_get_best_at_port (modem, &error);
+ if (!port)
+ goto error;
+
+ if (!mm_serial_port_open (MM_SERIAL_PORT (port), &error))
+ goto error;
+
+ info = mm_callback_info_string_new (MM_MODEM (modem), callback, callback_data);
+ mm_at_serial_port_queue_command (port, "^ICCID?", 3, get_sim_iccid_done, info);
+ return;
+
+error:
+ callback (MM_MODEM (modem), NULL, error, callback_data);
+ g_clear_error (&error);
+}
+
+/*****************************************************************************/
+
+static void
disable_unsolicited_done (MMAtSerialPort *port,
GString *response,
GError *error,
@@ -928,4 +1016,5 @@ mm_modem_huawei_gsm_class_init (MMModemHuaweiGsmClass *klass)
gsm_class->get_allowed_mode = get_allowed_mode;
gsm_class->get_access_technology = get_access_technology;
gsm_class->do_enable_power_up_done = do_enable_power_up_done;
+ gsm_class->get_sim_iccid = get_sim_iccid;
}