aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2013-05-30 23:51:05 -0500
committerDan Williams <dcbw@redhat.com>2013-05-31 13:13:09 -0500
commit93fcaf93ce92aa8b335705e66c993dc6f9e628b0 (patch)
treee824c5f1d0ea890f269711d46ac1f5ff67e5b559 /src
parent67d3ed11d383b591d8fec4810eef1d2c9ab4ac37 (diff)
modem-helpers: handle commas within +COPS response items (bgo #701329)
Modems can probably put whatever they want between the quotes for the operator name, including commas. Handle that. https://bugzilla.gnome.org/show_bug.cgi?id=701329
Diffstat (limited to 'src')
-rw-r--r--src/mm-modem-helpers.c2
-rw-r--r--src/tests/test-modem-helpers.c14
2 files changed, 15 insertions, 1 deletions
diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c
index 44a00a53..4bffd11b 100644
--- a/src/mm-modem-helpers.c
+++ b/src/mm-modem-helpers.c
@@ -530,7 +530,7 @@ mm_3gpp_parse_cops_test_response (const gchar *reply,
* +COPS: (2,"","T-Mobile","31026",0),(1,"AT&T","AT&T","310410"),0)
*/
- r = g_regex_new ("\\((\\d),([^,\\)]*),([^,\\)]*),([^,\\)]*)[\\)]?,(\\d)\\)", G_REGEX_UNGREEDY, 0, &inner_error);
+ r = g_regex_new ("\\((\\d),\"([^\"\\)]*)\",([^,\\)]*),([^,\\)]*)[\\)]?,(\\d)\\)", G_REGEX_UNGREEDY, 0, &inner_error);
if (inner_error) {
mm_err ("Invalid regular expression: %s", inner_error->message);
g_error_free (inner_error);
diff --git a/src/tests/test-modem-helpers.c b/src/tests/test-modem-helpers.c
index 6666bb63..d0d189e0 100644
--- a/src/tests/test-modem-helpers.c
+++ b/src/tests/test-modem-helpers.c
@@ -582,6 +582,19 @@ test_cops_response_sek600i (void *f, gpointer d)
}
static void
+test_cops_response_samsung_z810 (void *f, gpointer d)
+{
+ /* Ensure commas within quotes don't trip up the parser */
+ const char *reply = "+COPS: (1,\"T-Mobile USA, In\",\"T-Mobile\",\"310260\",0),(1,\"AT&T\",\"AT&T\",\"310410\",0),,(0,1,2,3,4),(0,1,2)";
+ static MM3gppNetworkInfo expected[] = {
+ { MM_MODEM_3GPP_NETWORK_AVAILABILITY_AVAILABLE, "T-Mobile USA, In", "T-Mobile", "310260", MM_MODEM_ACCESS_TECHNOLOGY_GSM },
+ { MM_MODEM_3GPP_NETWORK_AVAILABILITY_AVAILABLE, "AT&T", "AT&T", "310410", MM_MODEM_ACCESS_TECHNOLOGY_GSM },
+ };
+
+ test_cops_results ("Samsung Z810", reply, &expected[0], G_N_ELEMENTS (expected));
+}
+
+static void
test_cops_response_gsm_invalid (void *f, gpointer d)
{
const gchar *reply = "+COPS: (0,1,2,3),(1,2,3,4)";
@@ -1883,6 +1896,7 @@ int main (int argc, char **argv)
g_test_suite_add (suite, TESTCASE (test_cops_response_n2720, NULL));
g_test_suite_add (suite, TESTCASE (test_cops_response_gobi, NULL));
g_test_suite_add (suite, TESTCASE (test_cops_response_sek600i, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_samsung_z810, NULL));
g_test_suite_add (suite, TESTCASE (test_cops_response_gsm_invalid, NULL));
g_test_suite_add (suite, TESTCASE (test_cops_response_umts_invalid, NULL));