From 918a8ee7f3ac939a90e37d4330e1dfc0adaf6cf9 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Fri, 4 Sep 2009 13:27:37 -0500 Subject: [PATCH] Make calypso plugin use the permissive parser --- plugins/calypso.c | 158 +----------------------------------------------------- 1 file changed, 1 insertion(+), 157 deletions(-) diff --git a/plugins/calypso.c b/plugins/calypso.c index c6ebec3..bc32258 100644 --- a/plugins/calypso.c +++ b/plugins/calypso.c @@ -65,161 +65,6 @@ enum powercycle_state { POWERCYCLE_STATE_FINISHED, }; -enum calypso_state { - CALYPSO_STATE_IDLE = 0, - CALYPSO_STATE_INITIAL_CR, - CALYPSO_STATE_INITIAL_LF, - CALYPSO_STATE_RESPONSE, - CALYPSO_STATE_TERMINATOR_CR, - CALYPSO_STATE_GUESS_MULTILINE_RESPONSE, - CALYPSO_STATE_MULTILINE_RESPONSE, - CALYPSO_STATE_MULTILINE_TERMINATOR_CR, - CALYPSO_STATE_PDU_CHECK_EXTRA_CR, - CALYPSO_STATE_PDU_CHECK_EXTRA_LF, - CALYPSO_STATE_PDU, - CALYPSO_STATE_PDU_CR, - CALYPSO_STATE_PROMPT, -}; - -static void calypso_hint(GAtSyntax *syntax, GAtSyntaxExpectHint hint) -{ - switch (hint) { - case G_AT_SYNTAX_EXPECT_PDU: - syntax->state = CALYPSO_STATE_PDU_CHECK_EXTRA_CR; - break; - case G_AT_SYNTAX_EXPECT_MULTILINE: - syntax->state = CALYPSO_STATE_GUESS_MULTILINE_RESPONSE; - break; - default: - break; - }; -} - -static GAtSyntaxResult calypso_feed(GAtSyntax *syntax, - const char *bytes, gsize *len) -{ - gsize i = 0; - GAtSyntaxResult res = G_AT_SYNTAX_RESULT_UNSURE; - - while (i < *len) { - char byte = bytes[i]; - - switch (syntax->state) { - case CALYPSO_STATE_IDLE: - if (byte == '\r') - syntax->state = CALYPSO_STATE_INITIAL_CR; - else - syntax->state = CALYPSO_STATE_RESPONSE; - break; - - case CALYPSO_STATE_INITIAL_CR: - if (byte == '\n') - syntax->state = CALYPSO_STATE_INITIAL_LF; - break; - - case CALYPSO_STATE_INITIAL_LF: - if (byte == '\r') - syntax->state = CALYPSO_STATE_TERMINATOR_CR; - else if (byte == '>') - syntax->state = CALYPSO_STATE_PROMPT; - else - syntax->state = CALYPSO_STATE_RESPONSE; - break; - - case CALYPSO_STATE_RESPONSE: - if (byte == '\r') - syntax->state = CALYPSO_STATE_TERMINATOR_CR; - break; - - case CALYPSO_STATE_TERMINATOR_CR: - syntax->state = CALYPSO_STATE_IDLE; - - if (byte == '\n') { - i += 1; - res = G_AT_SYNTAX_RESULT_LINE; - } else - res = G_AT_SYNTAX_RESULT_UNRECOGNIZED; - - goto out; - - case CALYPSO_STATE_GUESS_MULTILINE_RESPONSE: - if (byte == '\r') - syntax->state = CALYPSO_STATE_INITIAL_CR; - else - syntax->state = CALYPSO_STATE_MULTILINE_RESPONSE; - break; - - case CALYPSO_STATE_MULTILINE_RESPONSE: - if (byte == '\r') - syntax->state = CALYPSO_STATE_MULTILINE_TERMINATOR_CR; - break; - - case CALYPSO_STATE_MULTILINE_TERMINATOR_CR: - syntax->state = CALYPSO_STATE_IDLE; - - if (byte == '\n') { - i += 1; - res = G_AT_SYNTAX_RESULT_MULTILINE; - } else - res = G_AT_SYNTAX_RESULT_UNRECOGNIZED; - - goto out; - - case CALYPSO_STATE_PDU_CHECK_EXTRA_CR: - if (byte == '\r') - syntax->state = CALYPSO_STATE_PDU_CHECK_EXTRA_LF; - else - syntax->state = CALYPSO_STATE_PDU; - break; - - case CALYPSO_STATE_PDU_CHECK_EXTRA_LF: - res = G_AT_SYNTAX_RESULT_UNRECOGNIZED; - syntax->state = CALYPSO_STATE_PDU; - - if (byte == '\n') - i += 1; - - goto out; - - case CALYPSO_STATE_PDU: - if (byte == '\r') - syntax->state = CALYPSO_STATE_PDU_CR; - break; - - case CALYPSO_STATE_PDU_CR: - syntax->state = CALYPSO_STATE_IDLE; - - if (byte == '\n') { - i += 1; - res = G_AT_SYNTAX_RESULT_PDU; - } else - res = G_AT_SYNTAX_RESULT_UNRECOGNIZED; - - goto out; - - case CALYPSO_STATE_PROMPT: - if (byte == ' ') { - syntax->state = CALYPSO_STATE_IDLE; - i += 1; - res = G_AT_SYNTAX_RESULT_PROMPT; - goto out; - } - - syntax->state = CALYPSO_STATE_RESPONSE; - return G_AT_SYNTAX_RESULT_UNSURE; - - default: - break; - }; - - i += 1; - } - -out: - *len = i; - return res; -} - struct calypso_data { GAtChat *chat; enum powercycle_state state; @@ -365,8 +210,7 @@ static void modem_initialize(struct ofono_modem *modem) /* Calypso is normally compliant to 27.007, except the vendor-specific * notifications (like %CSTAT) are not prefixed by \r\n */ - syntax = g_at_syntax_new_full(calypso_feed, calypso_hint, - CALYPSO_STATE_IDLE); + syntax = g_at_syntax_new_gsm_permissive(); chat = g_at_chat_new(io, syntax); g_at_syntax_unref(syntax); g_io_channel_unref(io); -- 2.7.4