--- Hi,
Here is the fixed patch for enabling the showing of pin2 blocked situation in SIM API when lock state changes after using call meter API. Br, Jussi include/sim.h | 2 ++ src/call-meter.c | 19 +++++++++++++++++++ src/sim.c | 46 +++++++++++++++++++++++++++++++--------------- 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/include/sim.h b/include/sim.h index 412ae44..ab3a57f 100644 --- a/include/sim.h +++ b/include/sim.h @@ -227,6 +227,8 @@ unsigned int ofono_sim_add_file_watch(struct ofono_sim_context *context, void ofono_sim_remove_file_watch(struct ofono_sim_context *context, unsigned int id); +void __ofono_sim_recheck_pin(struct ofono_sim *sim); + #ifdef __cplusplus } #endif diff --git a/src/call-meter.c b/src/call-meter.c index 0789935..c6a85aa 100644 --- a/src/call-meter.c +++ b/src/call-meter.c @@ -332,6 +332,22 @@ static void set_acm_max_query_callback(const struct ofono_error *error, set_acm_max(cm, value); } +static void check_pin2_state(struct ofono_call_meter *cm) +{ + struct ofono_atom *sim_atom; + struct ofono_sim *sim = NULL; + + sim_atom = __ofono_modem_find_atom( + __ofono_atom_get_modem(cm->atom), + OFONO_ATOM_TYPE_SIM); + + if (sim_atom == NULL) + return; + + sim = __ofono_atom_get_data(sim_atom); + __ofono_sim_recheck_pin(sim); +} + static void set_acm_max_callback(const struct ofono_error *error, void *data) { struct ofono_call_meter *cm = data; @@ -340,6 +356,7 @@ static void set_acm_max_callback(const struct ofono_error *error, void *data) DBG("Setting acm_max failed"); __ofono_dbus_pending_reply(&cm->pending, __ofono_error_failed(cm->pending)); + check_pin2_state(cm); return; } @@ -401,6 +418,7 @@ static void set_puct_callback(const struct ofono_error *error, void *data) DBG("setting puct failed"); __ofono_dbus_pending_reply(&cm->pending, __ofono_error_failed(cm->pending)); + check_pin2_state(cm); return; } @@ -598,6 +616,7 @@ static void acm_reset_callback(const struct ofono_error *error, void *data) DBG("reseting acm failed"); __ofono_dbus_pending_reply(&cm->pending, __ofono_error_failed(cm->pending)); + check_pin2_state(cm); return; } diff --git a/src/sim.c b/src/sim.c index c39269d..8eafa1f 100644 --- a/src/sim.c +++ b/src/sim.c @@ -49,7 +49,6 @@ static GSList *g_drivers = NULL; static void sim_own_numbers_update(struct ofono_sim *sim); -static void sim_pin_check(struct ofono_sim *sim); struct ofono_sim { /* Contents of the SIM file system, in rough initialization order */ @@ -624,7 +623,7 @@ static void sim_unlock_cb(const struct ofono_error *error, void *data) DBusMessage *reply = __ofono_error_failed(sim->pending); __ofono_dbus_pending_reply(&sim->pending, reply); - sim_pin_check(sim); + __ofono_sim_recheck_pin(sim); return; } @@ -640,7 +639,7 @@ static void sim_lock_cb(const struct ofono_error *error, void *data) DBusMessage *reply = __ofono_error_failed(sim->pending); __ofono_dbus_pending_reply(&sim->pending, reply); - sim_pin_check(sim); + __ofono_sim_recheck_pin(sim); return; } @@ -711,7 +710,7 @@ static void sim_change_pin_cb(const struct ofono_error *error, void *data) __ofono_dbus_pending_reply(&sim->pending, __ofono_error_failed(sim->pending)); - sim_pin_check(sim); + __ofono_sim_recheck_pin(sim); return; } @@ -776,7 +775,7 @@ static void sim_enter_pin_cb(const struct ofono_error *error, void *data) __ofono_dbus_pending_reply(&sim->pending, reply); - sim_pin_check(sim); + __ofono_sim_recheck_pin(sim); } static DBusMessage *sim_enter_pin(DBusConnection *conn, DBusMessage *msg, @@ -1846,7 +1845,7 @@ skip_efpl: DBUS_TYPE_STRING, &sim->language_prefs); - sim_pin_check(sim); + __ofono_sim_recheck_pin(sim); } static void sim_iccid_read_cb(int ok, int length, int record, @@ -2231,23 +2230,40 @@ static void sim_pin_query_cb(const struct ofono_error *error, &pin_name); } - if (pin_type != OFONO_SIM_PASSWORD_NONE && - sim->state == OFONO_SIM_STATE_READY) { - /* Force the sim state out of READY */ - sim_free_main_state(sim); + switch (pin_type) { + case OFONO_SIM_PASSWORD_NONE: + case OFONO_SIM_PASSWORD_SIM_PIN2: + case OFONO_SIM_PASSWORD_SIM_PUK2: + break; + default: + if (sim->state == OFONO_SIM_STATE_READY) { + /* Force the sim state out of READY */ + sim_free_main_state(sim); - sim->state = OFONO_SIM_STATE_INSERTED; - __ofono_modem_sim_reset(__ofono_atom_get_modem(sim->atom)); + sim->state = OFONO_SIM_STATE_INSERTED; + __ofono_modem_sim_reset( + __ofono_atom_get_modem(sim->atom)); + } + break; } sim_pin_retries_check(sim); checkdone: - if (pin_type == OFONO_SIM_PASSWORD_NONE) + switch (pin_type) { + case OFONO_SIM_PASSWORD_SIM_PIN2: + case OFONO_SIM_PASSWORD_SIM_PUK2: + if (sim->state == OFONO_SIM_STATE_READY) + break; + case OFONO_SIM_PASSWORD_NONE: sim_initialize_after_pin(sim); + break; + default: + break; + } } -static void sim_pin_check(struct ofono_sim *sim) +void __ofono_sim_recheck_pin(struct ofono_sim *sim) { if (sim->driver->query_passwd_state == NULL) { sim_initialize_after_pin(sim); @@ -2579,6 +2595,6 @@ void __ofono_sim_refresh(struct ofono_sim *sim, GSList *file_list, * Start initialization procedure from after EFiccid, * EFli and EFpl are retrieved. */ - sim_pin_check(sim); + __ofono_sim_recheck_pin(sim); } } -- 1.7.1 _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono