[PATCH v2 1/1] helpers: extend +WS46=? response parser to support ranges

Daniele Palmas dnlplm at gmail.com
Fri Jun 16 14:00:14 UTC 2017


2017-06-16 15:56 GMT+02:00 Aleksander Morgado <aleksander at aleksander.es>:
> On 16/06/17 14:57, Daniele Palmas wrote:
>> Telit LTE modems could reply to +WS46=? with:
>>
>> +WS46: (12,22,25,28-31)
>>
>> This patch extends +WS46=? response parser to support ranges.
>> ---
>> v2: used mm_parse_uint_list as suggested by Aleksander
>
>
> Pushed to git master and mm-1-6. I realized late that mm-1-6 didn't have the mm_parse_uint_list() method yet, but I cherry-picked that one on top of your patch, so now mm-1-6 also builds correctly... sorry for that mixup.

Thanks! I'll send shortly another patch that depends on this one to
properly work with Telit LTE modems.

Regards,
Daniele

>
>> ---
>>  src/mm-modem-helpers.c         | 25 ++++++++++++-------------
>>  src/tests/test-modem-helpers.c | 32 ++++++++++++++++++++++++++++++++
>>  2 files changed, 44 insertions(+), 13 deletions(-)
>>
>> diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c
>> index 73822e1..5e257a8 100644
>> --- a/src/mm-modem-helpers.c
>> +++ b/src/mm-modem-helpers.c
>> @@ -887,12 +887,14 @@ mm_3gpp_parse_ws46_test_response (const gchar  *response,
>>                                    GError      **error)
>>  {
>>      GArray     *modes = NULL;
>> +    GArray     *tech_values = NULL;
>>      GRegex     *r;
>>      GError     *inner_error = NULL;
>>      GMatchInfo *match_info = NULL;
>>      gchar      *full_list = NULL;
>> -    gchar     **split;
>> +    guint       val;
>>      guint       i;
>> +    guint       j;
>>      gboolean    supported_4g = FALSE;
>>      gboolean    supported_3g = FALSE;
>>      gboolean    supported_2g = FALSE;
>> @@ -914,17 +916,13 @@ mm_3gpp_parse_ws46_test_response (const gchar  *response,
>>          goto out;
>>      }
>>
>> -    split = g_strsplit (full_list, ",", -1);
>> +    if (!(tech_values = mm_parse_uint_list (full_list, &inner_error)))
>> +        goto out;
>> +
>>      modes = g_array_new (FALSE, FALSE, sizeof (MMModemMode));
>>
>> -    for (i = 0; split && split[i]; i++) {
>> -        guint val;
>> -        guint j;
>> -
>> -        if (!mm_get_uint_from_str (split[i], &val)) {
>> -            g_warning ("Invalid +WS46 mode reported: %s", split[i]);
>> -            continue;
>> -        }
>> +    for (i = 0; i < tech_values->len; i++) {
>> +        val = g_array_index (tech_values, guint, i);
>>
>>          for (j = 0; j < G_N_ELEMENTS (ws46_modes); j++) {
>>              if (ws46_modes[j].ws46 == val) {
>> @@ -942,11 +940,9 @@ mm_3gpp_parse_ws46_test_response (const gchar  *response,
>>          }
>>
>>          if (j == G_N_ELEMENTS (ws46_modes))
>> -            g_warning ("Unknown +WS46 mode reported: %s", split[i]);
>> +            g_warning ("Unknown +WS46 mode reported: %u", val);
>>      }
>>
>> -    g_strfreev (split);
>> -
>>      if (modes->len == 0) {
>>          inner_error = g_error_new (MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "No valid modes reported");
>>          g_clear_pointer (&modes, g_array_unref);
>> @@ -976,6 +972,9 @@ mm_3gpp_parse_ws46_test_response (const gchar  *response,
>>      }
>>
>>  out:
>> +    if (tech_values)
>> +        g_array_unref (tech_values);
>> +
>>      g_free (full_list);
>>
>>      g_clear_pointer (&match_info, g_match_info_free);
>> diff --git a/src/tests/test-modem-helpers.c b/src/tests/test-modem-helpers.c
>> index 5928412..5fdded4 100644
>> --- a/src/tests/test-modem-helpers.c
>> +++ b/src/tests/test-modem-helpers.c
>> @@ -215,6 +215,36 @@ test_ws46_response_telit_le866 (void)
>>      test_ws46_response (str, expected, G_N_ELEMENTS (expected));
>>  }
>>
>> +static void
>> +test_ws46_response_range_1 (void)
>> +{
>> +    static const MMModemMode expected[] = {
>> +        MM_MODEM_MODE_2G | MM_MODEM_MODE_3G,
>> +        MM_MODEM_MODE_2G | MM_MODEM_MODE_4G,
>> +        MM_MODEM_MODE_3G | MM_MODEM_MODE_4G,
>> +    };
>> +    const gchar *str = "+WS46: (29-31)";
>> +
>> +    test_ws46_response (str, expected, G_N_ELEMENTS (expected));
>> +}
>> +
>> +static void
>> +test_ws46_response_range_2 (void)
>> +{
>> +    static const MMModemMode expected[] = {
>> +        MM_MODEM_MODE_2G,
>> +        MM_MODEM_MODE_3G,
>> +        MM_MODEM_MODE_2G | MM_MODEM_MODE_3G | MM_MODEM_MODE_4G,
>> +        MM_MODEM_MODE_4G,
>> +        MM_MODEM_MODE_2G | MM_MODEM_MODE_3G,
>> +        MM_MODEM_MODE_2G | MM_MODEM_MODE_4G,
>> +        MM_MODEM_MODE_3G | MM_MODEM_MODE_4G,
>> +    };
>> +    const gchar *str = "+WS46: (12,22,25,28-31)";
>> +
>> +    test_ws46_response (str, expected, G_N_ELEMENTS (expected));
>> +}
>> +
>>  /*****************************************************************************/
>>  /* Test CMGL responses */
>>
>> @@ -3715,6 +3745,8 @@ int main (int argc, char **argv)
>>      g_test_suite_add (suite, TESTCASE (test_ws46_response_generic_2g3g_v2, NULL));
>>      g_test_suite_add (suite, TESTCASE (test_ws46_response_cinterion, NULL));
>>      g_test_suite_add (suite, TESTCASE (test_ws46_response_telit_le866, NULL));
>> +    g_test_suite_add (suite, TESTCASE (test_ws46_response_range_1, NULL));
>> +    g_test_suite_add (suite, TESTCASE (test_ws46_response_range_2, NULL));
>>
>>      g_test_suite_add (suite, TESTCASE (test_cops_response_tm506, NULL));
>>      g_test_suite_add (suite, TESTCASE (test_cops_response_gt3gplus, NULL));
>>
>
>
> --
> Aleksander
> https://aleksander.es


More information about the ModemManager-devel mailing list