From: Andres Salomon <dilinger@collabora.co.uk>
To: ofono@ofono.org
Subject: [PATCH 2/3] G1: Add a G1 syntax for parsing
Date: Sun, 30 Aug 2009 00:07:08 -0400 [thread overview]
Message-ID: <20090830040708.GA28068@mycelium.queued.net> (raw)
[-- Attachment #1: Type: text/plain, Size: 2984 bytes --]
This is based on the generic_at parser, with unnecessary stuff removed.
The G1 routinely screws up CRLFs, so the parser needs to account for
that. This parser ignores leading CRLFs (which is what reference-ril
does as well), as well as trailing LFs (which are sometimes left out).
CRs are used as end-of-message indicators. Since we're not bothering
tracking CRLFs, there's also no need for a GARBAGE state, or MULTILINE
stuff.
---
plugins/g1.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 85 insertions(+), 2 deletions(-)
diff --git a/plugins/g1.c b/plugins/g1.c
index 70e4914..b0208bc 100644
--- a/plugins/g1.c
+++ b/plugins/g1.c
@@ -33,7 +33,6 @@
#include <glib.h>
#include <gatchat.h>
-#include <gatsyntax.h>
#define OFONO_API_SUBJECT_TO_CHANGE
#include <ofono/plugin.h>
@@ -62,6 +61,90 @@ struct g1_data {
GIOChannel *io;
};
+/* Supply our own syntax parser */
+
+enum G1_STATE_ {
+ G1_STATE_IDLE = 0,
+ G1_STATE_RESPONSE,
+ G1_STATE_GUESS_PDU,
+ G1_STATE_PDU,
+ G1_STATE_PROMPT,
+};
+
+static void g1_hint(GAtSyntax *syntax, GAtSyntaxExpectHint hint)
+{
+ if (hint == G_AT_SYNTAX_EXPECT_PDU)
+ syntax->state = G1_STATE_GUESS_PDU;
+}
+
+static GAtSyntaxResult g1_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 G1_STATE_IDLE:
+ if (byte == '\r' || byte == '\n')
+ /* ignore */;
+ else if (byte == '>')
+ syntax->state = G1_STATE_PROMPT;
+ else
+ syntax->state = G1_STATE_RESPONSE;
+ break;
+
+ case G1_STATE_RESPONSE:
+ if (byte == '\r') {
+ syntax->state = G1_STATE_IDLE;
+
+ i += 1;
+ res = G_AT_SYNTAX_RESULT_LINE;
+ goto out;
+ }
+ break;
+
+ case G1_STATE_GUESS_PDU:
+ /* keep going until we find a LF that leads the PDU */
+ if (byte == '\n')
+ syntax->state = G1_STATE_PDU;
+ break;
+
+ case G1_STATE_PDU:
+ if (byte == '\r') {
+ syntax->state = G1_STATE_IDLE;
+
+ i += 1;
+ res = G_AT_SYNTAX_RESULT_PDU;
+ goto out;
+ }
+ break;
+
+ case G1_STATE_PROMPT:
+ if (byte == ' ') {
+ syntax->state = G1_STATE_IDLE;
+ i += 1;
+ res = G_AT_SYNTAX_RESULT_PROMPT;
+ goto out;
+ }
+
+ syntax->state = G1_STATE_RESPONSE;
+ return G_AT_SYNTAX_RESULT_UNSURE;
+
+ default:
+ break;
+ };
+
+ i += 1;
+ }
+
+out:
+ *len = i;
+ return res;
+}
+
static void connect_destroy(gpointer user)
{
struct ofono_modem *modem = user;
@@ -102,7 +185,7 @@ static gboolean connect_cb(GIOChannel *io, GIOCondition cond, gpointer user)
if (success == FALSE)
goto error;
- syntax = g_at_syntax_new_gsmv1();
+ syntax = g_at_syntax_new_full(g1_feed, g1_hint, G1_STATE_IDLE);
d->chat = g_at_chat_new(io, syntax);
g_at_syntax_unref(syntax);
--
1.6.3.3
next reply other threads:[~2009-08-30 4:07 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-30 4:07 Andres Salomon [this message]
2009-09-01 17:14 ` [PATCH 2/3] G1: Add a G1 syntax for parsing Denis Kenzior
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090830040708.GA28068@mycelium.queued.net \
--to=dilinger@collabora.co.uk \
--cc=ofono@ofono.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox