diff options
author | Daniel Wagner <daniel.wagner@bmw-carit.de> | 2010-05-20 12:01:48 +0200 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2010-05-19 23:41:03 -0500 |
commit | b338033307fde3f7a12b5acc26cb09588ed65a53 (patch) | |
tree | 559aaa999c72df8399d5a92e3290b3efa4093e97 /src | |
parent | 96480e44b2be962899bfbbf6f56d33dc88d43563 (diff) | |
download | ofono-b338033307fde3f7a12b5acc26cb09588ed65a53.tar.bz2 |
Read EF_ICCID property of SIM
Tested with phonesim.
Diffstat (limited to 'src')
-rw-r--r-- | src/sim.c | 37 | ||||
-rw-r--r-- | src/simutil.h | 1 |
2 files changed, 38 insertions, 0 deletions
@@ -70,6 +70,7 @@ struct sim_file_op { }; struct ofono_sim { + char *iccid; char *imsi; enum ofono_sim_phase phase; unsigned char mnc_length; @@ -288,6 +289,10 @@ static DBusMessage *sim_get_properties(DBusConnection *conn, if (!present) goto done; + if (sim->iccid) + ofono_dbus_dict_append(&dict, "CardIdentifier", + DBUS_TYPE_STRING, &sim->iccid); + if (sim->imsi) ofono_dbus_dict_append(&dict, "SubscriberIdentity", DBUS_TYPE_STRING, &sim->imsi); @@ -1292,6 +1297,29 @@ static void sim_retrieve_efli_and_efpl(struct ofono_sim *sim) sim_efpl_read_cb, sim); } +static void sim_iccid_read_cb(int ok, int length, int record, + const unsigned char *data, + int record_length, void *userdata) +{ + struct ofono_sim *sim = userdata; + const char *path = __ofono_atom_get_path(sim->atom); + DBusConnection *conn = ofono_dbus_get_connection(); + char iccid[OFONO_MAX_ICCID_LENGTH + 1]; + + if (!ok || length < 10) + return; + + extract_bcd_number(data, length, iccid); + iccid[OFONO_MAX_ICCID_LENGTH] = '\0'; + 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_efphase_read_cb(const struct ofono_error *error, const unsigned char *data, int len, void *user) { @@ -1320,6 +1348,10 @@ static void sim_determine_phase(struct ofono_sim *sim) static void sim_initialize(struct ofono_sim *sim) { + ofono_sim_read(sim, SIM_EF_ICCID_FILEID, + OFONO_SIM_FILE_STRUCTURE_TRANSPARENT, + sim_iccid_read_cb, sim); + /* Perform SIM initialization according to 3GPP 31.102 Section 5.1.1.2 * The assumption here is that if sim manager is being initialized, * then sim commands are implemented, and the sim manager is then @@ -1843,6 +1875,11 @@ static void sim_free_state(struct ofono_sim *sim) sim->simop_q = NULL; } + if (sim->iccid) { + g_free(sim->iccid); + sim->iccid = NULL; + } + if (sim->imsi) { g_free(sim->imsi); sim->imsi = NULL; diff --git a/src/simutil.h b/src/simutil.h index 45b68474..144bf12f 100644 --- a/src/simutil.h +++ b/src/simutil.h @@ -21,6 +21,7 @@ enum sim_fileid { SIM_EFPL_FILEID = 0x2f05, + SIM_EF_ICCID_FILEID = 0x2fe2, SIM_EFLI_FILEID = 0x6f05, SIM_EF_CPHS_MWIS_FILEID = 0x6f11, SIM_EF_CPHS_INFORMATION_FILEID = 0x6f16, |