From 233bd42820db28a24f2416bfbf8d4e3b7ee3bd88 Mon Sep 17 00:00:00 2001 From: Jeevaka Badrappan Date: Mon, 25 Oct 2010 04:34:15 -0700 Subject: [PATCH] sim: add barred dialing support --- src/sim.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 79 insertions(+), 8 deletions(-) diff --git a/src/sim.c b/src/sim.c index 699ebe99..c631e317 100644 --- a/src/sim.c +++ b/src/sim.c @@ -73,6 +73,7 @@ struct ofono_sim { unsigned char *efsst; unsigned char efsst_length; gboolean fixed_dialing; + gboolean barred_dialing; char *imsi; @@ -288,6 +289,7 @@ static DBusMessage *sim_get_properties(DBusConnection *conn, const char *pin_name; dbus_bool_t present = sim->state != OFONO_SIM_STATE_NOT_PRESENT; dbus_bool_t fdn; + dbus_bool_t bdn; reply = dbus_message_new_method_return(msg); if (!reply) @@ -315,6 +317,9 @@ static DBusMessage *sim_get_properties(DBusConnection *conn, fdn = sim->fixed_dialing; ofono_dbus_dict_append(&dict, "FixedDialing", DBUS_TYPE_BOOLEAN, &fdn); + bdn = sim->barred_dialing; + ofono_dbus_dict_append(&dict, "BarredDialing", DBUS_TYPE_BOOLEAN, &bdn); + if (sim->mnc_length && sim->imsi) { char mcc[OFONO_MAX_MCC_LENGTH + 1]; char mnc[OFONO_MAX_MNC_LENGTH + 1]; @@ -1261,6 +1266,57 @@ static void sim_fdn_enabled(struct ofono_sim *sim) DBUS_TYPE_BOOLEAN, &val); } +static void sim_bdn_enabled(struct ofono_sim *sim) +{ + DBusConnection *conn = ofono_dbus_get_connection(); + const char *path = __ofono_atom_get_path(sim->atom); + dbus_bool_t val; + + sim->barred_dialing = TRUE; + + val = sim->barred_dialing; + ofono_dbus_signal_property_changed(conn, path, + OFONO_SIM_MANAGER_INTERFACE, + "BarredDialing", + DBUS_TYPE_BOOLEAN, &val); +} + +static void sim_efbdn_info_read_cb(int ok, unsigned char file_status, + int total_length, int record_length, + void *userdata) +{ + struct ofono_sim *sim = userdata; + + if (!ok) + goto out; + + if (file_status == SIM_FILE_STATUS_VALID) + sim_bdn_enabled(sim); + +out: + if (sim->fixed_dialing != TRUE && + sim->barred_dialing != TRUE) + sim_retrieve_imsi(sim); +} + +static gboolean check_bdn_status(struct ofono_sim *sim) +{ + /* + * Check the status of Barred Dialing in the SIM-card + * (TS 11.11/TS 51.011, Section 11.5.1: BDN capability request). + * If BDN is allocated, activated in EFsst and EFbdn is validated, + * halt the SIM initialization. + */ + if (sim_sst_is_active(sim->efsst, sim->efsst_length, + SIM_SST_SERVICE_BDN)) { + sim_fs_read_info(sim->simfs, SIM_EFBDN_FILEID, + OFONO_SIM_FILE_STRUCTURE_FIXED, + sim_efbdn_info_read_cb, sim); + return TRUE; + } + return FALSE; +} + static void sim_efadn_info_read_cb(int ok, unsigned char file_status, int total_length, int record_length, void *userdata) @@ -1270,13 +1326,15 @@ static void sim_efadn_info_read_cb(int ok, unsigned char file_status, if (!ok) goto out; - if (file_status != SIM_FILE_STATUS_VALID) { + if (file_status != SIM_FILE_STATUS_VALID) sim_fdn_enabled(sim); - return; - } out: - sim_retrieve_imsi(sim); + if (check_bdn_status(sim) != TRUE) { + if (sim->fixed_dialing != TRUE && + sim->barred_dialing != TRUE) + sim_retrieve_imsi(sim); + } } static void sim_efsst_read_cb(int ok, int length, int record, @@ -1310,6 +1368,9 @@ static void sim_efsst_read_cb(int ok, int length, int record, return; } + if (check_bdn_status(sim) == TRUE) + return; + out: sim_retrieve_imsi(sim); } @@ -1337,13 +1398,22 @@ static void sim_efest_read_cb(int ok, int length, int record, * If FDN is activated, don't continue initialization routine. */ if (sim_est_is_active(sim->efest, sim->efest_length, - SIM_EST_SERVICE_FDN)) { + SIM_EST_SERVICE_FDN)) sim_fdn_enabled(sim); - return; - } + + /* + * Check the status of Barred Dialing in the USIM-card + * (TS 31.102, Section 5.3.2: BDN capability request). + * If BDN service is enabled, halt the USIM initialization. + */ + if (sim_est_is_active(sim->efest, sim->efest_length, + SIM_EST_SERVICE_BDN)) + sim_bdn_enabled(sim); out: - sim_retrieve_imsi(sim); + if (sim->fixed_dialing != TRUE && + sim->barred_dialing != TRUE) + sim_retrieve_imsi(sim); } static void sim_efust_read_cb(int ok, int length, int record, @@ -1922,6 +1992,7 @@ static void sim_free_state(struct ofono_sim *sim) sim->iidf_image = NULL; sim->fixed_dialing = FALSE; + sim->barred_dialing = FALSE; } void ofono_sim_inserted_notify(struct ofono_sim *sim, ofono_bool_t inserted)