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 <cr><lf>, however
this doesn't seem to be correct.  Add a new state which is entered
when a response is obtained.  If <cr> is encountered, then it
is processed regularly, otherwise the parser assumes that the
next line is part of the multiline response
This commit is contained in:
Denis Kenzior 2009-06-08 14:06:07 -05:00
parent f9f3080781
commit fafdda30b9
1 changed files with 11 additions and 0 deletions

View File

@ -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;