[PATCH 1/2] modem-helpers: if operator not in UCS2, see if already valid UTF-8
Aleksander Morgado
aleksander at aleksander.es
Sun Apr 2 08:10:56 UTC 2017
On 01/04/17 06:01, Dan Williams wrote:
> On Sat, 2017-03-25 at 21:39 +0100, Aleksander Morgado wrote:
>> The method doing the operator name normalization takes as input the
>> current configured modem charset. If this is UCS2, we will now just
>> assume this is a hint: the string may or may not come in hex/UCS2.
>>
>> This logic makes the custom operator name loading in Huawei unneeded,
>> if the modem is configured in UCS2, we still properly process
>> operator
>> names coming in plain ASCII.
>
> LGTM.
>
Pushed to git master.
> Dan
>
>> ---
>> plugins/huawei/mm-broadband-modem-huawei.c | 51 --------------------
>> ----------
>> src/mm-modem-helpers.c | 26 +++++++++------
>> 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 74e680b4..9f13b0f2 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));
--
Aleksander
https://aleksander.es
More information about the ModemManager-devel
mailing list