huawei: new ^SYSCFGEX? response parser

This commit is contained in:
Aleksander Morgado
2013-12-09 23:07:19 +01:00
parent 9ac136028b
commit 02839b2e44
3 changed files with 216 additions and 0 deletions
+71
View File
@@ -954,3 +954,74 @@ mm_huawei_parse_syscfgex_test (const gchar *response,
return out;
}
/*****************************************************************************/
/* ^SYSCFGEX response parser */
const MMHuaweiSyscfgexCombination *
mm_huawei_parse_syscfgex_response (const gchar *response,
const GArray *supported_mode_combinations,
GError **error)
{
gchar **split;
guint i;
gsize len;
gchar *str;
if (!response || !g_str_has_prefix (response, "^SYSCFGEX:")) {
g_set_error (error,
MM_CORE_ERROR,
MM_CORE_ERROR_FAILED,
"Missing ^SYSCFGEX prefix");
return NULL;
}
/* Format:
*
* ^SYSCFGEX: "00",3FFFFFFF,1,2,7FFFFFFFFFFFFFFF
* ^SYSCFGEX: <mode>,<band>,<roam>,<srvdomain>,<lte-band>
*/
response = mm_strip_tag (response, "^SYSCFGEX:");
split = g_strsplit (response, ",", -1);
/* We expect 5 string chunks */
if (g_strv_length (split) < 5) {
g_set_error (error,
MM_CORE_ERROR,
MM_CORE_ERROR_FAILED,
"Unexpected ^SYSCFGEX response format");
g_strfreev (split);
return NULL;
}
/* Unquote */
str = split[0];
len = strlen (str);
if ((len >= 2) && (str[0] == '"') && (str[len - 1] == '"')) {
str[0] = ' ';
str[len - 1] = ' ';
str = g_strstrip (str);
}
/* Look for current modes among the supported ones */
for (i = 0; i < supported_mode_combinations->len; i++) {
const MMHuaweiSyscfgexCombination *combination;
combination = &g_array_index (supported_mode_combinations,
MMHuaweiSyscfgexCombination,
i);
if (g_str_equal (str, combination->mode_str)) {
g_strfreev (split);
return combination;
}
}
g_set_error (error,
MM_CORE_ERROR,
MM_CORE_ERROR_FAILED,
"No SYSCFGEX combination found matching the current one (%s)",
str);
g_strfreev (split);
return NULL;
}
+7
View File
@@ -102,4 +102,11 @@ typedef struct {
GArray *mm_huawei_parse_syscfgex_test (const gchar *response,
GError **error);
/*****************************************************************************/
/* ^SYSCFGEX response parser */
const MMHuaweiSyscfgexCombination *mm_huawei_parse_syscfgex_response (const gchar *response,
const GArray *supported_mode_combinations,
GError **error);
#endif /* MM_MODEM_HELPERS_HUAWEI_H */
@@ -829,6 +829,143 @@ test_syscfgex (void)
}
}
/*****************************************************************************/
/* Test ^SYSCFGEX? responses */
typedef struct {
const gchar *str;
const gchar *format;
MMModemMode allowed;
MMModemMode preferred;
} SyscfgexResponseTest;
static const SyscfgexResponseTest syscfgex_response_tests[] = {
{
.str = "^SYSCFGEX: \"00\",3FFFFFFF,1,2,7FFFFFFFFFFFFFFF",
.format = "^SYSCFGEX: (\"00\",\"03\",\"02\",\"01\",\"99\"),"
"((2000004e80380,\"GSM850/GSM900/GSM1800/GSM1900/WCDMA850/WCDMA900/WCDMA1900/WCDMA2100\"),(3fffffff,\"All Bands\")),"
"(0-3),"
"(0-4),"
"((800c5,\"LTE2100/LTE1800/LTE2600/LTE900/LTE800\"),(7fffffffffffffff,\"All bands\"))"
"\r\n",
.allowed = (MM_MODEM_MODE_4G | MM_MODEM_MODE_3G | MM_MODEM_MODE_2G),
.preferred = MM_MODEM_MODE_NONE
},
{
.str = "^SYSCFGEX: \"03\",3FFFFFFF,1,2,7FFFFFFFFFFFFFFF",
.format = "^SYSCFGEX: (\"00\",\"03\",\"02\",\"01\",\"99\"),"
"((2000004e80380,\"GSM850/GSM900/GSM1800/GSM1900/WCDMA850/WCDMA900/WCDMA1900/WCDMA2100\"),(3fffffff,\"All Bands\")),"
"(0-3),"
"(0-4),"
"((800c5,\"LTE2100/LTE1800/LTE2600/LTE900/LTE800\"),(7fffffffffffffff,\"All bands\"))"
"\r\n",
.allowed = MM_MODEM_MODE_4G,
.preferred = MM_MODEM_MODE_NONE
},
{
.str = "^SYSCFGEX: \"02\",3FFFFFFF,1,2,7FFFFFFFFFFFFFFF",
.format = "^SYSCFGEX: (\"00\",\"03\",\"02\",\"01\",\"99\"),"
"((2000004e80380,\"GSM850/GSM900/GSM1800/GSM1900/WCDMA850/WCDMA900/WCDMA1900/WCDMA2100\"),(3fffffff,\"All Bands\")),"
"(0-3),"
"(0-4),"
"((800c5,\"LTE2100/LTE1800/LTE2600/LTE900/LTE800\"),(7fffffffffffffff,\"All bands\"))"
"\r\n",
.allowed = MM_MODEM_MODE_3G,
.preferred = MM_MODEM_MODE_NONE
},
{
.str = "^SYSCFGEX: \"01\",3FFFFFFF,1,2,7FFFFFFFFFFFFFFF",
.format = "^SYSCFGEX: (\"00\",\"03\",\"02\",\"01\",\"99\"),"
"((2000004e80380,\"GSM850/GSM900/GSM1800/GSM1900/WCDMA850/WCDMA900/WCDMA1900/WCDMA2100\"),(3fffffff,\"All Bands\")),"
"(0-3),"
"(0-4),"
"((800c5,\"LTE2100/LTE1800/LTE2600/LTE900/LTE800\"),(7fffffffffffffff,\"All bands\"))"
"\r\n",
.allowed = MM_MODEM_MODE_2G,
.preferred = MM_MODEM_MODE_NONE
},
{
.str = "^SYSCFGEX: \"00\",3fffffff,1,2,",
.format = "^SYSCFGEX: (\"00\",\"01\",\"02\",\"0102\",\"0201\"),"
"((3fffffff,\"All Bands\"),(2000000400180,\"GSM900/GSM1800/WCDMA900/WCDMA2100\"),(6A80000,\"GSM850/GSM1900/WCDMA850/AWS/WCDMA1900\")),"
"(0-2),"
"(0-4),"
"," /* NOTE: Non-LTE modem, LTE Bands EMPTY */
"\r\n",
.allowed = (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G),
.preferred = MM_MODEM_MODE_NONE
},
{
.str = "^SYSCFGEX: \"01\",3fffffff,1,2,",
.format = "^SYSCFGEX: (\"00\",\"01\",\"02\",\"0102\",\"0201\"),"
"((3fffffff,\"All Bands\"),(2000000400180,\"GSM900/GSM1800/WCDMA900/WCDMA2100\"),(6A80000,\"GSM850/GSM1900/WCDMA850/AWS/WCDMA1900\")),"
"(0-2),"
"(0-4),"
"," /* NOTE: Non-LTE modem, LTE Bands EMPTY */
"\r\n",
.allowed = MM_MODEM_MODE_2G,
.preferred = MM_MODEM_MODE_NONE
},
{
.str = "^SYSCFGEX: \"02\",3fffffff,1,2,",
.format = "^SYSCFGEX: (\"00\",\"01\",\"02\",\"0102\",\"0201\"),"
"((3fffffff,\"All Bands\"),(2000000400180,\"GSM900/GSM1800/WCDMA900/WCDMA2100\"),(6A80000,\"GSM850/GSM1900/WCDMA850/AWS/WCDMA1900\")),"
"(0-2),"
"(0-4),"
"," /* NOTE: Non-LTE modem, LTE Bands EMPTY */
"\r\n",
.allowed = MM_MODEM_MODE_3G,
.preferred = MM_MODEM_MODE_NONE
},
{
.str = "^SYSCFGEX: \"0102\",3fffffff,1,2,",
.format = "^SYSCFGEX: (\"00\",\"01\",\"02\",\"0102\",\"0201\"),"
"((3fffffff,\"All Bands\"),(2000000400180,\"GSM900/GSM1800/WCDMA900/WCDMA2100\"),(6A80000,\"GSM850/GSM1900/WCDMA850/AWS/WCDMA1900\")),"
"(0-2),"
"(0-4),"
"," /* NOTE: Non-LTE modem, LTE Bands EMPTY */
"\r\n",
.allowed = (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G),
.preferred = MM_MODEM_MODE_2G
},
{
.str = "^SYSCFGEX: \"0201\",3fffffff,1,2,",
.format = "^SYSCFGEX: (\"00\",\"01\",\"02\",\"0102\",\"0201\"),"
"((3fffffff,\"All Bands\"),(2000000400180,\"GSM900/GSM1800/WCDMA900/WCDMA2100\"),(6A80000,\"GSM850/GSM1900/WCDMA850/AWS/WCDMA1900\")),"
"(0-2),"
"(0-4),"
"," /* NOTE: Non-LTE modem, LTE Bands EMPTY */
"\r\n",
.allowed = (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G),
.preferred = MM_MODEM_MODE_3G
}
};
static void
test_syscfgex_response (void)
{
guint i;
for (i = 0; i < G_N_ELEMENTS (syscfgex_response_tests); i++) {
GArray *combinations = NULL;
const MMHuaweiSyscfgexCombination *found;
GError *error = NULL;
combinations = mm_huawei_parse_syscfgex_test (syscfgex_response_tests[i].format, NULL);
g_assert (combinations != NULL);
found = mm_huawei_parse_syscfgex_response (syscfgex_response_tests[i].str,
combinations,
&error);
g_assert (found != NULL);
g_assert_cmpuint (found->allowed, ==, syscfgex_response_tests[i].allowed);
g_assert_cmpuint (found->preferred, ==, syscfgex_response_tests[i].preferred);
g_array_unref (combinations);
}
}
/*****************************************************************************/
void
@@ -866,6 +1003,7 @@ int main (int argc, char **argv)
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/response", test_syscfgex_response);
return g_test_run ();
}