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:
committed by
Aleksander Morgado
parent
e37e81c2e4
commit
5820666495
+12
-13
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user