[PATCH 02/11] Add framework of server parser

Zhenhua Zhang zhenhua.zhang at intel.com
Wed Mar 17 07:30:32 PDT 2010


a. The parser fetch and parse one command per loop. The prefix is
the command prefix without parameter. For example, the prefix of
"AT+CLIP=1" is "+CLIP".

b. Search registered notification node in command_list. Invoke the
callback if found.

c. Termiate the execution if the result is an error. Otherwise,
parse next command.
---
 gatchat/gatserver.c |   95 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 95 insertions(+), 0 deletions(-)

diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index 46fa423..fb82ad4 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -173,8 +173,103 @@ static void g_at_server_send_final(GAtServer *server, GAtServerResult result)
 	send_common(server, buf, MIN(len, sizeof(buf)-1));
 }
 
+static inline gboolean is_extended_command_prefix(const char c)
+{
+	switch (c) {
+	case '+':
+	case '*':
+	case '!':
+	case '%':
+		return TRUE;
+	default:
+		return FALSE;
+	}
+}
+
+static gboolean is_basic_command_prefix(const char *buf)
+{
+	if (g_ascii_isalpha(buf[0]))
+		return TRUE;
+
+	if (buf[0] == '&' && g_ascii_isalpha(buf[1]))
+		return TRUE;
+
+	return FALSE;
+}
+
+static GAtServerResult at_command_notify(GAtServer *server, char *command,
+						char *prefix)
+{
+	GAtServerResult res = G_AT_SERVER_RESULT_ERROR;
+
+	return res;
+}
+
+static char *parse_extended_command(GAtServer *server, const char *buf,
+					char *prefix)
+{
+	return NULL;
+}
+
+static char *parse_basic_command(GAtServer *server, const char *buf,
+					char *prefix)
+{
+	return NULL;
+}
+
+static char *parse_next_command(GAtServer *server, const char *buf,
+					char *prefix)
+{
+	char *command = NULL;
+	char c = *buf;
+
+	/* fetch one command and get its prefix */
+	if (is_extended_command_prefix(c))
+		command = parse_extended_command(server, buf, prefix);
+	else if (is_basic_command_prefix(buf))
+		command = parse_basic_command(server, buf, prefix);
+
+	return command;
+}
+
 static void server_parse_line(GAtServer *server, char *line)
 {
+	GAtServerResult res = G_AT_SERVER_RESULT_ERROR;
+	char *buf = line;
+	char *command = NULL;
+	char prefix[20];
+
+	while (buf) {
+		char c = *buf;
+
+		/* skip semicolon */
+		if (c == ';')
+			c = *(++buf);
+
+		if (c == '\0') {
+			res = G_AT_SERVER_RESULT_OK;
+			break;
+		}
+
+		command = parse_next_command(server, buf, prefix);
+		if (!command) {
+			res = G_AT_SERVER_RESULT_ERROR;
+			break;
+		}
+
+		res = at_command_notify(server, command, prefix);
+		if (res != G_AT_SERVER_RESULT_OK) {
+			g_free(command);
+			break;
+		}
+
+		buf += strlen(command);
+
+		g_free(command);
+	}
+
+	g_at_server_send_final(server, res);
+
 	g_free(line);
 }
 
-- 
1.6.6.1



More information about the ofono mailing list