diff options
author | Guido Günther <agx@sigxcpu.org> | 2014-02-05 08:38:23 +0100 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2014-02-05 08:38:23 +0100 |
commit | 7fbee6ce27176bfc7ae9b34a4de9452cf5f6fa43 (patch) | |
tree | 5cabb0ab457846912d99ef675160be0dce4fbe6f /src/mm-serial-parsers.c | |
parent | dc645b92b9a7db3076ae34986ac219d01677d124 (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.c | 28 |
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); |