summaryrefslogtreecommitdiffstats
path: root/src/voicecall.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/voicecall.c')
-rw-r--r--src/voicecall.c61
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);