aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2013-11-10 21:28:17 +0100
committerAleksander Morgado <aleksander@lanedo.com>2013-12-09 23:07:19 +0100
commit02839b2e4468afcd96e1259e60f5f4665057581a (patch)
tree7b9cd66e120866edcaa73828248fb15e8d46cd91
parent9ac136028b710f6b65c7fa2b61a535afb3b0b192 (diff)
huawei: new ^SYSCFGEX? response parser
-rw-r--r--plugins/huawei/mm-modem-helpers-huawei.c71
-rw-r--r--plugins/huawei/mm-modem-helpers-huawei.h7
-rw-r--r--plugins/huawei/tests/test-modem-helpers-huawei.c138
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 ();
}