mirror of git://git.sysmocom.de/ofono
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:
parent
fa37f158d1
commit
1786c17c3f
|
@ -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,32 +1855,23 @@ 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 */
|
||||
}
|
||||
|
||||
/*
|
||||
* 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);
|
||||
|
@ -1894,6 +1880,9 @@ static void sim_state_watch(void *user, enum ofono_sim_state new_state)
|
|||
|
||||
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);
|
||||
|
|
Loading…
Reference in New Issue