aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-modem-helpers.c26
-rw-r--r--src/tests/test-modem-helpers.c45
2 files changed, 62 insertions, 9 deletions
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));