summaryrefslogtreecommitdiffstats
path: root/gatchat/test-server.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2010-04-12 16:28:59 -0700
committerMarcel Holtmann <marcel@holtmann.org>2010-04-12 16:28:59 -0700
commita21499ca01f9abe4ec6ede6c131399c724d38a0c (patch)
treec9a52dd78fae9507a4941d3188ea0a49132fa4f6 /gatchat/test-server.c
parent4add05f4f021ee21aece4b20057d57fca8b2cdb6 (diff)
downloadofono-a21499ca01f9abe4ec6ede6c131399c724d38a0c.tar.bz2
Add basic support for emulating AT+CGATT inside AT server
Diffstat (limited to 'gatchat/test-server.c')
-rw-r--r--gatchat/test-server.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/gatchat/test-server.c b/gatchat/test-server.c
index f36f665b..b57a88bb 100644
--- a/gatchat/test-server.c
+++ b/gatchat/test-server.c
@@ -53,6 +53,7 @@ static int modem_mode = 0;
static int modem_creg = 0;
static int modem_cgreg = 0;
static int network_status = 4;
+static int network_attach = 0;
struct sock_server{
int server_sock;
@@ -396,6 +397,59 @@ error:
g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
}
+static void cgatt_cb(GAtServerRequestType type, GAtResult *cmd, gpointer user)
+{
+ GAtServer *server = user;
+ char buf[12];
+
+ if (modem_mode == 0) {
+ g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
+ return;
+ }
+
+ switch (type) {
+ case G_AT_SERVER_REQUEST_TYPE_SUPPORT:
+ g_at_server_send_info(server, "+CGATT: (0-1)", TRUE);
+ g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
+ break;
+ case G_AT_SERVER_REQUEST_TYPE_QUERY:
+ snprintf(buf, sizeof(buf), "+CGATT: %d", network_attach);
+ 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_SET:
+ {
+ GAtResultIter iter;
+ int mode;
+
+ g_at_result_iter_init(&iter, cmd);
+ g_at_result_iter_next(&iter, "+CGATT=");
+
+ if (g_at_result_iter_next_number(&iter, &mode) == FALSE)
+ goto error;
+
+ if (mode != 0 && mode != 1)
+ goto error;
+
+ if (network_attach == mode) {
+ g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
+ break;
+ }
+
+ network_attach = mode;
+ g_timeout_add_seconds(1, send_ok, server);
+ break;
+ }
+ default:
+ goto error;
+ };
+
+ return;
+
+error:
+ g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
+}
+
static void cimi_cb(GAtServerRequestType type, GAtResult *cmd, gpointer user)
{
GAtServer *server = user;
@@ -579,6 +633,7 @@ static void add_handler(GAtServer *server)
g_at_server_register(server, "+COPS", cops_cb, server, NULL);
g_at_server_register(server, "+CREG", creg_cb, server, NULL);
g_at_server_register(server, "+CGREG", cgreg_cb, server, NULL);
+ g_at_server_register(server, "+CGATT", cgatt_cb, server, NULL);
g_at_server_register(server, "+CIMI", cimi_cb, server, NULL);
g_at_server_register(server, "+CSMS", csms_cb, server, NULL);
g_at_server_register(server, "+CMGF", cmgf_cb, server, NULL);