From 6f44a7c7fdc36f00cd7a9def6d579ec052fc24c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Sun, 7 Sep 2025 17:43:29 +0200 Subject: [PATCH] emergency-call-types: Add emergency numbers from service provider db MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This scales better than using a built in array. Closes: https://gitlab.gnome.org/GNOME/calls/-/issues/714 Signed-off-by: Guido Günther Part-of: --- src/calls-emergency-call-types.c | 23 ++++++++++++++++++----- src/calls-emergency-call-types.h | 2 +- src/calls-emergency-calls-manager.c | 4 +++- tests/test-emergency-call-types.c | 7 ++++++- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/calls-emergency-call-types.c b/src/calls-emergency-call-types.c index 2f42c0b..44a9a6d 100644 --- a/src/calls-emergency-call-types.c +++ b/src/calls-emergency-call-types.c @@ -9,6 +9,7 @@ #define G_LOG_DOMAIN "CallsEmergencyCallType" #include "calls-emergency-call-types.h" +#include "calls-service-providers.h" #include @@ -280,17 +281,29 @@ calls_emergency_call_country_data_new (const char *country) void -calls_emergency_call_types_init (void) +calls_emergency_call_types_init (const char *dbfilename) { if (g_once_init_enter (&by_mcc)) { - GHashTable *table = g_hash_table_new_full (g_str_hash, - g_str_equal, - NULL, - (GDestroyNotify) calls_emergency_call_country_data_free); + g_autoptr (GError) err = NULL; + GHashTable *table = NULL; + + table = calls_service_providers_get_emergency_info_sync (dbfilename, &err); + if (!table) { + g_warning ("Failed to load emergency number database: '%s'", err->message); + table = g_hash_table_new_full (g_str_hash, + g_str_equal, + NULL, + (GDestroyNotify) calls_emergency_call_country_data_free); + } for (int i = 0; i < G_N_ELEMENTS (emergency_number_types); i++) { CallsEmergencyCallCountryData *country; + const char *country_code = emergency_number_types[i].country_code; + if (g_hash_table_lookup (table, country_code)) + continue; + + /* Add a built in fallback */ country = calls_emergency_call_country_data_new (emergency_number_types[i].country_code); for (int k = 0; k < G_N_ELEMENTS (emergency_number_types[i].numbers); k++) { CallsEmergencyNumber *number; diff --git a/src/calls-emergency-call-types.h b/src/calls-emergency-call-types.h index d544fdb..3ca05f9 100644 --- a/src/calls-emergency-call-types.h +++ b/src/calls-emergency-call-types.h @@ -50,7 +50,7 @@ typedef struct { CallsEmergencyCallCountryData *calls_emergency_call_country_data_new (const char *country); void calls_emergency_call_country_data_free (CallsEmergencyCallCountryData *country_data); -void calls_emergency_call_types_init (void); +void calls_emergency_call_types_init (const char *dbfilename); void calls_emergency_call_types_destroy (void); char *calls_emergency_call_type_get_name (const char *number, const char *country_code); GStrv calls_emergency_call_types_get_numbers_by_country_code (const char *country_code); diff --git a/src/calls-emergency-calls-manager.c b/src/calls-emergency-calls-manager.c index f1b169c..d170431 100644 --- a/src/calls-emergency-calls-manager.c +++ b/src/calls-emergency-calls-manager.c @@ -8,6 +8,8 @@ #define G_LOG_DOMAIN "CallsEmergencyCallsManager" +#include "calls-config.h" + #include "calls-emergency-calls-manager.h" #include "calls-emergency-call-types.h" #include "calls-origin.h" @@ -231,7 +233,7 @@ calls_emergency_calls_manager_init (CallsEmergencyCallsManager *self) { CallsManager *manager = calls_manager_get_default (); - calls_emergency_call_types_init (); + calls_emergency_call_types_init (CALLS_EMERGENCY_INFO_DATABASE); self->origins = g_object_ref (calls_manager_get_origins (manager)); g_signal_connect_object (self->origins, diff --git a/tests/test-emergency-call-types.c b/tests/test-emergency-call-types.c index 8f233d7..242e672 100644 --- a/tests/test-emergency-call-types.c +++ b/tests/test-emergency-call-types.c @@ -40,6 +40,11 @@ test_lookup (void) /* Numbers that doesn't match */ lookup = calls_emergency_call_type_get_name ("123456", "DE"); g_assert_null (lookup); + + /* Lookup from service provider db */ + lookup = calls_emergency_call_type_get_name ("112", "yy"); + g_assert_cmpstr (lookup, ==, "Police, Ambulance, Fire Brigade"); + g_free (lookup); } int @@ -49,7 +54,7 @@ main (int argc, gint ret; g_test_init (&argc, &argv, NULL); - calls_emergency_call_types_init (); + calls_emergency_call_types_init (TEST_DATABASE); g_test_add_func ("/Calls/EmergencyCallTypes/lookup", test_lookup);