diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2013-11-10 21:28:17 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2013-12-09 23:07:19 +0100 |
commit | 02839b2e4468afcd96e1259e60f5f4665057581a (patch) | |
tree | 7b9cd66e120866edcaa73828248fb15e8d46cd91 | |
parent | 9ac136028b710f6b65c7fa2b61a535afb3b0b192 (diff) |
huawei: new ^SYSCFGEX? response parser
-rw-r--r-- | plugins/huawei/mm-modem-helpers-huawei.c | 71 | ||||
-rw-r--r-- | plugins/huawei/mm-modem-helpers-huawei.h | 7 | ||||
-rw-r--r-- | plugins/huawei/tests/test-modem-helpers-huawei.c | 138 |
3 files changed, 216 insertions, 0 deletions
diff --git a/plugins/huawei/mm-modem-helpers-huawei.c b/plugins/huawei/mm-modem-helpers-huawei.c index d8c11ea9..926ca770 100644 --- a/plugins/huawei/mm-modem-helpers-huawei.c +++ b/plugins/huawei/mm-modem-helpers-huawei.c @@ -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; +} diff --git a/plugins/huawei/mm-modem-helpers-huawei.h b/plugins/huawei/mm-modem-helpers-huawei.h index 07184e84..944e7a5f 100644 --- a/plugins/huawei/mm-modem-helpers-huawei.h +++ b/plugins/huawei/mm-modem-helpers-huawei.h @@ -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 */ diff --git a/plugins/huawei/tests/test-modem-helpers-huawei.c b/plugins/huawei/tests/test-modem-helpers-huawei.c index 20dcf5f6..dc03973a 100644 --- a/plugins/huawei/tests/test-modem-helpers-huawei.c +++ b/plugins/huawei/tests/test-modem-helpers-huawei.c @@ -830,6 +830,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 _mm_log (const char *loc, @@ -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 (); } |