Fix multiline responses in GAtChat
authorDenis Kenzior <denkenz@gmail.com>
Mon, 8 Jun 2009 19:06:07 +0000 (14:06 -0500)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 9 Jun 2009 05:39:16 +0000 (07:39 +0200)
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

gatchat/gatchat.c

index e54e5d9..2492e54 100644 (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;