Refactor: Store the sim object inside voicecalls

Makes the logic a bit easier to follow.  Also use a switch/case inside
the sim state watcher.
This commit is contained in:
Denis Kenzior 2010-04-15 14:00:46 -05:00
parent fa37f158d1
commit 1786c17c3f
1 changed files with 26 additions and 35 deletions

View File

@ -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);