diff options
Diffstat (limited to 'src/voicecall.c')
-rw-r--r-- | src/voicecall.c | 61 |
1 files changed, 26 insertions, 35 deletions
diff --git a/src/voicecall.c b/src/voicecall.c index 1af71671..b2bb41f5 100644 --- a/src/voicecall.c +++ b/src/voicecall.c @@ -53,6 +53,7 @@ struct ofono_voicecall { DBusMessage *pending; gint emit_calls_source; gint emit_multi_source; + struct ofono_sim *sim; unsigned int sim_watch; unsigned int sim_state_watch; const struct ofono_voicecall_driver *driver; @@ -1785,10 +1786,6 @@ static void voicecall_unregister(struct ofono_atom *atom) static void voicecall_remove(struct ofono_atom *atom) { struct ofono_voicecall *vc = __ofono_atom_get_data(atom); - struct ofono_modem *modem = __ofono_atom_get_modem(vc->atom); - struct ofono_atom *sim_atom = - __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SIM); - struct ofono_sim *sim = NULL; DBG("atom: %p", atom); @@ -1810,12 +1807,10 @@ static void voicecall_remove(struct ofono_atom *atom) vc->new_en_list = NULL; } - if (sim_atom && __ofono_atom_get_registered(sim_atom)) - sim = __ofono_atom_get_data(sim_atom); - - if (sim && vc->sim_state_watch) { - ofono_sim_remove_state_watch(sim, vc->sim_state_watch); + if (vc->sim_state_watch) { + ofono_sim_remove_state_watch(vc->sim, vc->sim_state_watch); vc->sim_state_watch = 0; + vc->sim = NULL; } g_free(vc); @@ -1860,40 +1855,34 @@ static void sim_state_watch(void *user, enum ofono_sim_state new_state) { struct ofono_voicecall *vc = user; - if (new_state == OFONO_SIM_STATE_INSERTED) { - struct ofono_modem *modem = - __ofono_atom_get_modem(vc->atom); - struct ofono_atom *sim_atom = - __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SIM); - struct ofono_sim *sim = - __ofono_atom_get_data(sim_atom); - + switch (new_state) { + case OFONO_SIM_STATE_INSERTED: /* Try both formats, only one or none will work */ - ofono_sim_read(sim, SIM_EFECC_FILEID, + ofono_sim_read(vc->sim, SIM_EFECC_FILEID, OFONO_SIM_FILE_STRUCTURE_TRANSPARENT, ecc_g2_read_cb, vc); - ofono_sim_read(sim, SIM_EFECC_FILEID, + ofono_sim_read(vc->sim, SIM_EFECC_FILEID, OFONO_SIM_FILE_STRUCTURE_FIXED, ecc_g3_read_cb, vc); - - return; - } - - if (new_state != OFONO_SIM_STATE_NOT_PRESENT) - return; - - if (vc->call_list) { + break; + case OFONO_SIM_STATE_NOT_PRESENT: /* TODO: Must release all non-emergency calls */ - } - if (vc->new_en_list) { - g_slist_foreach(vc->new_en_list, (GFunc) g_free, NULL); - g_slist_free(vc->new_en_list); - vc->new_en_list = NULL; - } + /* + * Free the currently being read EN list, just in case the + * SIM is removed when we're still reading them + */ + if (vc->new_en_list) { + g_slist_foreach(vc->new_en_list, (GFunc) g_free, NULL); + g_slist_free(vc->new_en_list); + vc->new_en_list = NULL; + } - add_to_en_list(&vc->new_en_list, default_en_list_no_sim); - set_new_ecc(vc); + add_to_en_list(&vc->new_en_list, default_en_list_no_sim); + set_new_ecc(vc); + default: + break; + } } static void sim_watch(struct ofono_atom *atom, @@ -1904,9 +1893,11 @@ static void sim_watch(struct ofono_atom *atom, if (cond == OFONO_ATOM_WATCH_CONDITION_UNREGISTERED) { vc->sim_state_watch = 0; + vc->sim = NULL; return; } + vc->sim = sim; vc->sim_state_watch = ofono_sim_add_state_watch(sim, sim_state_watch, vc, NULL); |