Add basic support for emulating AT+CGATT inside AT server
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 12 Apr 2010 23:28:59 +0000 (16:28 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 12 Apr 2010 23:28:59 +0000 (16:28 -0700)
gatchat/test-server.c

index f36f665..b57a88b 100644 (file)
@@ -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);