* [PATCH v4 0/4] Support of Network / Modem updated emergency numbers
@ 2011-04-06 14:26 Jeevaka Badrappan
2011-04-06 14:26 ` [PATCH v4 1/4] include: Add ofono_voicecall_en_list_notify api Jeevaka Badrappan
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Jeevaka Badrappan @ 2011-04-06 14:26 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 619 bytes --]
Hi,
Following set of patch adds the support for emergency number list update
from the network/modem in the oFono core.
Regards,
Jeevaka
Jeevaka Badrappan (4):
include: Add ofono_voicecall_en_list_notify api
voicecall: refactor emergency number list handling
voicecall: network emergency number list support
TODO: Mark Network/Modem EN update task as done
TODO | 11 ----
doc/features.txt | 18 +++---
include/voicecall.h | 3 +
src/voicecall.c | 160 ++++++++++++++++++++++++++++----------------------
4 files changed, 103 insertions(+), 89 deletions(-)
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v4 1/4] include: Add ofono_voicecall_en_list_notify api 2011-04-06 14:26 [PATCH v4 0/4] Support of Network / Modem updated emergency numbers Jeevaka Badrappan @ 2011-04-06 14:26 ` Jeevaka Badrappan 2011-04-06 14:26 ` [PATCH v4 2/4] voicecall: refactor emergency number list handling Jeevaka Badrappan ` (3 subsequent siblings) 4 siblings, 0 replies; 6+ messages in thread From: Jeevaka Badrappan @ 2011-04-06 14:26 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 616 bytes --] --- include/voicecall.h | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/include/voicecall.h b/include/voicecall.h index 6ae06a9..a373c64 100644 --- a/include/voicecall.h +++ b/include/voicecall.h @@ -135,6 +135,9 @@ struct ofono_voicecall_driver { ofono_voicecall_cb_t cb, void *data); }; +void ofono_voicecall_en_list_notify(struct ofono_voicecall *vc, + char **nw_en_list); + void ofono_voicecall_notify(struct ofono_voicecall *vc, const struct ofono_call *call); void ofono_voicecall_disconnected(struct ofono_voicecall *vc, int id, -- 1.7.0.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v4 2/4] voicecall: refactor emergency number list handling 2011-04-06 14:26 [PATCH v4 0/4] Support of Network / Modem updated emergency numbers Jeevaka Badrappan 2011-04-06 14:26 ` [PATCH v4 1/4] include: Add ofono_voicecall_en_list_notify api Jeevaka Badrappan @ 2011-04-06 14:26 ` Jeevaka Badrappan 2011-04-06 14:26 ` [PATCH v4 3/4] voicecall: network emergency number list support Jeevaka Badrappan ` (2 subsequent siblings) 4 siblings, 0 replies; 6+ messages in thread From: Jeevaka Badrappan @ 2011-04-06 14:26 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 8493 bytes --] --- src/voicecall.c | 143 ++++++++++++++++++++++++++++--------------------------- 1 files changed, 72 insertions(+), 71 deletions(-) diff --git a/src/voicecall.c b/src/voicecall.c index 469b939..b0f15fd 100644 --- a/src/voicecall.c +++ b/src/voicecall.c @@ -46,8 +46,9 @@ struct ofono_voicecall { GSList *call_list; GSList *release_list; GSList *multiparty_list; - GSList *en_list; /* emergency number list */ - GSList *new_en_list; /* Emergency numbers being read from SIM */ + GHashTable *en_list; /* emergency number list */ + GSList *sim_en_list; /* Emergency numbers being read from SIM */ + ofono_bool_t sim_en_list_ready; DBusMessage *pending; struct ofono_sim *sim; struct ofono_sim_context *sim_context; @@ -130,11 +131,12 @@ static gint call_compare(gconstpointer a, gconstpointer b) return 0; } -static void add_to_en_list(GSList **l, const char **list) +static void add_to_en_list(struct ofono_voicecall *vc, char **list) { int i = 0; + while (list[i]) - *l = g_slist_prepend(*l, g_strdup(list[i++])); + g_hash_table_insert(vc->en_list, g_strdup(list[i++]), NULL); } static const char *disconnect_reason_to_string(enum ofono_disconnect_reason r) @@ -331,17 +333,10 @@ static void tone_request_finish(struct ofono_voicecall *vc, g_free(entry); } -static gint number_compare(gconstpointer a, gconstpointer b) -{ - const char *s1 = a, *s2 = b; - return strcmp(s1, s2); -} - static gboolean is_emergency_number(struct ofono_voicecall *vc, const char *number) { - return g_slist_find_custom(vc->en_list, number, - number_compare) ? TRUE : FALSE; + return g_hash_table_lookup_extended(vc->en_list, number, NULL, NULL); } static void append_voicecall_properties(struct voicecall *v, @@ -1120,9 +1115,10 @@ static DBusMessage *manager_get_properties(DBusConnection *conn, DBusMessage *reply; DBusMessageIter iter; DBusMessageIter dict; - int i; - GSList *l; + int i = 0; char **list; + GHashTableIter ht_iter; + gpointer key, value; reply = dbus_message_new_method_return(msg); if (reply == NULL) @@ -1135,14 +1131,16 @@ static DBusMessage *manager_get_properties(DBusConnection *conn, &dict); /* property EmergencyNumbers */ - list = g_new0(char *, g_slist_length(vc->en_list) + 1); + list = g_new0(char *, g_hash_table_size(vc->en_list) + 1); + + g_hash_table_iter_init(&ht_iter, vc->en_list); - for (i = 0, l = vc->en_list; l; l = l->next, i++) - list[i] = g_strdup(l->data); + while (g_hash_table_iter_next(&ht_iter, &key, &value)) + list[i++] = key; ofono_dbus_dict_append_array(&dict, "EmergencyNumbers", DBUS_TYPE_STRING, &list); - g_strfreev(list); + g_free(list); dbus_message_iter_close_container(&iter, &dict); @@ -2068,46 +2066,43 @@ static void emit_en_list_changed(struct ofono_voicecall *vc) DBusConnection *conn = ofono_dbus_get_connection(); const char *path = __ofono_atom_get_path(vc->atom); char **list; - GSList *l; - int i; + int i = 0; + GHashTableIter iter; + gpointer key, value; - list = g_new0(char *, g_slist_length(vc->en_list) + 1); - for (i = 0, l = vc->en_list; l; l = l->next, i++) - list[i] = g_strdup(l->data); + list = g_new0(char *, g_hash_table_size(vc->en_list) + 1); + + g_hash_table_iter_init(&iter, vc->en_list); + + while (g_hash_table_iter_next(&iter, &key, &value)) + list[i++] = key; ofono_dbus_signal_array_property_changed(conn, path, OFONO_VOICECALL_MANAGER_INTERFACE, "EmergencyNumbers", DBUS_TYPE_STRING, &list); - g_strfreev(list); + g_free(list); } static void set_new_ecc(struct ofono_voicecall *vc) { - int i = 0; - - g_slist_foreach(vc->en_list, (GFunc) g_free, NULL); - g_slist_free(vc->en_list); - vc->en_list = NULL; - - vc->en_list = vc->new_en_list; - vc->new_en_list = NULL; + GSList *l; - while (default_en_list[i]) { - GSList *l; + g_hash_table_destroy(vc->en_list); - for (l = vc->en_list; l; l = l->next) - if (!strcmp(l->data, default_en_list[i])) - break; + vc->en_list = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, NULL); - if (l == NULL) - vc->en_list = g_slist_prepend(vc->en_list, - g_strdup(default_en_list[i])); - - i++; + /* Emergency numbers read from SIM */ + if (vc->sim_en_list_ready == TRUE && vc->sim_en_list) { + for (l = vc->sim_en_list; l; l = l->next) + g_hash_table_insert(vc->en_list, g_strdup(l->data), + NULL); } - vc->en_list = g_slist_reverse(vc->en_list); + /* Default emergency numbers */ + add_to_en_list(vc, (char **) default_en_list); + emit_en_list_changed(vc); } @@ -2134,10 +2129,12 @@ 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); + vc->sim_en_list_ready = TRUE; set_new_ecc(vc); } @@ -2163,16 +2160,18 @@ 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); + vc->sim_en_list_ready = TRUE; set_new_ecc(vc); } @@ -2203,11 +2202,27 @@ static void voicecall_unregister(struct ofono_atom *atom) const char *path = __ofono_atom_get_path(atom); GSList *l; + if (vc->sim_state_watch) { + ofono_sim_remove_state_watch(vc->sim, vc->sim_state_watch); + vc->sim_state_watch = 0; + } + if (vc->sim_watch) { __ofono_modem_remove_atom_watch(modem, vc->sim_watch); vc->sim_watch = 0; } + vc->sim = 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; + } + + g_hash_table_destroy(vc->en_list); + vc->en_list = NULL; + if (vc->dial_req) dial_request_finish(vc); @@ -2234,24 +2249,6 @@ static void voicecall_remove(struct ofono_atom *atom) if (vc->driver && vc->driver->remove) vc->driver->remove(vc); - if (vc->en_list) { - g_slist_foreach(vc->en_list, (GFunc) g_free, NULL); - g_slist_free(vc->en_list); - vc->en_list = NULL; - } - - 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_state_watch) { - ofono_sim_remove_state_watch(vc->sim, vc->sim_state_watch); - vc->sim_state_watch = 0; - vc->sim = NULL; - } - if (vc->tone_source) { g_source_remove(vc->tone_source); vc->tone_source = 0; @@ -2345,14 +2342,15 @@ 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); + vc->sim_en_list_ready = FALSE; set_new_ecc(vc); + add_to_en_list(vc, (char **) default_en_list_no_sim); default: break; } @@ -2396,12 +2394,15 @@ void ofono_voicecall_register(struct ofono_voicecall *vc) ofono_modem_add_interface(modem, OFONO_VOICECALL_MANAGER_INTERFACE); + vc->en_list = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, NULL); + /* * Start out with the 22.101 mandated numbers, if we have a SIM and * the SIM contains EFecc, then we update the list once we've read them */ - add_to_en_list(&vc->en_list, default_en_list_no_sim); - add_to_en_list(&vc->en_list, default_en_list); + add_to_en_list(vc, (char **) default_en_list_no_sim); + add_to_en_list(vc, (char **) default_en_list); vc->sim_watch = __ofono_modem_add_atom_watch(modem, OFONO_ATOM_TYPE_SIM, -- 1.7.0.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v4 3/4] voicecall: network emergency number list support 2011-04-06 14:26 [PATCH v4 0/4] Support of Network / Modem updated emergency numbers Jeevaka Badrappan 2011-04-06 14:26 ` [PATCH v4 1/4] include: Add ofono_voicecall_en_list_notify api Jeevaka Badrappan 2011-04-06 14:26 ` [PATCH v4 2/4] voicecall: refactor emergency number list handling Jeevaka Badrappan @ 2011-04-06 14:26 ` Jeevaka Badrappan 2011-04-06 14:26 ` [PATCH v4 4/4] TODO: Mark Network/Modem EN update task as done Jeevaka Badrappan 2011-04-08 3:20 ` [PATCH v4 0/4] Support of Network / Modem updated emergency numbers Denis Kenzior 4 siblings, 0 replies; 6+ messages in thread From: Jeevaka Badrappan @ 2011-04-06 14:26 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 1686 bytes --] --- src/voicecall.c | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) diff --git a/src/voicecall.c b/src/voicecall.c index b0f15fd..19ef479 100644 --- a/src/voicecall.c +++ b/src/voicecall.c @@ -49,6 +49,7 @@ struct ofono_voicecall { GHashTable *en_list; /* emergency number list */ GSList *sim_en_list; /* Emergency numbers being read from SIM */ ofono_bool_t sim_en_list_ready; + char **nw_en_list; /* Emergency numbers from modem/network */ DBusMessage *pending; struct ofono_sim *sim; struct ofono_sim_context *sim_context; @@ -2093,6 +2094,10 @@ static void set_new_ecc(struct ofono_voicecall *vc) vc->en_list = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); + /* Emergency numbers from modem/network */ + if (vc->nw_en_list) + add_to_en_list(vc, vc->nw_en_list); + /* Emergency numbers read from SIM */ if (vc->sim_en_list_ready == TRUE && vc->sim_en_list) { for (l = vc->sim_en_list; l; l = l->next) @@ -2175,6 +2180,15 @@ check: set_new_ecc(vc); } +void ofono_voicecall_en_list_notify(struct ofono_voicecall *vc, + char **nw_en_list) +{ + g_strfreev(vc->nw_en_list); + + vc->nw_en_list = g_strdupv(nw_en_list); + set_new_ecc(vc); +} + int ofono_voicecall_driver_register(const struct ofono_voicecall_driver *d) { DBG("driver: %p, name: %s", d, d->name); @@ -2220,6 +2234,11 @@ static void voicecall_unregister(struct ofono_atom *atom) vc->sim_en_list = NULL; } + if (vc->nw_en_list) { + g_strfreev(vc->nw_en_list); + vc->nw_en_list = NULL; + } + g_hash_table_destroy(vc->en_list); vc->en_list = NULL; -- 1.7.0.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v4 4/4] TODO: Mark Network/Modem EN update task as done 2011-04-06 14:26 [PATCH v4 0/4] Support of Network / Modem updated emergency numbers Jeevaka Badrappan ` (2 preceding siblings ...) 2011-04-06 14:26 ` [PATCH v4 3/4] voicecall: network emergency number list support Jeevaka Badrappan @ 2011-04-06 14:26 ` Jeevaka Badrappan 2011-04-08 3:20 ` [PATCH v4 0/4] Support of Network / Modem updated emergency numbers Denis Kenzior 4 siblings, 0 replies; 6+ messages in thread From: Jeevaka Badrappan @ 2011-04-06 14:26 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 2240 bytes --] --- TODO | 11 ----------- doc/features.txt | 18 ++++++++++-------- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/TODO b/TODO index 85c5ad1..3491436 100644 --- a/TODO +++ b/TODO @@ -289,17 +289,6 @@ Sim Toolkit Complexity: C2 Owner: Philippe Nunes <philippe.nunes@linux.intel.com> -Emergency Calls -=============== - -- Network / Modem updating of the emergency number list. Support the list of - emergency numbers dynamically updated by the network or by the modem (e.g. - additional numbers burned into modem ROM). - - Priority: High - Complexity: C2 - - Miscellaneous ============= diff --git a/doc/features.txt b/doc/features.txt index eb945c3..68d0676 100644 --- a/doc/features.txt +++ b/doc/features.txt @@ -583,14 +583,16 @@ Text Telephony Emergency Calls =============== -- EFecc support. During SIM initialization phase oFono reads EFecc in order - to bootstrap the emergency calling codes provides by the SIM. If the SIM is - not present or EFecc has not been read yet, the default set of emergency - calling codes is used. - -- Emergency number reporting. The current known list of emergency calling - codes is reported by oFono in the EmergencyNumbers property on the - VoicecallManager interface. When a voicecall is made to a number present +- Emergency number reporting. During SIM initialization phase oFono reads + EFecc in order to bootstrap the emergency calling codes provided by the SIM. + Emergency number list is exposed via the EmergencyNumbers property on the + VoicecallManager interface. If SIM is present, list is the union of default + emergency numbers(112, 911), numbers in EFecc and Network / Modem reported + emergency numbers. If SIM is not present or EFecc has not been read yet, + list is the union of default emergency numbers(112, 911) and emergency + numbers without SIM(119, 118, 999, 110, 08 and 000). + +- Emergency call reporting. When a voicecall is made to a number present on the EmergencyNumbers list it is automatically flagged as an emergency call. This is done by setting the Emergency property on the Voicecall interface to TRUE. -- 1.7.0.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4 0/4] Support of Network / Modem updated emergency numbers 2011-04-06 14:26 [PATCH v4 0/4] Support of Network / Modem updated emergency numbers Jeevaka Badrappan ` (3 preceding siblings ...) 2011-04-06 14:26 ` [PATCH v4 4/4] TODO: Mark Network/Modem EN update task as done Jeevaka Badrappan @ 2011-04-08 3:20 ` Denis Kenzior 4 siblings, 0 replies; 6+ messages in thread From: Denis Kenzior @ 2011-04-08 3:20 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 646 bytes --] Hi Jeevaka, On 04/06/2011 09:26 AM, Jeevaka Badrappan wrote: > Hi, > > Following set of patch adds the support for emergency number list update > from the network/modem in the oFono core. > > Regards, > Jeevaka > I applied all of the patches in this series, but did split patch 2 into two commits. Thanks for that. I also did some minor refactoring after the fact to take care of some really corner cases. Can you please review and make sure I didn't screw anything up. I believe this should complete emergency call related tasks. Can we make sure to test this really well in the coming weeks? Regards, -Denis ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2011-04-08 3:20 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-04-06 14:26 [PATCH v4 0/4] Support of Network / Modem updated emergency numbers Jeevaka Badrappan 2011-04-06 14:26 ` [PATCH v4 1/4] include: Add ofono_voicecall_en_list_notify api Jeevaka Badrappan 2011-04-06 14:26 ` [PATCH v4 2/4] voicecall: refactor emergency number list handling Jeevaka Badrappan 2011-04-06 14:26 ` [PATCH v4 3/4] voicecall: network emergency number list support Jeevaka Badrappan 2011-04-06 14:26 ` [PATCH v4 4/4] TODO: Mark Network/Modem EN update task as done Jeevaka Badrappan 2011-04-08 3:20 ` [PATCH v4 0/4] Support of Network / Modem updated emergency numbers Denis Kenzior
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox