Add Barred Dialing Support

2010-10-25 Thread Jeevaka Badrappan


Hi,

 This patch adds the barred dialing support. If Barred Dialing service is
enabled, then oFono will go into emergency mode. Patch has been tested with the 
phonesim. 

Regards,
jeevaka
___
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono


[PATCH 2/4] sim: add barred dialing support

2010-10-25 Thread Jeevaka Badrappan
---
 src/sim.c |   87 +++-
 1 files changed, 79 insertions(+), 8 deletions(-)

diff --git a/src/sim.c b/src/sim.c
index 699ebe9..c631e31 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);
+