From b338033307fde3f7a12b5acc26cb09588ed65a53 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 20 May 2010 12:01:48 +0200 Subject: [PATCH] Read EF_ICCID property of SIM Tested with phonesim. --- doc/sim-api.txt | 5 +++++ include/types.h | 2 ++ src/sim.c | 37 +++++++++++++++++++++++++++++++++++++ src/simutil.h | 1 + 4 files changed, 45 insertions(+) diff --git a/doc/sim-api.txt b/doc/sim-api.txt index fd02396a..74da31f6 100644 --- a/doc/sim-api.txt +++ b/doc/sim-api.txt @@ -115,3 +115,8 @@ Properties string SubscriberIdentity [readonly, optional] The list contains elements of the same format as the PinRequired property. + + string CardIdentifier [readonly] + + Contains the Intergrated Circuit Card Identifer (ICCID) + and is read directly from the SIM. diff --git a/include/types.h b/include/types.h index 2b154f00..adaf319b 100644 --- a/include/types.h +++ b/include/types.h @@ -36,6 +36,8 @@ extern "C" { typedef int ofono_bool_t; +#define OFONO_MAX_ICCID_LENGTH 20 + /* MCC is always three digits. MNC is either two or three digits */ #define OFONO_MAX_MCC_LENGTH 3 #define OFONO_MAX_MNC_LENGTH 3 diff --git a/src/sim.c b/src/sim.c index bf28f1e5..f37ffb3a 100644 --- a/src/sim.c +++ b/src/sim.c @@ -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,