[PATCH 02/10] Add basic command parsing

Zhenhua Zhang zhenhua.zhang at intel.com
Fri Mar 19 02:44:40 PDT 2010


According to V.250 5.3.1, the basic command is either a single
character or the '&' followed by a single character.
---
 gatchat/gatserver.c |   99 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 97 insertions(+), 2 deletions(-)

diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index 8e7955c..2c53d84 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -197,16 +197,111 @@ static gboolean is_basic_command_prefix(const char *buf)
 	return FALSE;
 }
 
+static gboolean at_command_notify(GAtServer *server, char *command,
+						char *prefix)
+{
+	return FALSE;
+}
+
 static void parse_extended_command(GAtServer *server, char *buf,
 					unsigned int *len)
 {
 	g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
 }
 
-static void parse_basic_command(GAtServer *server, char *buf,
+static gboolean get_basic_prefix(const char *buf, char *prefix)
+{
+	char c = *buf;
+
+	if (!g_ascii_isalpha(c) && c != '&')
+		return FALSE;
+
+	if (g_ascii_isalpha(c)) {
+		c = g_ascii_toupper(c);
+		if (c == 'S') {
+			int i = 0;
+
+			prefix[0] = 'S';
+
+			/* V.250 5.3.2 'S' command follows with
+			 * a parameter number.
+			 */
+			while (g_ascii_isdigit(buf[++i]))
+				prefix[i] = buf[i];
+
+			prefix[i] = '\0';
+		} else {
+			prefix[0] = c;
+			prefix[1] = '\0';
+		}
+	}
+
+	if (c == '&') {
+		prefix[0] = '&';
+		prefix[1] = g_ascii_toupper(buf[1]);
+		prefix[2] = '\0';
+	}
+
+	return TRUE;
+}
+
+static unsigned int get_basic_length(const char *buf, char *prefix, char t)
+{
+	unsigned int i;
+
+	i = strlen(prefix);
+
+	if (*buf == 'D' || *buf == 'd') {
+		/* All following characters are the part of the call */
+		while (buf[i] && buf[i] != t)
+			i++;
+	} else {
+		/* Match '?', '=', '=?' or '=123' */
+		if (buf[i] == '=')
+			i++;
+
+		if (buf[i] == '?')
+			i++;
+		else {
+			/* V.250 5.3.1 The subparameter are all digits */
+			while (g_ascii_isdigit(buf[i]))
+				i++;
+		}
+	}
+
+	return i;
+}
+
+static void parse_basic_command(GAtServer *server, const char *buf,
 					unsigned int *len)
 {
-	g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
+	char *command = NULL;
+	char prefix[20];
+	unsigned int i = 0;
+
+	if (!get_basic_prefix(buf, prefix))
+		goto done;
+
+	i = get_basic_length(buf, prefix, server->v250.s3);
+
+	command = g_strndup(buf, i);
+
+	if (!at_command_notify(server, command, prefix)) {
+		i = 0;
+		goto done;
+	}
+
+	/* Commands like ATA, ATD, ATZ cause the remainder line
+	 * to be ignored.
+	 */
+	if (*prefix == 'A' || *prefix == 'D' || *prefix == 'Z')
+		i = 0;
+
+done:
+	if (command)
+		g_free(command);
+
+	*len = i;
 }
 
 static void server_parse_line(GAtServer *server, char *line)
-- 
1.6.6.1



More information about the ofono mailing list