---
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