sim: Add special callback for reading ICCID value
authorMarcel Holtmann <marcel@holtmann.org>
Sun, 17 Jun 2012 03:22:30 +0000 (20:22 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Sun, 17 Jun 2012 03:22:30 +0000 (20:22 -0700)
include/sim.h
src/sim.c

index 508ff24..cd2f1e3 100644 (file)
@@ -94,6 +94,9 @@ typedef void (*ofono_sim_read_cb_t)(const struct ofono_error *error,
 typedef void (*ofono_sim_write_cb_t)(const struct ofono_error *error,
                                        void *data);
 
+typedef void (*ofono_sim_iccid_cb_t)(const struct ofono_error *error,
+                                       const char *iccid, void *data);
+
 typedef void (*ofono_sim_imsi_cb_t)(const struct ofono_error *error,
                                        const char *imsi, void *data);
 
@@ -144,6 +147,8 @@ struct ofono_sim_driver {
        void (*write_file_cyclic)(struct ofono_sim *sim, int fileid,
                        int length, const unsigned char *value,
                        ofono_sim_write_cb_t cb, void *data);
+       void (*read_iccid)(struct ofono_sim *sim,
+                       ofono_sim_iccid_cb_t cb, void *data);
        void (*read_imsi)(struct ofono_sim *sim,
                        ofono_sim_imsi_cb_t cb, void *data);
        void (*query_passwd_state)(struct ofono_sim *sim,
index a9222af..f02aced 100644 (file)
--- a/src/sim.c
+++ b/src/sim.c
@@ -1965,6 +1965,25 @@ skip_efpl:
        sim->language_prefs_update = FALSE;
 }
 
+static void sim_iccid_cb(const struct ofono_error *error, const char *iccid,
+                                                       void *userdata)
+{
+       struct ofono_sim *sim = userdata;
+       const char *path = __ofono_atom_get_path(sim->atom);
+       DBusConnection *conn = ofono_dbus_get_connection();
+
+       if (error->type != OFONO_ERROR_TYPE_NO_ERROR)
+               return;
+
+       sim->iccid = g_strdup(iccid);
+
+       ofono_dbus_signal_property_changed(conn, path,
+                                               OFONO_SIM_MANAGER_INTERFACE,
+                                               "CardIdentifier",
+                                               DBUS_TYPE_STRING,
+                                               &sim->iccid);
+}
+
 static void sim_iccid_read_cb(int ok, int length, int record,
                                const unsigned char *data,
                                int record_length, void *userdata)
@@ -1974,7 +1993,13 @@ static void sim_iccid_read_cb(int ok, int length, int record,
        DBusConnection *conn = ofono_dbus_get_connection();
        char iccid[21]; /* ICCID max length is 20 + 1 for NULL */
 
-       if (!ok || length < 10)
+       if (!ok) {
+               if (sim->driver->read_iccid)
+                       sim->driver->read_iccid(sim, sim_iccid_cb, sim);
+               return;
+       }
+
+       if (length < 10)
                return;
 
        extract_bcd_number(data, length, iccid);