huawei: new ^SYSCFGEX? response parser
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 ();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user