From d6f9d5e9ec36e403be9836c55c8ffd19422605ef Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Wed, 25 Sep 2019 11:28:53 +0200 Subject: sim: load emergency numbers from EF_ECC --- src/mm-base-sim.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) (limited to 'src/mm-base-sim.c') diff --git a/src/mm-base-sim.c b/src/mm-base-sim.c index 1bd6a5c5..acb44125 100644 --- a/src/mm-base-sim.c +++ b/src/mm-base-sim.c @@ -973,7 +973,84 @@ mm_base_sim_get_path (MMBaseSim *self) } /*****************************************************************************/ -/* SIM IDENTIFIER */ +/* Emergency numbers */ + +static GStrv +parse_emergency_numbers (const gchar *response, + GError **error) +{ + guint sw1 = 0; + guint sw2 = 0; + gchar *hex = 0; + GStrv ret; + + if (!mm_3gpp_parse_crsm_response (response, &sw1, &sw2, &hex, error)) + return NULL; + + if ((sw1 == 0x90 && sw2 == 0x00) || + (sw1 == 0x91) || + (sw1 == 0x92) || + (sw1 == 0x9f)) { + ret = mm_3gpp_parse_emergency_numbers (hex, error); + g_free (hex); + return ret; + } + + g_free (hex); + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_FAILED, + "SIM failed to handle CRSM request (sw1 %d sw2 %d)", + sw1, sw2); + return NULL; +} + +static GStrv +load_emergency_numbers_finish (MMBaseSim *self, + GAsyncResult *res, + GError **error) +{ + gchar *result; + GStrv emergency_numbers; + guint i; + + result = g_task_propagate_pointer (G_TASK (res), error); + if (!result) + return NULL; + + emergency_numbers = parse_emergency_numbers (result, error); + g_free (result); + + if (!emergency_numbers) + return NULL; + + for (i = 0; emergency_numbers[i]; i++) + mm_dbg ("loaded emergency number: %s", emergency_numbers[i]); + + return emergency_numbers; +} + +STR_REPLY_READY_FN (load_emergency_numbers) + +static void +load_emergency_numbers (MMBaseSim *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + mm_dbg ("loading emergency numbers..."); + + /* READ BINARY of EF_ECC (Emergency Call Codes) ETSI TS 51.011 section 10.3.27 */ + mm_base_modem_at_command ( + self->priv->modem, + "+CRSM=176,28599,0,0,15", + 20, + FALSE, + (GAsyncReadyCallback)load_emergency_numbers_command_ready, + g_task_new (self, NULL, callback, user_data)); +} + +/*****************************************************************************/ +/* ICCID */ static gchar * parse_iccid (const gchar *response, @@ -1784,6 +1861,8 @@ mm_base_sim_class_init (MMBaseSimClass *klass) klass->load_operator_identifier_finish = load_operator_identifier_finish; klass->load_operator_name = load_operator_name; klass->load_operator_name_finish = load_operator_name_finish; + klass->load_emergency_numbers = load_emergency_numbers; + klass->load_emergency_numbers_finish = load_emergency_numbers_finish; klass->send_pin = send_pin; klass->send_pin_finish = common_send_pin_puk_finish; klass->send_puk = send_puk; -- cgit v1.2.3-70-g09d2