diff options
-rw-r--r-- | plugins/huawei/mm-broadband-modem-huawei.c | 51 | ||||
-rw-r--r-- | src/mm-modem-helpers.c | 26 | ||||
-rw-r--r-- | src/tests/test-modem-helpers.c | 45 |
3 files changed, 62 insertions, 60 deletions
diff --git a/plugins/huawei/mm-broadband-modem-huawei.c b/plugins/huawei/mm-broadband-modem-huawei.c index 49c77e9a..cf22b0d5 100644 --- a/plugins/huawei/mm-broadband-modem-huawei.c +++ b/plugins/huawei/mm-broadband-modem-huawei.c @@ -2172,55 +2172,6 @@ modem_3gpp_disable_unsolicited_events (MMIfaceModem3gpp *self, } /*****************************************************************************/ -/* Operator Name loading (3GPP interface) */ - -static gchar * -modem_3gpp_load_operator_name_finish (MMIfaceModem3gpp *self, - GAsyncResult *res, - GError **error) -{ - const gchar *result; - gchar *operator_name = NULL; - - result = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, error); - if (!result) - return NULL; - - if (!mm_3gpp_parse_cops_read_response (result, - NULL, /* mode */ - NULL, /* format */ - &operator_name, - NULL, /* act */ - error)) - return NULL; - - /* Despite +CSCS? may claim supporting UCS2, Huawei modems always report the - * operator name in ASCII in a +COPS response. Thus, we ignore the current - * charset claimed by the modem and assume the charset is IRA when parsing - * the operator name. - */ - mm_3gpp_normalize_operator_name (&operator_name, MM_MODEM_CHARSET_IRA); - if (operator_name) - mm_dbg ("loaded Operator Name: %s", operator_name); - - return operator_name; -} - -static void -modem_3gpp_load_operator_name (MMIfaceModem3gpp *self, - GAsyncReadyCallback callback, - gpointer user_data) -{ - mm_dbg ("loading Operator Name (huawei)..."); - mm_base_modem_at_command (MM_BASE_MODEM (self), - "+COPS=3,0;+COPS?", - 3, - FALSE, - callback, - user_data); -} - -/*****************************************************************************/ /* Create Bearer (Modem interface) */ typedef struct { @@ -4603,8 +4554,6 @@ iface_modem_3gpp_init (MMIfaceModem3gpp *iface) iface->enable_unsolicited_events_finish = modem_3gpp_enable_unsolicited_events_finish; iface->disable_unsolicited_events = modem_3gpp_disable_unsolicited_events; iface->disable_unsolicited_events_finish = modem_3gpp_disable_unsolicited_events_finish; - iface->load_operator_name = modem_3gpp_load_operator_name; - iface->load_operator_name_finish = modem_3gpp_load_operator_name_finish; } static void diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c index fc95e28f..9266a5a0 100644 --- a/src/mm-modem-helpers.c +++ b/src/mm-modem-helpers.c @@ -3131,20 +3131,28 @@ mm_3gpp_normalize_operator_name (gchar **operator, if (*operator == NULL) return; - /* Some modems (Option & HSO) return the operator name as a hexadecimal - * string of the bytes of the operator name as encoded by the current - * character set. - */ + /* Despite +CSCS? may claim supporting UCS2, Some modems (e.g. Huawei) + * always report the operator name in ASCII in a +COPS response. */ if (cur_charset == MM_MODEM_CHARSET_UCS2) { + gchar *tmp; + + tmp = g_strdup (*operator); /* In this case we're already checking UTF-8 validity */ - *operator = mm_charset_take_and_convert_to_utf8 (*operator, MM_MODEM_CHARSET_UCS2); + tmp = mm_charset_take_and_convert_to_utf8 (tmp, cur_charset); + if (tmp) { + g_clear_pointer (operator, g_free); + *operator = tmp; + goto out; + } } - /* Ensure the operator name is valid UTF-8 so that we can send it - * through D-Bus and such. - */ - else if (!g_utf8_validate (*operator, -1, NULL)) + + /* Charset is unknown or there was an error in conversion; try to see + * if the contents we got are valid UTF-8 already. */ + if (!g_utf8_validate (*operator, -1, NULL)) g_clear_pointer (operator, g_free); +out: + /* Some modems (Novatel LTE) return the operator name as "Unknown" when * it fails to obtain the operator name. Return NULL in such case. */ diff --git a/src/tests/test-modem-helpers.c b/src/tests/test-modem-helpers.c index 1fc8c353..98f30f83 100644 --- a/src/tests/test-modem-helpers.c +++ b/src/tests/test-modem-helpers.c @@ -866,6 +866,49 @@ test_cops_query (void) } /*****************************************************************************/ + +typedef struct { + const gchar *input; + MMModemCharset charset; + const gchar *normalized; +} NormalizeOperatorTest; + +static const NormalizeOperatorTest normalize_operator_tests[] = { + /* charset unknown */ + { "Verizon", MM_MODEM_CHARSET_UNKNOWN, "Verizon" }, + /* charset configured as IRA (ASCII) */ + { "Verizon", MM_MODEM_CHARSET_IRA, "Verizon" }, + /* charset configured as GSM7 */ + { "Verizon", MM_MODEM_CHARSET_GSM, "Verizon" }, + /* charset configured as UCS2 */ + { "0056006500720069007A006F006E", MM_MODEM_CHARSET_UCS2, "Verizon" }, + { "Verizon", MM_MODEM_CHARSET_UCS2, "Verizon" }, +}; + +static void +common_test_normalize_operator (const NormalizeOperatorTest *t) +{ + gchar *str; + + str = g_strdup (t->input); + mm_3gpp_normalize_operator_name (&str, t->charset); + if (!t->normalized) + g_assert (!str); + else + g_assert_cmpstr (str, ==, t->normalized); + g_free (str); +} + +static void +test_normalize_operator (void) +{ + guint i; + + for (i = 0; i < G_N_ELEMENTS (normalize_operator_tests); i++) + common_test_normalize_operator (&normalize_operator_tests[i]); +} + +/*****************************************************************************/ /* Test CREG/CGREG responses and unsolicited messages */ typedef struct { @@ -3527,6 +3570,8 @@ int main (int argc, char **argv) g_test_suite_add (suite, TESTCASE (test_cops_query, NULL)); + g_test_suite_add (suite, TESTCASE (test_normalize_operator, NULL)); + g_test_suite_add (suite, TESTCASE (test_creg1_solicited, reg_data)); g_test_suite_add (suite, TESTCASE (test_creg1_unsolicited, reg_data)); g_test_suite_add (suite, TESTCASE (test_creg2_mercury_solicited, reg_data)); |