From: Pekka Pessi <pekka.pe...@nokia.com>

The sim atom waits for ofono_sim_ready_notify() after the callback
to query_passwd_state.

Upon call to ofono_sim_ready_notify(), SIM atom either continues
initialization or rechecks if the SIM still requires a pin code.

Based on patches by Kristen Accardi and Denis Kenzior.
---
 include/sim.h |    2 ++
 src/sim.c     |   56 ++++++++++++++++++++++++++++++++++++++++----------------
 2 files changed, 42 insertions(+), 16 deletions(-)

diff --git a/include/sim.h b/include/sim.h
index 7860e24..f4171d1 100644
--- a/include/sim.h
+++ b/include/sim.h
@@ -188,6 +188,8 @@ enum ofono_sim_state ofono_sim_get_state(struct ofono_sim 
*sim);
 
 void ofono_sim_inserted_notify(struct ofono_sim *sim, ofono_bool_t inserted);
 
+void ofono_sim_ready_notify(struct ofono_sim *sim);
+
 /* This will queue an operation to read all available records with id from the
  * SIM.  Callback cb will be called every time a record has been read, or once
  * if an error has occurred.  For transparent files, the callback will only
diff --git a/src/sim.c b/src/sim.c
index 6217a25..1878e2c 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -45,6 +45,8 @@
 #include "simfs.h"
 #include "stkutil.h"
 
+#define SIM_FLAG_WAIT_FOR_READY (1 << 0)
+
 static GSList *g_drivers = NULL;
 
 static void sim_own_numbers_update(struct ofono_sim *sim);
@@ -74,6 +76,7 @@ struct ofono_sim {
        unsigned char efsst_length;
        gboolean fixed_dialing;
        gboolean barred_dialing;
+       guint flags;
 
        char *imsi;
 
@@ -1543,6 +1546,8 @@ static void sim_efphase_read_cb(int ok, int length, int 
record,
 
 static void sim_initialize_after_pin(struct ofono_sim *sim)
 {
+       sim->flags &= SIM_FLAG_WAIT_FOR_READY;
+
        ofono_sim_read(sim, SIM_EFPHASE_FILEID,
                        OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
                        sim_efphase_read_cb, sim);
@@ -1569,32 +1574,30 @@ static void sim_pin_query_cb(const struct ofono_error 
*error,
        const char *path = __ofono_atom_get_path(sim->atom);
        const char *pin_name;
 
+       sim->flags |= SIM_FLAG_WAIT_FOR_READY;
+
        if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
                ofono_error("Querying PIN authentication state failed");
-
-               goto checkdone;
+               return;
        }
 
-       if (sim->pin_type != pin_type) {
-               sim->pin_type = pin_type;
-               pin_name = sim_passwd_name(pin_type);
+       if (sim->pin_type == pin_type)
+               return;
 
-               if (pin_type != OFONO_SIM_PASSWORD_NONE &&
-                               password_is_pin(pin_type) == FALSE)
-                       pin_type = puk2pin(pin_type);
+       sim->pin_type = pin_type;
+       pin_name = sim_passwd_name(pin_type);
 
-               if (pin_type != OFONO_SIM_PASSWORD_INVALID)
-                       sim->locked_pins[pin_type] = TRUE;
+       if (pin_type != OFONO_SIM_PASSWORD_NONE &&
+                       password_is_pin(pin_type) == FALSE)
+               pin_type = puk2pin(pin_type);
 
-               ofono_dbus_signal_property_changed(conn, path,
+       if (pin_type != OFONO_SIM_PASSWORD_INVALID)
+               sim->locked_pins[pin_type] = TRUE;
+
+       ofono_dbus_signal_property_changed(conn, path,
                                                OFONO_SIM_MANAGER_INTERFACE,
                                                "PinRequired", DBUS_TYPE_STRING,
                                                &pin_name);
-       }
-
-checkdone:
-       if (pin_type == OFONO_SIM_PASSWORD_NONE)
-               sim_initialize_after_pin(sim);
 }
 
 static void sim_pin_check(struct ofono_sim *sim)
@@ -1607,6 +1610,25 @@ static void sim_pin_check(struct ofono_sim *sim)
        sim->driver->query_passwd_state(sim, sim_pin_query_cb, sim);
 }
 
+void ofono_sim_ready_notify(struct ofono_sim *sim)
+{
+       DBG("");
+
+       if (sim == NULL)
+               return;
+
+       if (sim->state != OFONO_SIM_STATE_INSERTED)
+               return;
+
+       if (!(sim->flags & SIM_FLAG_WAIT_FOR_READY))
+               return;
+
+       if (sim->pin_type == OFONO_SIM_PASSWORD_NONE)
+               sim_initialize_after_pin(sim);
+       else
+               sim_pin_check(sim);
+}
+
 static void sim_efli_read_cb(int ok, int length, int record,
                                const unsigned char *data,
                                int record_length, void *userdata)
@@ -2029,6 +2051,8 @@ static void sim_free_state(struct ofono_sim *sim)
 
        sim->fixed_dialing = FALSE;
        sim->barred_dialing = FALSE;
+
+       sim->flags = 0;
 }
 
 void ofono_sim_inserted_notify(struct ofono_sim *sim, ofono_bool_t inserted)
-- 
1.7.1

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

Reply via email to