From c4c1350acbb8f5a2d0a8c288a4b6566144e85844 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Mon, 8 Jun 2009 14:06:07 -0500 Subject: [PATCH] Fix multiline responses in GAtChat The standard is a bit fuzzy on how multiline responses are returned GAtChat assumed that they will always start with , however this doesn't seem to be correct. Add a new state which is entered when a response is obtained. If is encountered, then it is processed regularly, otherwise the parser assumes that the next line is part of the multiline response --- gatchat/gatchat.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gatchat/gatchat.c b/gatchat/gatchat.c index e54e5d9..2492e54 100644 --- a/gatchat/gatchat.c +++ b/gatchat/gatchat.c @@ -44,6 +44,7 @@ enum chat_state { PARSER_STATE_RESPONSE, PARSER_STATE_TERMINATOR_CR, PARSER_STATE_RESPONSE_COMPLETE, + PARSER_STATE_GUESS_MULTILINE_RESPONSE, PARSER_STATE_PDU, PARSER_STATE_PDU_CR, PARSER_STATE_PDU_COMPLETE, @@ -405,6 +406,9 @@ static gboolean g_at_chat_handle_command_response(GAtChat *p, } out: + if (!(p->flags & G_AT_CHAT_FLAG_NO_LEADING_CRLF)) + p->state = PARSER_STATE_GUESS_MULTILINE_RESPONSE; + p->response_lines = g_slist_prepend(p->response_lines, line); @@ -554,6 +558,13 @@ static inline void parse_char(GAtChat *chat, char byte) chat->state = PARSER_STATE_IDLE; break; + case PARSER_STATE_GUESS_MULTILINE_RESPONSE: + if (byte == '\r') + chat->state = PARSER_STATE_INITIAL_CR; + else + chat->state = PARSER_STATE_RESPONSE; + break; + case PARSER_STATE_PDU: if (byte == '\r') chat->state = PARSER_STATE_PDU_CR; -- 1.7.9.5