aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-08-22 15:05:30 +0200
committerAleksander Morgado <aleksander@lanedo.com>2012-08-23 18:56:22 +0200
commit3dfb48d75a715e593354840e3ec59eedf55c3847 (patch)
tree7e3b56a399e052144616509ad95c9a8a7f155e06
parent0c80815ea2366bbf2dbc3b2bf4aee8aa175d435e (diff)
sierra: custom SIM identifier loading
-rw-r--r--plugins/sierra/mm-sim-sierra.c113
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;
}