From aaefc0443a3707d3da1188837292a7dcaffb2b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 19 Jul 2023 12:41:52 +0200 Subject: [PATCH] emergency-call-types: Allow to lookup emergency numbers by country code We build a hash as cache to speed up lookups. As this is a one time thing we just do it once and don't bother to free it up. We currently assume that all numbers can be used for the location based lookups. Should that change we want to add a flag indicating that. --- src/calls-emergency-call-types.c | 55 ++++++++++++++++++++++++++++++-- src/calls-emergency-call-types.h | 3 ++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/calls-emergency-call-types.c b/src/calls-emergency-call-types.c index a987ff7..6ba2b86 100644 --- a/src/calls-emergency-call-types.c +++ b/src/calls-emergency-call-types.c @@ -26,10 +26,12 @@ typedef struct { } CallsEmergencyNumber; typedef struct { - char *country_code; - CallsEmergencyNumber numbers[3]; + char *country_code; + CallsEmergencyNumber numbers[3]; } CallsEmergencyNumberTypes; +GHashTable *by_mcc; + CallsEmergencyNumberTypes emergency_number_types[] = { { "CH", { @@ -55,6 +57,22 @@ CallsEmergencyNumberTypes emergency_number_types[] = { }; +static void +init_hash (void) +{ + if (g_once_init_enter (&by_mcc)) { + GHashTable *table = g_hash_table_new (g_str_hash, g_str_equal); + + for (int i = 0; i < G_N_ELEMENTS (emergency_number_types); i++) { + CallsEmergencyNumberTypes *numbers = &emergency_number_types[i]; + + g_hash_table_insert (table, numbers->country_code, numbers); + } + g_once_init_leave (&by_mcc, table); + } +} + + static char * flags_to_string (CallsEmergencyCallTypeFlags flags) { @@ -105,3 +123,36 @@ calls_emergency_call_type_get_name (const char *lookup, const char *country_code return NULL; } + +/** + * calls_emergency_call_types_get_numbers_by_country_code: + * @mcc: The country code + * + * Get the valid emergency numbers for this country code + * + * Returns:(transfer full): A string array of emergency numbers + */ +GStrv +calls_emergency_call_types_get_numbers_by_country_code (const char *country_code) +{ + g_autoptr (GPtrArray) ret = g_ptr_array_new_with_free_func (g_free); + CallsEmergencyNumberTypes *match; + + if (country_code == NULL) + return NULL; + + init_hash (); + + match = g_hash_table_lookup (by_mcc, country_code); + if (!match) + return NULL; + + /* Can use g_strv_builder with glib > 2.68 */ + for (int i = 0; i < G_N_ELEMENTS (match->numbers); i++) { + char *number = g_strdup (match->numbers[i].number); + g_ptr_array_add (ret, number); + } + g_ptr_array_add (ret, NULL); + + return (GStrv) g_ptr_array_steal (ret, NULL); +} diff --git a/src/calls-emergency-call-types.h b/src/calls-emergency-call-types.h index 67aba4d..d007fa4 100644 --- a/src/calls-emergency-call-types.h +++ b/src/calls-emergency-call-types.h @@ -4,6 +4,8 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +#include + # pragma once typedef enum { @@ -22,3 +24,4 @@ typedef enum { } CallsEmergencyCallTypeFlags; 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);