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 --- 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)); -- 2.7.4 _______________________________________________ ModemManager-devel mailing list ModemManager-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel