helpers: extend +WS46=? response parser to support ranges

Telit LTE modems could reply to +WS46=? with:

+WS46: (12,22,25,28-31)

This patch extends +WS46=? response parser to support ranges.
This commit is contained in:
Daniele Palmas
2017-06-16 15:48:18 +02:00
committed by Aleksander Morgado
parent e37e81c2e4
commit 5820666495
2 changed files with 44 additions and 13 deletions
+12 -13
View File
@@ -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);
+32
View File
@@ -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));