service-providers: Add parsing for service provider info

We currently only need the emergency number information

Signed-off-by: Guido Günther <agx@sigxcpu.org>
Part-of: <https://gitlab.gnome.org/GNOME/calls/-/merge_requests/790>
This commit is contained in:
Guido Günther
2025-09-07 17:43:28 +02:00
committed by Marge Bot
parent 5d751f3143
commit 07d751f958
7 changed files with 647 additions and 1 deletions

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding='utf-8'?>
<!-- -*- Mode: XML; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- -->
<!DOCTYPE serviceproviders SYSTEM "serviceproviders.2.dtd">
<serviceproviders format="2.0">
<country code="yy">
<name>Germany</name>
<emergency-numbers>
<emergency-number number="112">
<callee type="ambulance"/>
<callee type="fire-brigade"/>
<callee type="police"/>
</emergency-number>
</emergency-numbers>
<provider>
</provider>
</country>
<country code="xx">
<name>Switzerland</name>
<emergency-numbers>
<emergency-number number="114">
<callee type="ambulance"/>
</emergency-number>
<emergency-number number="117">
<callee type="police"/>
</emergency-number>
<emergency-number number="118">
<callee type="fire-brigade"/>
</emergency-number>
</emergency-numbers>
</country>
<country code="zz">
</country>
</serviceproviders>

View File

@@ -19,6 +19,7 @@ test_env = [
test_cflags = [
'-DFOR_TESTING',
'-Wno-error=deprecated-declarations',
'-DTEST_DATABASE="@0@"'.format(meson.current_source_dir() / 'data' / 'serviceproviders.xml'),
]
test_link_args = [
@@ -52,6 +53,19 @@ t = executable('emergency-call-types', test_sources,
)
test('emergency-call-types', t, env: test_env)
test_sources = [ 'test-service-providers.c' ]
t = executable('service-providers', test_sources,
c_args : test_cflags,
link_args: test_link_args,
pie: true,
link_with : [calls_vala, libcalls],
dependencies: calls_deps,
include_directories : [
calls_includes,
]
)
test('service-providers', t, env: test_env)
test_sources = [ 'test-manager.c' ]
t = executable('manager', test_sources,

View File

@@ -0,0 +1,112 @@
/*
* Copyright (C) 2025 The Phosh.mobi e.V.
*
* SPDX-License-Identifier: GPL-3.0+
*
* Author: Guido Günther <agx@sigxcpu.org>
*/
#include "calls-emergency-call-types.h"
#include "calls-service-providers.h"
#include <gio/gio.h>
#include <glib.h>
#define calls_assert_cmp_emergency_number(d, i, n, f) G_STMT_START { \
CallsEmergencyNumber *_n = g_ptr_array_index (d->numbers, i); \
if (!_n) { \
g_autofree char *__msg = \
g_strdup_printf ("Emergency number '%u' does not exist", i); \
g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, __msg); \
} \
if (!_n->number) { \
g_autofree char *__msg = \
g_strdup_printf ("Emergency number of element '%u' is NULL", i); \
g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, __msg); \
} \
if (!g_str_equal (_n->number, n)) { \
g_autofree char *__msg = \
g_strdup_printf ("Emergency number of element '%u' is '%s' not '%s'", i, _n->number, n); \
g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, __msg); \
} \
if (_n->flags != f) { \
g_autofree char *__msg = \
g_strdup_printf ("Emergency number of element '%u' has flags '0x%x'' not '0x%x'", i, _n->flags, f); \
g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, __msg); \
} \
} G_STMT_END
static gboolean
numbers_equal (gconstpointer a, gconstpointer b)
{
const CallsEmergencyNumber *n_a = a;
const char *needle = b;
return g_str_equal (n_a->number, needle);
}
static void
test_service_providers_parse_de (void)
{
g_autoptr (GHashTable) info = NULL;
g_autoptr (GError) err = NULL;
CallsEmergencyCallCountryData *data;
CallsEmergencyNumber *number;
guint index;
info = g_hash_table_new_full (g_str_hash,
g_str_equal,
NULL,
(GDestroyNotify) calls_emergency_call_country_data_free);
info = calls_service_providers_get_emergency_info_sync (TEST_DATABASE, &err);
g_assert_no_error (err);
g_assert_nonnull (info);
data = g_hash_table_lookup (info, "xx");
g_assert_nonnull (data);
g_assert_cmpint (data->numbers->len, ==, 3);
g_assert_true (g_ptr_array_find_with_equal_func (data->numbers, "114", numbers_equal, &index));
number = g_ptr_array_index (data->numbers, index);
g_assert_nonnull (number);
calls_assert_cmp_emergency_number(data, index, "114", CALLS_EMERGENCY_CALL_TYPE_AMBULANCE);
g_assert_true (g_ptr_array_find_with_equal_func (data->numbers, "117", numbers_equal, &index));
number = g_ptr_array_index (data->numbers, index);
g_assert_nonnull (number);
calls_assert_cmp_emergency_number(data, index, "117", CALLS_EMERGENCY_CALL_TYPE_POLICE);
g_assert_true (g_ptr_array_find_with_equal_func (data->numbers, "118", numbers_equal, &index));
number = g_ptr_array_index (data->numbers, index);
g_assert_nonnull (number);
calls_assert_cmp_emergency_number(data, index, "118", CALLS_EMERGENCY_CALL_TYPE_FIRE_BRIGADE);
data = g_hash_table_lookup (info, "yy");
g_assert_nonnull (data);
g_assert_cmpint (data->numbers->len, ==, 1);
g_assert_true (g_ptr_array_find_with_equal_func (data->numbers, "112", numbers_equal, &index));
number = g_ptr_array_index (data->numbers, index);
g_assert_nonnull (number);
calls_assert_cmp_emergency_number(data, index, "112", (CALLS_EMERGENCY_CALL_TYPE_POLICE |
CALLS_EMERGENCY_CALL_TYPE_FIRE_BRIGADE |
CALLS_EMERGENCY_CALL_TYPE_AMBULANCE));
data = g_hash_table_lookup (info, "zz");
g_assert_null (data);
}
gint
main (gint argc, gchar *argv[])
{
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/calls/service-providers/parse", test_service_providers_parse_de);
return g_test_run ();
}