If FD is enabled, halt SIM initialization procedure.
New property (FixedDialing) is added. If FD is enabled,
this has been signalled via DBUS.
---
 src/sim.c |   81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 72 insertions(+), 9 deletions(-)

diff --git a/src/sim.c b/src/sim.c
index f0633bb..4836f55 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -71,6 +71,7 @@ struct ofono_sim {
        unsigned char efest_length;
        unsigned char *efsst;
        unsigned char efsst_length;
+       gboolean fixed_dialing;
 
        char *imsi;
 
@@ -307,6 +308,9 @@ static DBusMessage *sim_get_properties(DBusConnection *conn,
                ofono_dbus_dict_append(&dict, "SubscriberIdentity",
                                        DBUS_TYPE_STRING, &sim->imsi);
 
+       ofono_dbus_dict_append(&dict, "FixedDialing", DBUS_TYPE_BOOLEAN,
+                               &sim->fixed_dialing);
+
        if (sim->mnc_length) {
                char mcc[OFONO_MAX_MCC_LENGTH + 1];
                char mnc[OFONO_MAX_MNC_LENGTH + 1];
@@ -1061,12 +1065,41 @@ static void sim_retrieve_imsi(struct ofono_sim *sim)
        sim->driver->read_imsi(sim, sim_imsi_cb, sim);
 }
 
+static void sim_info_read_cb(int ok, int length, int record,
+                                       const unsigned char *file_status,
+                                       int record_length, void *userdata)
+{
+       struct ofono_sim *sim = userdata;
+       DBusConnection *conn = ofono_dbus_get_connection();
+       const char *path = __ofono_atom_get_path(sim->atom);
+
+       if (!ok)
+               goto out;
+
+       if (*file_status != SIM_FILE_STATUS_NOT_INVALID) {
+
+               sim->fixed_dialing = TRUE;
+
+               ofono_dbus_signal_property_changed(conn, path,
+                                       OFONO_SIM_MANAGER_INTERFACE,
+                                       "FixedDialing",
+                                       DBUS_TYPE_BOOLEAN,
+                                       &sim->fixed_dialing);
+               return;
+       }
+
+out:
+       sim_retrieve_imsi(sim);
+}
+
 static void sim_efsst_read_cb(int ok, int length, int record,
                                const unsigned char *data,
                                int record_length, void *userdata)
 {
        struct ofono_sim *sim = userdata;
 
+       sim->fixed_dialing = FALSE;
+
        if (!ok)
                goto out;
 
@@ -1078,6 +1111,21 @@ static void sim_efsst_read_cb(int ok, int length, int 
record,
        sim->efsst = g_memdup(data, length);
        sim->efsst_length = length;
 
+       /*
+        * Check if Fixed Dialing is enabled in the SIM-card
+        * (TS 11.11/TS 51.011, Section 9.3: FDN capability request).
+        * If FDN is activated and ADN is invalidated,
+        * don't continue initialization routine.
+        */
+       if (sim_sst_is_active(sim->efsst, sim->efsst_length,
+                               SIM_SST_SERVICE_FDN)) {
+
+               ofono_sim_read_info(sim, SIM_EFADN_FILEID,
+                                       OFONO_SIM_FILE_STRUCTURE_FIXED,
+                                       sim_info_read_cb, sim);
+               return;
+       }
+
 out:
        sim_retrieve_imsi(sim);
 }
@@ -1087,6 +1135,8 @@ static void sim_efest_read_cb(int ok, int length, int 
record,
                                int record_length, void *userdata)
 {
        struct ofono_sim *sim = userdata;
+       DBusConnection *conn = ofono_dbus_get_connection();
+       const char *path = __ofono_atom_get_path(sim->atom);
 
        if (!ok)
                goto out;
@@ -1099,6 +1149,24 @@ static void sim_efest_read_cb(int ok, int length, int 
record,
        sim->efest = g_memdup(data, length);
        sim->efest_length = length;
 
+       /*
+        * Check if Fixed Dialing is enabled in the USIM-card
+        * (TS 31.102, Section 5.3.2: FDN capability request).
+        * If FDN is activated, don't continue initialization routine.
+        */
+       if (sim_est_is_active(sim->efest, sim->efest_length,
+                               SIM_EST_SERVICE_FDN)) {
+
+               sim->fixed_dialing = TRUE;
+
+               ofono_dbus_signal_property_changed(conn, path,
+                                               OFONO_SIM_MANAGER_INTERFACE,
+                                               "FixedDialing",
+                                               DBUS_TYPE_BOOLEAN,
+                                               &sim->fixed_dialing);
+               return;
+       }
+
 out:
        sim_retrieve_imsi(sim);
 }
@@ -1109,6 +1177,8 @@ static void sim_efust_read_cb(int ok, int length, int 
record,
 {
        struct ofono_sim *sim = userdata;
 
+       sim->fixed_dialing = FALSE;
+
        if (!ok)
                goto out;
 
@@ -1183,15 +1253,6 @@ static void sim_efphase_read_cb(int ok, int length, int 
record,
                sim->phase = data[0];
 }
 
-static void sim_info_read_cb(int ok, int length, int record,
-                                       const unsigned char *file_status,
-                                       int record_length, void *userdata)
-{
-       DBG("OK: %d, length: %d, record: %d, \
-               file_status: %x, record_length: %d",
-               ok, length, record, file_status[0], record_length);
-}
-
 static void sim_initialize_after_pin(struct ofono_sim *sim)
 {
        ofono_sim_read(sim, SIM_EFPHASE_FILEID,
@@ -1691,6 +1752,8 @@ static void sim_free_state(struct ofono_sim *sim)
                sim->efimg = NULL;
                sim->efimg_length = 0;
        }
+
+       sim->fixed_dialing = FALSE;
 }
 
 void ofono_sim_inserted_notify(struct ofono_sim *sim, ofono_bool_t inserted)
-- 
1.6.3.3


_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to