--- src/voicecall.c | 32 ++++++++++++++++++++++++-------- 1 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/src/voicecall.c b/src/voicecall.c index b1d5586..826e10c 100644 --- a/src/voicecall.c +++ b/src/voicecall.c @@ -47,7 +47,8 @@ struct ofono_voicecall { GSList *release_list; GSList *multiparty_list; GSList *en_list; /* emergency number list */ - GSList *new_en_list; /* Emergency numbers being read from SIM */ + GSList *sim_en_list; /* Emergency numbers being read from SIM */ + GSList *new_en_list; /* Emergency numbers from modem/network/no SIM*/ DBusMessage *pending; struct ofono_sim *sim; struct ofono_sim_context *sim_context; @@ -2071,6 +2072,7 @@ static void emit_en_list_changed(struct ofono_voicecall *vc) static void set_new_ecc(struct ofono_voicecall *vc) { int i = 0; + GSList *l; g_slist_foreach(vc->en_list, (GFunc) g_free, NULL); g_slist_free(vc->en_list); @@ -2079,6 +2081,12 @@ static void set_new_ecc(struct ofono_voicecall *vc) vc->en_list = vc->new_en_list; vc->new_en_list = NULL; + for (l = vc->sim_en_list; l; l = l->next) { + if (!g_slist_find_custom(vc->en_list, l->data, number_compare)) + vc->en_list = g_slist_prepend(vc->en_list, + g_strdup(l->data)); + } + while (default_en_list[i]) { GSList *l; @@ -2120,10 +2128,11 @@ static void ecc_g2_read_cb(int ok, int total_length, int record, data += 3; if (en[0] != '\0') - vc->new_en_list = g_slist_prepend(vc->new_en_list, + vc->sim_en_list = g_slist_prepend(vc->sim_en_list, g_strdup(en)); } + vc->sim_en_list = g_slist_reverse(vc->sim_en_list); set_new_ecc(vc); } @@ -2149,16 +2158,17 @@ static void ecc_g3_read_cb(int ok, int total_length, int record, extract_bcd_number(data, 3, en); if (en[0] != '\0') - vc->new_en_list = g_slist_prepend(vc->new_en_list, + vc->sim_en_list = g_slist_prepend(vc->sim_en_list, g_strdup(en)); if (record != total) return; check: - if (!ok && vc->new_en_list == NULL) + if (!ok && vc->sim_en_list == NULL) return; + vc->sim_en_list = g_slist_reverse(vc->sim_en_list); set_new_ecc(vc); } @@ -2231,6 +2241,12 @@ static void voicecall_remove(struct ofono_atom *atom) vc->new_en_list = NULL; } + if (vc->sim_en_list) { + g_slist_foreach(vc->sim_en_list, (GFunc) g_free, NULL); + g_slist_free(vc->sim_en_list); + vc->sim_en_list = NULL; + } + if (vc->sim_state_watch) { ofono_sim_remove_state_watch(vc->sim, vc->sim_state_watch); vc->sim_state_watch = 0; @@ -2330,10 +2346,10 @@ static void sim_state_watch(enum ofono_sim_state new_state, void *user) * 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; + if (vc->sim_en_list) { + g_slist_foreach(vc->sim_en_list, (GFunc) g_free, NULL); + g_slist_free(vc->sim_en_list); + vc->sim_en_list = NULL; } add_to_en_list(&vc->new_en_list, default_en_list_no_sim); -- 1.7.0.4 _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono