Enable compilation in maemo fremantle sdk.
[connman] / gatchat / gatchat.c
index e54e5d9..af2147b 100644 (file)
@@ -44,6 +44,10 @@ enum chat_state {
        PARSER_STATE_RESPONSE,
        PARSER_STATE_TERMINATOR_CR,
        PARSER_STATE_RESPONSE_COMPLETE,
+       PARSER_STATE_GUESS_MULTILINE_RESPONSE,
+       PARSER_STATE_MULTILINE_RESPONSE,
+       PARSER_STATE_MULTILINE_TERMINATOR_CR,
+       PARSER_STATE_MULTILINE_COMPLETE,
        PARSER_STATE_PDU,
        PARSER_STATE_PDU_CR,
        PARSER_STATE_PDU_COMPLETE,
@@ -405,13 +409,16 @@ 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);
 
        return TRUE;
 }
 
-static void have_line(GAtChat *p)
+static void have_line(GAtChat *p, gboolean strip_preceding)
 {
        /* We're not going to copy terminal <CR><LF> */
        unsigned int len = p->read_so_far - 2;
@@ -419,7 +426,7 @@ static void have_line(GAtChat *p)
        struct at_command *cmd;
 
        /* If we have preceding <CR><LF> modify the len */
-       if ((p->flags & G_AT_CHAT_FLAG_NO_LEADING_CRLF) == 0)
+       if (strip_preceding)
                len -= 2;
 
        /* Make sure we have terminal null */
@@ -430,7 +437,7 @@ static void have_line(GAtChat *p)
                return;
        }
 
-       if ((p->flags & G_AT_CHAT_FLAG_NO_LEADING_CRLF) == 0)
+       if (strip_preceding)
                ring_buffer_drain(p->buf, 2);
        ring_buffer_read(p->buf, str, len);
        ring_buffer_drain(p->buf, 2);
@@ -554,6 +561,23 @@ 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_MULTILINE_RESPONSE;
+               break;
+
+       case PARSER_STATE_MULTILINE_RESPONSE:
+               if (byte == '\r')
+                       chat->state = PARSER_STATE_MULTILINE_TERMINATOR_CR;
+               break;
+
+       case PARSER_STATE_MULTILINE_TERMINATOR_CR:
+               if (byte == '\n')
+                       chat->state = PARSER_STATE_MULTILINE_COMPLETE;
+               break;
+
        case PARSER_STATE_PDU:
                if (byte == '\r')
                        chat->state = PARSER_STATE_PDU_CR;
@@ -572,6 +596,7 @@ static inline void parse_char(GAtChat *chat, char byte)
 
        case PARSER_STATE_RESPONSE_COMPLETE:
        case PARSER_STATE_PDU_COMPLETE:
+       case PARSER_STATE_MULTILINE_COMPLETE:
        default:
                /* This really shouldn't happen */
                assert(TRUE);
@@ -597,10 +622,24 @@ static void new_bytes(GAtChat *p)
                }
 
                if (p->state == PARSER_STATE_RESPONSE_COMPLETE) {
+                       gboolean strip_preceding;
+
+                       if (p->flags & G_AT_CHAT_FLAG_NO_LEADING_CRLF)
+                               strip_preceding = FALSE;
+                       else
+                               strip_preceding = TRUE;
+
+                       len -= p->read_so_far;
+                       wrap -= p->read_so_far;
+
+                       have_line(p, strip_preceding);
+
+                       p->read_so_far = 0;
+               } else if (p->state == PARSER_STATE_MULTILINE_COMPLETE) {
                        len -= p->read_so_far;
                        wrap -= p->read_so_far;
 
-                       have_line(p);
+                       have_line(p, FALSE);
 
                        p->read_so_far = 0;
                } else if (p->state == PARSER_STATE_PDU_COMPLETE) {