[PATCH 03/10] Add extended command parsing

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


---
 gatchat/gatserver.c |   65 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 63 insertions(+), 2 deletions(-)

diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index 2c53d84..0658553 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -197,16 +197,77 @@ static gboolean is_basic_command_prefix(const char *buf)
 	return FALSE;
 }
 
+static gboolean is_extended_character(const char c)
+{
+	if (g_ascii_isalpha(c))
+		return TRUE;
+
+	if (g_ascii_isdigit(c))
+		return TRUE;
+
+	switch (c) {
+	case '!':
+	case '%':
+	case '-':
+	case '.':
+	case '/':
+	case ':':
+	case '_':
+		return TRUE;
+	default:
+		return FALSE;
+	}
+}
+
 static gboolean at_command_notify(GAtServer *server, char *command,
 						char *prefix)
 {
 	return FALSE;
 }
 
-static void parse_extended_command(GAtServer *server, char *buf,
+static gboolean get_extended_prefix(const char *buf, char *prefix)
+{
+	char c;
+	int i = 0;
+
+	/* Skip '+' */
+	prefix[0] = buf[0];
+
+	while ((c = buf[++i])) {
+		/* V.250 5.4.1 Extended command naming rules */
+		if (!is_extended_character(c))
+			break;
+
+		prefix[i] = g_ascii_toupper(c);
+	}
+
+	prefix[i] = '\0';
+
+	return TRUE;
+}
+
+static void parse_extended_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];
+	char t = server->v250.s3;
+	char c = *buf;
+	int i = 0;
+
+	while (c && c != t && c != ';')
+		c = buf[++i];
+
+	command = g_strndup(buf, i);
+
+	get_extended_prefix(command, prefix);
+
+	if (at_command_notify(server, command, prefix))
+		*len = i;
+	else
+		*len = 0;
+
+	g_free(command);
 }
 
 static gboolean get_basic_prefix(const char *buf, char *prefix)
-- 
1.6.6.1



More information about the ofono mailing list