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);