diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-22 15:05:30 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-23 18:56:22 +0200 |
commit | 3dfb48d75a715e593354840e3ec59eedf55c3847 (patch) | |
tree | 7e3b56a399e052144616509ad95c9a8a7f155e06 | |
parent | 0c80815ea2366bbf2dbc3b2bf4aee8aa175d435e (diff) |
sierra: custom SIM identifier loading
-rw-r--r-- | plugins/sierra/mm-sim-sierra.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/plugins/sierra/mm-sim-sierra.c b/plugins/sierra/mm-sim-sierra.c index c649a7b7..3c852a9d 100644 --- a/plugins/sierra/mm-sim-sierra.c +++ b/plugins/sierra/mm-sim-sierra.c @@ -24,12 +24,121 @@ #include <ModemManager.h> #include <libmm-common.h> +#include "mm-log.h" +#include "mm-modem-helpers.h" +#include "mm-base-modem-at.h" #include "mm-sim-sierra.h" G_DEFINE_TYPE (MMSimSierra, mm_sim_sierra, MM_TYPE_SIM); /*****************************************************************************/ +/* SIM identifier loading */ + +static gchar * +load_sim_identifier_finish (MMSim *self, + GAsyncResult *res, + GError **error) +{ + gchar *iccid; + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) + return NULL; + + iccid = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res)); + mm_dbg ("loaded SIM identifier: %s", iccid); + return g_strdup (iccid); +} + +static void +iccid_read_ready (MMBaseModem *modem, + GAsyncResult *res, + GSimpleAsyncResult *simple) +{ + GError *error = NULL; + const gchar *response; + const gchar *p; + gchar buf[21]; + gint i; + + response = mm_base_modem_at_command_finish (modem, res, &error); + if (!response) { + g_simple_async_result_take_error (simple, error); + g_simple_async_result_complete (simple); + g_object_unref (simple); + return; + } + + p = mm_strip_tag (response, "!ICCID:"); + if (!p) { + g_simple_async_result_set_error (simple, + MM_CORE_ERROR, + MM_CORE_ERROR_FAILED, + "Failed to parse !ICCID response: '%s'", + response); + g_simple_async_result_complete (simple); + g_object_unref (simple); + return; + } + + memset (buf, 0, sizeof (buf)); + for (i = 0; i < 20; i++) { + if (!isdigit (p[i]) && (p[i] != 'F') && (p[i] == 'f')) { + g_simple_async_result_set_error (simple, + MM_CORE_ERROR, + MM_CORE_ERROR_FAILED, + "CRSM ICCID response contained invalid character '%c'", + p[i]); + g_simple_async_result_complete (simple); + g_object_unref (simple); + return; + } + + if (p[i] == 'F' || p[i] == 'f') { + buf[i] = 0; + break; + } + buf[i] = p[i]; + } + + if (i != 19 && i != 20) + g_simple_async_result_set_error (simple, + MM_CORE_ERROR, + MM_CORE_ERROR_FAILED, + "Invalid +CRSM ICCID response size (was %d, expected 19 or 20)", + i); + else + g_simple_async_result_set_op_res_gpointer (simple, buf, NULL); + g_simple_async_result_complete (simple); + g_object_unref (simple); +} + +static void +load_sim_identifier (MMSim *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + MMBaseModem *modem = NULL; + + g_object_get (self, + MM_SIM_MODEM, &modem, + NULL); + + mm_dbg ("loading (Sierra) SIM identifier..."); + mm_base_modem_at_command ( + MM_BASE_MODEM (modem), + "!ICCID?", + 3, + FALSE, + (GAsyncReadyCallback)iccid_read_ready, + g_simple_async_result_new (G_OBJECT (self), + callback, + user_data, + load_sim_identifier)); + g_object_unref (modem); +} + +/*****************************************************************************/ MMSim * mm_sim_sierra_new_finish (GAsyncResult *res, @@ -74,4 +183,8 @@ mm_sim_sierra_init (MMSimSierra *self) static void mm_sim_sierra_class_init (MMSimSierraClass *klass) { + MMSimClass *sim_class = MM_SIM_CLASS (klass); + + sim_class->load_sim_identifier = load_sim_identifier; + sim_class->load_sim_identifier_finish = load_sim_identifier_finish; } |