huawei: new ^SYSCFG? response parser

This commit is contained in:
Aleksander Morgado
2013-11-10 21:24:42 +01:00
parent 4e5c35a69f
commit 9ac136028b
3 changed files with 142 additions and 0 deletions

View File

@@ -709,6 +709,72 @@ mm_huawei_parse_syscfg_test (const gchar *response,
return out; return out;
} }
/*****************************************************************************/
/* ^SYSCFG response parser */
const MMHuaweiSyscfgCombination *
mm_huawei_parse_syscfg_response (const gchar *response,
const GArray *supported_mode_combinations,
GError **error)
{
gchar **split;
guint mode;
guint acqorder;
guint i;
if (!response || !g_str_has_prefix (response, "^SYSCFG:")) {
g_set_error (error,
MM_CORE_ERROR,
MM_CORE_ERROR_FAILED,
"Missing ^SYSCFG prefix");
return NULL;
}
/* Format:
*
* ^SYSCFG: <mode>,<acqorder>,<band>,<roam>,<srvdomain>
*/
response = mm_strip_tag (response, "^SYSCFG:");
split = g_strsplit (response, ",", -1);
/* We expect 5 string chunks */
if (g_strv_length (split) < 5 ||
!mm_get_uint_from_str (split[0], &mode) ||
!mm_get_uint_from_str (split[1], &acqorder)) {
/* Dump error to upper layer */
g_set_error (error,
MM_CORE_ERROR,
MM_CORE_ERROR_FAILED,
"Unexpected ^SYSCFG response: '%s'",
response);
g_strfreev (split);
return NULL;
}
/* Look for current modes among the supported ones */
for (i = 0; i < supported_mode_combinations->len; i++) {
const MMHuaweiSyscfgCombination *combination;
combination = &g_array_index (supported_mode_combinations,
MMHuaweiSyscfgCombination,
i);
if (mode == combination->mode && acqorder == combination->acqorder) {
g_strfreev (split);
return combination;
}
}
g_set_error (error,
MM_CORE_ERROR,
MM_CORE_ERROR_FAILED,
"No SYSCFG combination found matching the current one (%d,%d)",
mode,
acqorder);
g_strfreev (split);
return NULL;
}
/*****************************************************************************/ /*****************************************************************************/
/* ^SYSCFGEX test parser */ /* ^SYSCFGEX test parser */

View File

@@ -83,6 +83,13 @@ typedef struct {
GArray *mm_huawei_parse_syscfg_test (const gchar *response, GArray *mm_huawei_parse_syscfg_test (const gchar *response,
GError **error); GError **error);
/*****************************************************************************/
/* ^SYSCFG response parser */
const MMHuaweiSyscfgCombination *mm_huawei_parse_syscfg_response (const gchar *response,
const GArray *supported_mode_combinations,
GError **error);
/*****************************************************************************/ /*****************************************************************************/
/* ^SYSCFGEX test parser */ /* ^SYSCFGEX test parser */

View File

@@ -577,6 +577,74 @@ test_syscfg (void)
} }
} }
/*****************************************************************************/
/* Test ^SYSCFG? responses */
typedef struct {
const gchar *str;
const gchar *format;
MMModemMode allowed;
MMModemMode preferred;
} SyscfgResponseTest;
static const SyscfgResponseTest syscfg_response_tests[] = {
{
.str = "^SYSCFG: 2,0,400000,0,3\r\n",
.format = "^SYSCFG:(2,13,14,16),(0-3),((400000,\"WCDMA2100\")),(0-2),(0-4)\r\n",
.allowed = (MM_MODEM_MODE_3G | MM_MODEM_MODE_2G),
.preferred = MM_MODEM_MODE_NONE
},
{
.str = "^SYSCFG: 2,1,400000,0,3\r\n",
.format = "^SYSCFG:(2,13,14,16),(0-3),((400000,\"WCDMA2100\")),(0-2),(0-4)\r\n",
.allowed = (MM_MODEM_MODE_3G | MM_MODEM_MODE_2G),
.preferred = MM_MODEM_MODE_2G
},
{
.str = "^SYSCFG: 2,2,400000,0,3\r\n",
.format = "^SYSCFG:(2,13,14,16),(0-3),((400000,\"WCDMA2100\")),(0-2),(0-4)\r\n",
.allowed = (MM_MODEM_MODE_3G | MM_MODEM_MODE_2G),
.preferred = MM_MODEM_MODE_3G
},
{
.str = "^SYSCFG: 13,0,400000,0,3\r\n",
.format = "^SYSCFG:(2,13,14,16),(0-3),((400000,\"WCDMA2100\")),(0-2),(0-4)\r\n",
.allowed = MM_MODEM_MODE_2G,
.preferred = MM_MODEM_MODE_NONE
},
{
.str = "^SYSCFG: 14,0,400000,0,3\r\n",
.format = "^SYSCFG:(2,13,14,16),(0-3),((400000,\"WCDMA2100\")),(0-2),(0-4)\r\n",
.allowed = MM_MODEM_MODE_3G,
.preferred = MM_MODEM_MODE_NONE
}
};
static void
test_syscfg_response (void)
{
guint i;
for (i = 0; i < G_N_ELEMENTS (syscfg_response_tests); i++) {
GArray *combinations = NULL;
const MMHuaweiSyscfgCombination *found;
GError *error = NULL;
combinations = mm_huawei_parse_syscfg_test (syscfg_response_tests[i].format, NULL);
g_assert (combinations != NULL);
found = mm_huawei_parse_syscfg_response (syscfg_response_tests[i].str,
combinations,
&error);
g_assert (found != NULL);
g_assert_cmpuint (found->allowed, ==, syscfg_response_tests[i].allowed);
g_assert_cmpuint (found->preferred, ==, syscfg_response_tests[i].preferred);
g_array_unref (combinations);
}
}
/*****************************************************************************/ /*****************************************************************************/
/* Test ^SYSCFGEX=? responses */ /* Test ^SYSCFGEX=? responses */
@@ -796,6 +864,7 @@ int main (int argc, char **argv)
g_test_add_func ("/MM/huawei/prefmode", test_prefmode); g_test_add_func ("/MM/huawei/prefmode", test_prefmode);
g_test_add_func ("/MM/huawei/prefmode/response", test_prefmode_response); g_test_add_func ("/MM/huawei/prefmode/response", test_prefmode_response);
g_test_add_func ("/MM/huawei/syscfg", test_syscfg); g_test_add_func ("/MM/huawei/syscfg", test_syscfg);
g_test_add_func ("/MM/huawei/syscfg/response", test_syscfg_response);
g_test_add_func ("/MM/huawei/syscfgex", test_syscfgex); g_test_add_func ("/MM/huawei/syscfgex", test_syscfgex);
return g_test_run (); return g_test_run ();