aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-base-modem.c1
-rw-r--r--src/mm-port-probe.c1
-rw-r--r--src/mm-port-serial-at.c27
-rw-r--r--src/mm-port-serial-at.h6
-rw-r--r--src/mm-serial-parsers.c21
-rw-r--r--src/mm-serial-parsers.h2
-rw-r--r--src/plugins/wavecom/mm-broadband-modem-wavecom.c1
-rw-r--r--src/tests/test-at-serial-port.c6
-rw-r--r--test/mmtty.c1
9 files changed, 41 insertions, 25 deletions
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c
index eb7c04ca..3558775b 100644
--- a/src/mm-base-modem.c
+++ b/src/mm-base-modem.c
@@ -468,6 +468,7 @@ base_modem_internal_grab_port (MMBaseModem *self,
if (MM_IS_PORT_SERIAL_AT (port)) {
mm_port_serial_at_set_response_parser (MM_PORT_SERIAL_AT (port),
mm_serial_parser_v1_parse,
+ mm_serial_parser_v1_remove_echo,
mm_serial_parser_v1_new (),
mm_serial_parser_v1_destroy);
/* Prefer plugin-provided flags to the generic ones */
diff --git a/src/mm-port-probe.c b/src/mm-port-probe.c
index 6b53907b..b3bac90c 100644
--- a/src/mm-port-probe.c
+++ b/src/mm-port-probe.c
@@ -1434,6 +1434,7 @@ serial_open_at (MMPortProbe *self)
NULL);
mm_port_serial_at_set_response_parser (MM_PORT_SERIAL_AT (ctx->serial),
mm_serial_parser_v1_parse,
+ mm_serial_parser_v1_remove_echo,
parser,
mm_serial_parser_v1_destroy);
}
diff --git a/src/mm-port-serial-at.c b/src/mm-port-serial-at.c
index 90c0af70..ca2cc540 100644
--- a/src/mm-port-serial-at.c
+++ b/src/mm-port-serial-at.c
@@ -42,6 +42,7 @@ enum {
struct _MMPortSerialAtPrivate {
/* Response parser data */
MMPortSerialAtResponseParserFn response_parser_fn;
+ MMPortSerialAtRemoveEchoFn remove_echo_fn;
gpointer response_parser_user_data;
GDestroyNotify response_parser_notify;
@@ -61,6 +62,7 @@ struct _MMPortSerialAtPrivate {
void
mm_port_serial_at_set_response_parser (MMPortSerialAt *self,
MMPortSerialAtResponseParserFn fn,
+ MMPortSerialAtRemoveEchoFn echo_fn,
gpointer user_data,
GDestroyNotify notify)
{
@@ -70,30 +72,11 @@ mm_port_serial_at_set_response_parser (MMPortSerialAt *self,
self->priv->response_parser_notify (self->priv->response_parser_user_data);
self->priv->response_parser_fn = fn;
+ self->priv->remove_echo_fn = echo_fn;
self->priv->response_parser_user_data = user_data;
self->priv->response_parser_notify = notify;
}
-void
-mm_port_serial_at_remove_echo (GByteArray *response)
-{
- guint i;
-
- if (response->len <= 2)
- return;
-
- for (i = 0; i < (response->len - 1); i++) {
- /* If there is any content before the first
- * <CR><LF>, assume it's echo or garbage, and skip it */
- if (response->data[i] == '\r' && response->data[i + 1] == '\n') {
- if (i > 0)
- g_byte_array_remove_range (response, 0, i);
- /* else, good, we're already started with <CR><LF> */
- break;
- }
- }
-}
-
static MMPortSerialResponseType
parse_response (MMPortSerial *port,
GByteArray *response,
@@ -109,7 +92,7 @@ parse_response (MMPortSerial *port,
/* Remove echo */
if (self->priv->remove_echo)
- mm_port_serial_at_remove_echo (response);
+ self->priv->remove_echo_fn (self->priv->response_parser_user_data, response);
/* If there's no response to receive, we're done; e.g. if we only got
* unsolicited messages */
@@ -243,7 +226,7 @@ parse_unsolicited (MMPortSerial *port, GByteArray *response)
/* Remove echo */
if (self->priv->remove_echo)
- mm_port_serial_at_remove_echo (response);
+ self->priv->remove_echo_fn (self->priv->response_parser_user_data, response);
for (iter = self->priv->unsolicited_msg_handlers; iter; iter = iter->next) {
MMAtUnsolicitedMsgHandler *handler = (MMAtUnsolicitedMsgHandler *) iter->data;
diff --git a/src/mm-port-serial-at.h b/src/mm-port-serial-at.h
index 9ed6a218..8377d8da 100644
--- a/src/mm-port-serial-at.h
+++ b/src/mm-port-serial-at.h
@@ -65,6 +65,9 @@ typedef void (*MMPortSerialAtUnsolicitedMsgFn) (MMPortSerialAt *port,
GMatchInfo *match_info,
gpointer user_data);
+typedef void (*MMPortSerialAtRemoveEchoFn) (gpointer user_data,
+ GByteArray *response);
+
#define MM_PORT_SERIAL_AT_REMOVE_ECHO "remove-echo"
#define MM_PORT_SERIAL_AT_INIT_SEQUENCE_ENABLED "init-sequence-enabled"
#define MM_PORT_SERIAL_AT_INIT_SEQUENCE "init-sequence"
@@ -97,6 +100,7 @@ void mm_port_serial_at_enable_unsolicited_msg_handler (MMPortSerialAt *self,
void mm_port_serial_at_set_response_parser (MMPortSerialAt *self,
MMPortSerialAtResponseParserFn fn,
+ MMPortSerialAtRemoveEchoFn echo_fn,
gpointer user_data,
GDestroyNotify notify);
@@ -113,8 +117,6 @@ gchar *mm_port_serial_at_command_finish (MMPortSerialAt *self,
GError **error);
/* Just for unit tests */
-void mm_port_serial_at_remove_echo (GByteArray *response);
-
void mm_port_serial_at_set_flags (MMPortSerialAt *self,
MMPortSerialAtFlag flags);
diff --git a/src/mm-serial-parsers.c b/src/mm-serial-parsers.c
index a577faee..d8dc1e5d 100644
--- a/src/mm-serial-parsers.c
+++ b/src/mm-serial-parsers.c
@@ -160,6 +160,27 @@ mm_serial_parser_v1_add_filter (gpointer data,
parser->filter_user_data = user_data;
}
+void
+mm_serial_parser_v1_remove_echo (gpointer data,
+ GByteArray *response)
+{
+ guint i;
+
+ if (response->len <= 2)
+ return;
+
+ for (i = 0; i < (response->len - 1); i++) {
+ /* If there is any content before the first
+ * <CR><LF>, assume it's echo or garbage, and skip it */
+ if (response->data[i] == '\r' && response->data[i + 1] == '\n') {
+ if (i > 0)
+ g_byte_array_remove_range (response, 0, i);
+ /* else, good, we're already started with <CR><LF> */
+ break;
+ }
+ }
+}
+
gboolean
mm_serial_parser_v1_parse (gpointer data,
GString *response,
diff --git a/src/mm-serial-parsers.h b/src/mm-serial-parsers.h
index 523597b9..268f03f7 100644
--- a/src/mm-serial-parsers.h
+++ b/src/mm-serial-parsers.h
@@ -26,6 +26,8 @@ gboolean mm_serial_parser_v1_parse (gpointer parser,
GString *response,
gpointer log_object,
GError **error);
+void mm_serial_parser_v1_remove_echo (gpointer parser,
+ GByteArray *response);
void mm_serial_parser_v1_destroy (gpointer parser);
gboolean mm_serial_parser_v1_is_known_error (const GError *error);
diff --git a/src/plugins/wavecom/mm-broadband-modem-wavecom.c b/src/plugins/wavecom/mm-broadband-modem-wavecom.c
index 99930110..7220df74 100644
--- a/src/plugins/wavecom/mm-broadband-modem-wavecom.c
+++ b/src/plugins/wavecom/mm-broadband-modem-wavecom.c
@@ -1245,6 +1245,7 @@ setup_ports (MMBroadbandModem *self)
mm_port_serial_at_set_response_parser (MM_PORT_SERIAL_AT (primary),
mm_serial_parser_v1_parse,
+ mm_serial_parser_v1_remove_echo,
parser,
mm_serial_parser_v1_destroy);
}
diff --git a/src/tests/test-at-serial-port.c b/src/tests/test-at-serial-port.c
index 5372c478..5592971d 100644
--- a/src/tests/test-at-serial-port.c
+++ b/src/tests/test-at-serial-port.c
@@ -89,6 +89,7 @@ at_serial_echo_removal (void)
guint i;
for (i = 0; i < G_N_ELEMENTS (echo_removal_tests); i++) {
+ gpointer parser;
GByteArray *ba;
/* Note that we add last NUL also to the byte array, so that we can compare
@@ -98,7 +99,9 @@ at_serial_echo_removal (void)
(guint8 *)echo_removal_tests[i].original,
strlen (echo_removal_tests[i].original) + 1);
- mm_port_serial_at_remove_echo (ba);
+ parser = mm_serial_parser_v1_new ();
+ mm_serial_parser_v1_remove_echo (parser, ba);
+ mm_serial_parser_v1_destroy (parser);
g_assert_cmpstr ((gchar *)ba->data, ==, echo_removal_tests[i].without_echo);
@@ -119,6 +122,7 @@ _run_parse_test (const ParseResponseTest tests[], guint number_of_tests)
parser = mm_serial_parser_v1_new ();
response = g_string_new (tests[i].response);
found = mm_serial_parser_v1_parse (parser, response, NULL, &error);
+ mm_serial_parser_v1_destroy (parser);
/* Verify if we expect a match or not */
g_assert_cmpint (found, ==, tests[i].found);
diff --git a/test/mmtty.c b/test/mmtty.c
index db22c268..42cc826f 100644
--- a/test/mmtty.c
+++ b/test/mmtty.c
@@ -237,6 +237,7 @@ start_cb (void)
/* Set common response parser */
mm_port_serial_at_set_response_parser (MM_PORT_SERIAL_AT (port),
mm_serial_parser_v1_parse,
+ mm_serial_parser_v1_remove_echo,
mm_serial_parser_v1_new (),
mm_serial_parser_v1_destroy);