[PATCH 04/11] Add extended command parsing

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


---
 gatchat/gatserver.c |   57 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 56 insertions(+), 1 deletions(-)

diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index b68894d..f3807eb 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -197,6 +197,28 @@ 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 GAtServerResult at_command_notify(GAtServer *server, char *command,
 						char *prefix)
 {
@@ -205,10 +227,43 @@ static GAtServerResult at_command_notify(GAtServer *server, char *command,
 	return res;
 }
 
+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 char *parse_extended_command(GAtServer *server, const char *buf,
 					char *prefix)
 {
-	return NULL;
+	char *command;
+	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);
+
+	return command;
 }
 
 static gboolean get_basic_prefix(const char *buf, char *prefix)
-- 
1.6.6.1



More information about the ofono mailing list