---
 gatchat/gatserver.c |  162 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 158 insertions(+), 4 deletions(-)

diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index 7d5c3c7..5206a12 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -260,10 +260,10 @@ static gboolean get_result_value(GAtServer *server, 
GAtResult *result,
        int val;
        char prefix[10];
 
-       if (command[0] != 'S')
-               return FALSE;
-
-       sprintf(prefix, "%s=", command);
+       if (command[0] == 'S')
+               sprintf(prefix, "%s=", command);
+       else
+               strcpy(prefix, command);
 
        g_at_result_iter_init(&iter, result);
 
@@ -376,6 +376,154 @@ static void at_s5_cb(GAtServerRequestType type, GAtResult 
*result,
        s_template_cb(type, result, user_data, "S5", 0, 127);
 }
 
+static void set_v250_value(GAtServer *server, const char *prefix, int val)
+{
+       if (prefix[0] == '&') {
+               switch (prefix[1]) {
+               case 'C':
+                       server->v250.c109 = val;
+                       break;
+               case 'D':
+                       server->v250.c108 = val;
+                       break;
+               default:
+                       break;
+               }
+       } else {
+               switch (prefix[0]) {
+               case 'E':
+                       server->v250.echo = val;
+                       break;
+               case 'Q':
+                       server->v250.quiet = val;
+                       break;
+               case 'V':
+                       server->v250.is_v1 = val;
+                       break;
+               case 'X':
+                       server->v250.res_format = val;
+                       break;
+               }
+       }
+}
+
+static int get_v250_value(GAtServer *server, const char *prefix)
+{
+       int val = 0;
+
+       if (prefix[0] == '&') {
+               switch (prefix[1]) {
+               case 'C':
+                       val = server->v250.c109;
+                       break;
+               case 'D':
+                       val = server->v250.c108;
+                       break;
+               default:
+                       break;
+               }
+       } else {
+               switch (prefix[0]) {
+               case 'E':
+                       val = server->v250.echo;
+                       break;
+               case 'Q':
+                       val = server->v250.quiet;
+                       break;
+               case 'V':
+                       val = server->v250.is_v1;
+                       break;
+               case 'X':
+                       val = server->v250.res_format;
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       return val;
+}
+
+static void at_template_cb(GAtServerRequestType type, GAtResult *result,
+                                       gpointer user_data, const char *prefix,
+                                       int min, int max, int deftval)
+{
+       GAtServer *server = user_data;
+       char buf[20];
+       int val;
+
+       switch (type) {
+       case G_AT_SERVER_REQUEST_TYPE_SET:
+               if (!get_result_value(server, result, prefix, min, max, &val)) {
+                       g_at_server_send_final(server,
+                                               G_AT_SERVER_RESULT_ERROR);
+                       return;
+               }
+
+               set_v250_value(server, prefix, val);
+               g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
+               break;
+
+       case G_AT_SERVER_REQUEST_TYPE_QUERY:
+               val = get_v250_value(server, prefix);
+               sprintf(buf, "%s: %d", prefix, val);
+               g_at_server_send_info(server, buf, TRUE);
+               g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
+               break;
+
+       case G_AT_SERVER_REQUEST_TYPE_SUPPORT:
+               sprintf(buf, "%s: (%d-%d)", prefix, min, max);
+               g_at_server_send_info(server, buf, TRUE);
+               g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
+               break;
+
+       case G_AT_SERVER_REQUEST_TYPE_COMMAND_ONLY:
+               set_v250_value(server, prefix, deftval);
+               g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
+               break;
+
+       default:
+               g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
+               break;
+       }
+}
+
+static void at_e_cb(GAtServerRequestType type, GAtResult *result,
+                                       gpointer user_data)
+{
+       at_template_cb(type, result, user_data, "E", 0, 1, 1);
+}
+
+static void at_q_cb(GAtServerRequestType type, GAtResult *result,
+                                       gpointer user_data)
+{
+       at_template_cb(type, result, user_data, "Q", 0, 1, 0);
+}
+
+static void at_v_cb(GAtServerRequestType type, GAtResult *result,
+                                       gpointer user_data)
+{
+       at_template_cb(type, result, user_data, "V", 0, 1, 1);
+}
+
+static void at_x_cb(GAtServerRequestType type, GAtResult *result,
+                                       gpointer user_data)
+{
+       at_template_cb(type, result, user_data, "X", 0, 4, 4);
+}
+
+static void at_c109_cb(GAtServerRequestType type, GAtResult *result,
+                                       gpointer user_data)
+{
+       at_template_cb(type, result, user_data, "&C", 0, 1, 1);
+}
+
+static void at_c108_cb(GAtServerRequestType type, GAtResult *result,
+                                       gpointer user_data)
+{
+       at_template_cb(type, result, user_data, "&D", 0, 2, 2);
+}
+
 static inline gboolean is_extended_command_prefix(const char c)
 {
        switch (c) {
@@ -1076,6 +1224,12 @@ static void basic_command_register(GAtServer *server)
        g_at_server_register(server, "S3", at_s3_cb, server, NULL);
        g_at_server_register(server, "S4", at_s4_cb, server, NULL);
        g_at_server_register(server, "S5", at_s5_cb, server, NULL);
+       g_at_server_register(server, "E", at_e_cb, server, NULL);
+       g_at_server_register(server, "Q", at_q_cb, server, NULL);
+       g_at_server_register(server, "V", at_v_cb, server, NULL);
+       g_at_server_register(server, "X", at_x_cb, server, NULL);
+       g_at_server_register(server, "&C", at_c109_cb, server, NULL);
+       g_at_server_register(server, "&D", at_c108_cb, server, NULL);
 }
 
 GAtServer *g_at_server_new(GIOChannel *io)
-- 
1.6.6.1

_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to