summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/sim.h5
-rw-r--r--src/sim.c27
2 files changed, 31 insertions, 1 deletions
diff --git a/include/sim.h b/include/sim.h
index 508ff249..cd2f1e38 100644
--- a/include/sim.h
+++ b/include/sim.h
@@ -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,
diff --git a/src/sim.c b/src/sim.c
index a9222aff..f02acedc 100644
--- 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);