Read EF_ICCID property of SIM
Hi Daniel,
include/types.h extern "C" { · line 40
Quoted 4 lines
Tested with phonesim.
include/types.h +2
-0+#define OFONO_MAX_ICCID_LENGTH 20 +
For future reference, if a define is not used or planned to be used by plugins, there's no need to declare it in the public API. I fixed it for you :)
Patch has been applied.
Thanks,
-Denis
PATCH 1/1 Read EF_ICCID property of SIM
Tested with phonesim.
---
v0: initial patch
v1: use ofono_read_sim
doc/sim-api.txt | 5 +++++ include/types.h | 2 ++ src/sim.c | 37 +++++++++++++++++++++++++++++++++++++ src/simutil.h | 1 + 4 files changed, 45 insertions(+), 0 deletions(-)
doc/sim-api.txt +5 -0
@@ -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.
include/types.h +2 -0
@@ -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
src/sim.c +37 -0
@@ -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 ;
src/simutil.h +1 -0
@@ -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 ,
Signature · 1 line
1.6.6.1
Hi Denis,
Quoted 9 lines · Denis Kenzior
Hi Daniel,
include/types.h extern "C" { · line 40
Quoted 4 lines
Tested with phonesim.
include/types.h +2
-0+#define OFONO_MAX_ICCID_LENGTH 20 +For future reference, if a define is not used or planned to be used by plugins, there's no need to declare it in the public API. I fixed it for you :)
Okay, good to know. Thanks!
cheers,
daniel
2010/5/20 Daniel Wagner <[email protected]>:
Quoted 2 lines
Tested with phonesim.
+extract_bcd_number(data, length, iccid);
The iccid can be opaque data. It would be safer to extract it as a real hex number (0-9a-f) and then perhaps strip trailing f's.
Signature · 1 line
Pekka.Pessi mail at nokia.com