diff options
author | Denis Kenzior <denis.kenzior@intel.com> | 2009-09-04 13:27:37 -0500 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2009-09-04 20:37:49 -0500 |
commit | 918a8ee7f3ac939a90e37d4330e1dfc0adaf6cf9 (patch) | |
tree | 59b2a534e99dc932aeb702ce70b36052bd5c0e70 /plugins/calypso.c | |
parent | 85cbb8bfe9a36d3875c7242df8f75709b6ba49fa (diff) | |
download | ofono-918a8ee7f3ac939a90e37d4330e1dfc0adaf6cf9.tar.bz2 |
Make calypso plugin use the permissive parser
Diffstat (limited to 'plugins/calypso.c')
-rw-r--r-- | plugins/calypso.c | 158 |
1 files changed, 1 insertions, 157 deletions
diff --git a/plugins/calypso.c b/plugins/calypso.c index c6ebec31..bc32258f 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); |