aboutsummaryrefslogtreecommitdiff
path: root/src/mm-serial-parsers.c
diff options
context:
space:
mode:
authorGuido Günther <agx@sigxcpu.org>2014-02-05 08:38:23 +0100
committerGuido Günther <agx@sigxcpu.org>2014-02-05 08:38:23 +0100
commit7fbee6ce27176bfc7ae9b34a4de9452cf5f6fa43 (patch)
tree5cabb0ab457846912d99ef675160be0dce4fbe6f /src/mm-serial-parsers.c
parentdc645b92b9a7db3076ae34986ac219d01677d124 (diff)
Imported Upstream version 0.4+git.20110124t203624.00b6cceupstream/0.4+git.20110124t203624.00b6cce
Diffstat (limited to 'src/mm-serial-parsers.c')
-rw-r--r--src/mm-serial-parsers.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/src/mm-serial-parsers.c b/src/mm-serial-parsers.c
index 7c9598e..75bcce4 100644
--- a/src/mm-serial-parsers.c
+++ b/src/mm-serial-parsers.c
@@ -19,6 +19,7 @@
#include "mm-serial-parsers.h"
#include "mm-errors.h"
+#include "mm-log.h"
/* Clean up the response by removing control characters like <CR><LF> etc */
static void
@@ -33,6 +34,13 @@ response_clean (GString *response)
s -= 2;
}
+ /* Contains duplicate '<CR><CR>' */
+ s = response->str;
+ while ((response->len >= 2) && (*s == '\r') && (*(s + 1) == '\r')) {
+ g_string_erase (response, 0, 1);
+ s = response->str;
+ }
+
/* Starts with one or more '<CR><LF>' */
s = response->str;
while ((response->len >= 2) && (*s == '\r') && (*(s + 1) == '\n')) {
@@ -167,7 +175,7 @@ mm_serial_parser_v0_parse (gpointer data,
response_clean (response);
if (local_error) {
- g_debug ("Got failure code %d: %s", local_error->code, local_error->message);
+ mm_dbg ("Got failure code %d: %s", local_error->code, local_error->message);
g_propagate_error (error, local_error);
}
@@ -192,6 +200,7 @@ typedef struct {
GRegex *regex_connect;
GRegex *regex_cme_error;
GRegex *regex_cme_error_str;
+ GRegex *regex_ezx_error;
GRegex *regex_unknown_error;
GRegex *regex_connect_failed;
} MMSerialParserV1;
@@ -208,6 +217,7 @@ mm_serial_parser_v1_new (void)
parser->regex_connect = g_regex_new ("\\r\\nCONNECT.*\\r\\n", flags, 0, NULL);
parser->regex_cme_error = g_regex_new ("\\r\\n\\+CME ERROR: (\\d+)\\r\\n$", flags, 0, NULL);
parser->regex_cme_error_str = g_regex_new ("\\r\\n\\+CME ERROR: ([^\\n\\r]+)\\r\\n$", flags, 0, NULL);
+ parser->regex_ezx_error = g_regex_new ("\\r\\n\\MODEM ERROR: (\\d+)\\r\\n$", flags, 0, NULL);
parser->regex_unknown_error = g_regex_new ("\\r\\n(ERROR)|(COMMAND NOT SUPPORT)\\r\\n$", flags, 0, NULL);
parser->regex_connect_failed = g_regex_new ("\\r\\n(NO CARRIER)|(BUSY)|(NO ANSWER)|(NO DIALTONE)\\r\\n$", flags, 0, NULL);
@@ -273,6 +283,19 @@ mm_serial_parser_v1_parse (gpointer data,
goto done;
}
+ /* Motorola EZX errors */
+ found = g_regex_match_full (parser->regex_ezx_error,
+ response->str, response->len,
+ 0, 0, &match_info, NULL);
+ if (found) {
+ str = g_match_info_fetch (match_info, 1);
+ g_assert (str);
+ local_error = mm_mobile_error_for_code (MM_MOBILE_ERROR_UNKNOWN);
+ g_free (str);
+ g_match_info_free (match_info);
+ goto done;
+ }
+
/* Last resort; unknown error */
found = g_regex_match_full (parser->regex_unknown_error,
response->str, response->len,
@@ -314,7 +337,7 @@ done:
response_clean (response);
if (local_error) {
- g_debug ("Got failure code %d: %s", local_error->code, local_error->message);
+ mm_dbg ("Got failure code %d: %s", local_error->code, local_error->message);
g_propagate_error (error, local_error);
}
@@ -332,6 +355,7 @@ mm_serial_parser_v1_destroy (gpointer data)
g_regex_unref (parser->regex_connect);
g_regex_unref (parser->regex_cme_error);
g_regex_unref (parser->regex_cme_error_str);
+ g_regex_unref (parser->regex_ezx_error);
g_regex_unref (parser->regex_unknown_error);
g_regex_unref (parser->regex_connect_failed);