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 | dc645b92b9a7db3076ae34986ac219d01677d124 (patch) | |
tree | 963a5d6ad150a88a2a8ab6d994d79d539e19383a /src/mm-serial-parsers.c | |
parent | 87bd9deec22af69bb27226254803ac5c63b18d78 (diff) |
Imported Upstream version 0.4+git.20100624t180933.6e79d15upstream/0.4+git.20100624t180933.6e79d15
Diffstat (limited to 'src/mm-serial-parsers.c')
-rw-r--r-- | src/mm-serial-parsers.c | 102 |
1 files changed, 60 insertions, 42 deletions
diff --git a/src/mm-serial-parsers.c b/src/mm-serial-parsers.c index 58985d9..7c9598e 100644 --- a/src/mm-serial-parsers.c +++ b/src/mm-serial-parsers.c @@ -190,7 +190,8 @@ mm_serial_parser_v0_destroy (gpointer data) typedef struct { GRegex *regex_ok; GRegex *regex_connect; - GRegex *regex_detailed_error; + GRegex *regex_cme_error; + GRegex *regex_cme_error_str; GRegex *regex_unknown_error; GRegex *regex_connect_failed; } MMSerialParserV1; @@ -205,7 +206,8 @@ mm_serial_parser_v1_new (void) parser->regex_ok = g_regex_new ("\\r\\nOK(\\r\\n)+$", flags, 0, NULL); parser->regex_connect = g_regex_new ("\\r\\nCONNECT.*\\r\\n", flags, 0, NULL); - parser->regex_detailed_error = g_regex_new ("\\r\\n\\+CME ERROR: (\\d+)\\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_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); @@ -219,9 +221,10 @@ mm_serial_parser_v1_parse (gpointer data, { MMSerialParserV1 *parser = (MMSerialParserV1 *) data; GMatchInfo *match_info; - GError *local_error; - int code; + GError *local_error = NULL; gboolean found = FALSE; + char *str; + int code; g_return_val_if_fail (parser != NULL, FALSE); g_return_val_if_fail (response != NULL, FALSE); @@ -243,56 +246,70 @@ mm_serial_parser_v1_parse (gpointer data, } /* Now failures */ - code = MM_MOBILE_ERROR_UNKNOWN; - local_error = NULL; - found = g_regex_match_full (parser->regex_detailed_error, + /* Numeric CME errors */ + found = g_regex_match_full (parser->regex_cme_error, response->str, response->len, 0, 0, &match_info, NULL); - if (found) { - char *str; + str = g_match_info_fetch (match_info, 1); + g_assert (str); + local_error = mm_mobile_error_for_code (atoi (str)); + g_free (str); + g_match_info_free (match_info); + goto done; + } + /* String CME errors */ + found = g_regex_match_full (parser->regex_cme_error_str, + response->str, response->len, + 0, 0, &match_info, NULL); + if (found) { str = g_match_info_fetch (match_info, 1); - if (str) { - code = atoi (str); - g_free (str); - } + g_assert (str); + local_error = mm_mobile_error_for_string (str); + g_free (str); g_match_info_free (match_info); - } else - found = g_regex_match_full (parser->regex_unknown_error, response->str, response->len, 0, 0, NULL, NULL); + goto done; + } - if (found) - local_error = mm_mobile_error_for_code (code); - else { - found = g_regex_match_full (parser->regex_connect_failed, - response->str, response->len, - 0, 0, &match_info, NULL); - if (found) { - char *str; + /* Last resort; unknown error */ + found = g_regex_match_full (parser->regex_unknown_error, + response->str, response->len, + 0, 0, NULL, NULL); + if (found) { + local_error = mm_mobile_error_for_code (MM_MOBILE_ERROR_UNKNOWN); + goto done; + } - str = g_match_info_fetch (match_info, 1); - if (str) { - if (!strcmp (str, "NO CARRIER")) - code = MM_MODEM_CONNECT_ERROR_NO_CARRIER; - else if (!strcmp (str, "BUSY")) - code = MM_MODEM_CONNECT_ERROR_BUSY; - else if (!strcmp (str, "NO ANSWER")) - code = MM_MODEM_CONNECT_ERROR_NO_ANSWER; - else if (!strcmp (str, "NO DIALTONE")) - code = MM_MODEM_CONNECT_ERROR_NO_DIALTONE; - else - /* uhm... make something up (yes, ok, lie!). */ - code = MM_MODEM_CONNECT_ERROR_NO_CARRIER; + /* Connection failures */ + found = g_regex_match_full (parser->regex_connect_failed, + response->str, response->len, + 0, 0, &match_info, NULL); + if (found) { + str = g_match_info_fetch (match_info, 1); + g_assert (str); + + if (!strcmp (str, "NO CARRIER")) + code = MM_MODEM_CONNECT_ERROR_NO_CARRIER; + else if (!strcmp (str, "BUSY")) + code = MM_MODEM_CONNECT_ERROR_BUSY; + else if (!strcmp (str, "NO ANSWER")) + code = MM_MODEM_CONNECT_ERROR_NO_ANSWER; + else if (!strcmp (str, "NO DIALTONE")) + code = MM_MODEM_CONNECT_ERROR_NO_DIALTONE; + else { + /* uhm... make something up (yes, ok, lie!). */ + code = MM_MODEM_CONNECT_ERROR_NO_CARRIER; + } - g_free (str); - } - g_match_info_free (match_info); + g_free (str); + g_match_info_free (match_info); - local_error = mm_modem_connect_error_for_code (code); - } + local_error = mm_modem_connect_error_for_code (code); } +done: if (found) response_clean (response); @@ -313,7 +330,8 @@ mm_serial_parser_v1_destroy (gpointer data) g_regex_unref (parser->regex_ok); g_regex_unref (parser->regex_connect); - g_regex_unref (parser->regex_detailed_error); + g_regex_unref (parser->regex_cme_error); + g_regex_unref (parser->regex_cme_error_str); g_regex_unref (parser->regex_unknown_error); g_regex_unref (parser->regex_connect_failed); |