From: Denis Kenzior Date: Mon, 8 Jun 2009 19:06:07 +0000 (-0500) Subject: Fix multiline responses in GAtChat X-Git-Tag: 2.0_alpha~3701 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c4c1350acbb8f5a2d0a8c288a4b6566144e85844;p=framework%2Fconnectivity%2Fconnman.git 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 --- 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;