chiark / gitweb /
@@
[sympathy.git] / apps / mainloop.c
index e3d2190420e2a95c94a8de9c4d87dee351954a91..3c7d01da7d8088372f8d5014355447a323d77c59 100644 (file)
@@ -6,11 +6,22 @@
  *
  */
 
  *
  */
 
-static char rcsid[] =
-  "$Id$";
+static char rcsid[] = "$Id$";
 
 /*
  * $Log$
 
 /*
  * $Log$
+ * Revision 1.6  2008/02/20 19:44:37  james
+ * @@
+ *
+ * Revision 1.5  2008/02/20 18:31:44  james
+ * *** empty log message ***
+ *
+ * Revision 1.4  2008/02/20 17:18:33  james
+ * *** empty log message ***
+ *
+ * Revision 1.3  2008/02/20 02:11:35  james
+ * *** empty log message ***
+ *
  * Revision 1.2  2008/02/16 10:58:52  james
  * *** empty log message ***
  *
  * Revision 1.2  2008/02/16 10:58:52  james
  * *** empty log message ***
  *
@@ -57,8 +68,8 @@ static char rcsid[] =
 
 #include <sys/time.h>
 #include <sympathy.h>
 
 #include <sys/time.h>
 #include <sympathy.h>
+#include "mainloop.h"
 
 
-#include "client.h"
 #include "clients.h"
 
 typedef struct
 #include "clients.h"
 
 typedef struct
@@ -86,7 +97,12 @@ get_status (TTY * t, Clients * cs)
   tty_get_status (t, &tty_status);
 
   status.bootstrap = 1;
   tty_get_status (t, &tty_status);
 
   status.bootstrap = 1;
-  status.nclients = cs->n;
+
+  if (cs)
+    status.nclients = cs->n;
+  else
+    status.nclients = 0;
+
   status.lines = tty_status.lines;
   status.baud = tty_status.baud;
   status.crtscts = (tty_status.termios.c_cflag & CRTSCTS) ? 1 : 0;
   status.lines = tty_status.lines;
   status.baud = tty_status.baud;
   status.crtscts = (tty_status.termios.c_cflag & CRTSCTS) ? 1 : 0;
@@ -223,11 +239,11 @@ check_status (Context * c, Clients * cs)
   status = get_status (c->t, cs);
   if (!memcmp (&status, &old_status, sizeof (status)))
     return;
   status = get_status (c->t, cs);
   if (!memcmp (&status, &old_status, sizeof (status)))
     return;
-  old_status = status;
-
 
   log_line_changes (c, old_status.lines, status.lines);
 
 
   log_line_changes (c, old_status.lines, status.lines);
 
+  old_status = status;
+
   ptr += sprintf (ptr, "CTRL-B ");
 
   t = c->t->name;
   ptr += sprintf (ptr, "CTRL-B ");
 
   t = c->t->name;
@@ -280,95 +296,157 @@ check_status (Context * c, Clients * cs)
 
   *ptr = 0;
 
 
   *ptr = 0;
 
-  send_status (cs, buf);
+  if (cs)
+    send_status (cs, buf);
+  else
+    cmd_new_status (c->d, c, buf);
+
 }
 
 
 }
 
 
-  TTY *t;
-  Log *l;
-  t= ptty_open (NULL, NULL);
-  //t = serial_open ("/dev/cellmodem", 0);
-l=file_log_new ("log");
+static int
+msg_from_server (ANSI *a,IPC_Msg * m, Context * c)
+{
+  switch (m->hdr.type)
+    {
+
+    case IPC_MSG_TYPE_NOOP:
+      break;
+    case IPC_MSG_TYPE_DEBUG:
+//          fprintf (stderr,"%p [%d] %s\n", m, m->hdr.size , m->debug.msg );
+      break;
+    case IPC_MSG_TYPE_HISTORY:
+      history_add (c->h, m->history.history.line);
+      break;
+    case IPC_MSG_TYPE_VT102:
+      if (sizeof (VT102) != m->vt102.len)
+        abort ();
+
+      *(c->v) = m->vt102.vt102;
+
+      if (a->one_shot) {
+               a->one_shot(a,&c->v->crt);
+               return 1;
+       }
+      //FIXME HTML hook
+      break;
+    case IPC_MSG_TYPE_TERM:
+      vt102_parse (c, m->term.term, m->term.len);
+      break;
+    case IPC_MSG_TYPE_STATUS:
+      cmd_new_status (c->d, c, m->status.status);
+      break;
+    default:
+      fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type);
+    }
+return 0;
+}
 
 
 
 
-void mainloop (TTY *tty,Socket *server_socket,Socket *client_socket,Ansi *a,Log *log)
+void
+mainloop (TTY * tty, Socket * server_socket, Socket * client_socket,
+          ANSI * ansi, Log * log, int nhistory)
 {
   fd_set rfds, wfds;
 {
   fd_set rfds, wfds;
-  Context c;
+  Context c = { 0 };
   Clients *clients;
 
   Clients *clients;
 
-  c.v = vt102_new ();
-  c.h = history_new (200);
-  c.l = log
 
 
+  c.v = vt102_new ();
+  c.h = history_new (nhistory);
+  c.l = log;
   /* are we being fed by a tty or a socket */
   /* are we being fed by a tty or a socket */
-  if (client_socket) {
-       if (server_socket) abort();
-       c.s = client_socket;  
-        c.k = keydis_ipc_new (client_socket);
-  } else {
-       if (!tty) abort();
-       c.t = tty;
-       c.k = keydis_vt102_new ();
-  }
-
-  /* do we have an upstream terminal to talk to*/
-  if (ansi) {
-       c.d = cmd_new ();
-  } else {
-       c.d = NULL;
-  }
-
-
-  if (server_socket) {
-       if(client_socket) abort();
-       clients = clients_new ();
-  } else {
-       clients=NULL;
-  }
+  if (client_socket)
+    {
+      if (server_socket)
+        abort ();
+      c.k = keydis_ipc_new (client_socket);
+    }
+  else
+    {
+      if (!tty)
+        abort ();
+      c.t = tty;
+      c.k = keydis_vt102_new ();
+    }
+
+  /* do we have an upstream terminal to talk to */
+  /* if so start a command parser */
+  if (ansi)
+    {
+      c.d = cmd_new ();
+    }
+  else
+    {
+      c.d = NULL;
+    }
+
+
+  if (server_socket)
+    {
+      if (client_socket)
+        abort ();
+      clients = clients_new ();
+    }
+  else
+    {
+      clients = NULL;
+    }
 
   for (;;)
     {
       struct timeval tv = { 1, 0 };
 
 
   for (;;)
     {
       struct timeval tv = { 1, 0 };
 
-      check_status (&c, clients);
+      if ((c.d) && (c.d->disconnect))
+        break;
+
+      /*update the status lines, locally or remotely */
+      if (c.t)
+        check_status (&c, clients);
 
       FD_ZERO (&rfds);
       FD_ZERO (&wfds);
 
 
       FD_ZERO (&rfds);
       FD_ZERO (&wfds);
 
-       if (c.t)
-          tty_pre_select (c.t, &rfds, &wfds);
+      if (c.t)
+        tty_pre_select (c.t, &rfds, &wfds);
 
 
-       if (server_socket) {
-      FD_SET (server_socket->fd, &rfds);
-      clients_pre_select (clients, &rfds, &wfds);
-       }
+      if (server_socket)
+        {
+          FD_SET (server_socket->fd, &rfds);
+          clients_pre_select (clients, &rfds, &wfds);
+        }
+
+      if (client_socket)
+        socket_pre_select (client_socket, &rfds, &wfds);
 
 
-       if (client_socket)
-      socket_pre_select (client_socket, &rfds, &wfds);
+      if (ansi)
+        tty_pre_select (ansi->terminal, &rfds, &wfds);
 
       select (FD_SETSIZE, &rfds, &wfds, NULL, &tv);
 
 
       select (FD_SETSIZE, &rfds, &wfds, NULL, &tv);
 
-      /*any message from clients, or new connexions*/
-      if (server_socket) {
-      Socket *cs;
-      if (FD_ISSET (server_socket->fd, &rfds) && ((cs = socket_accept (s))))
+      /*any message from clients, or new connexions */
+      if (server_socket)
         {
         {
-          {
-            Client *cl;
-            /*New client connexion */
-            cl = clients_new_client (clients, cs, &c);
+          Socket *new_client_socket;
+          if (FD_ISSET (server_socket->fd, &rfds)
+              && ((new_client_socket = socket_accept (server_socket))))
+            {
+              {
+                Client *new_client;
+                /*New client connexion */
+                new_client =
+                  clients_new_client (clients, new_client_socket, &c);
 
 
-            send_history (c.h, cl);
-            send_vt102 (c.v, cl);
+                send_history (c.h, new_client);
+                send_vt102 (c.v, new_client);
 
 
-          }
-        }
+              }
+            }
 
 
-      clients_post_select (clients, &c, &rfds, &wfds);
-      }
+          clients_post_select (clients, &c, &rfds, &wfds);
+        }
 
 
-      /*any data from the port*/
+      /*any data from the port */
       if (c.t && FD_ISSET (c.t->rfd, &rfds))
         {
           char buf[IPC_MAX_BUF];
       if (c.t && FD_ISSET (c.t->rfd, &rfds))
         {
           char buf[IPC_MAX_BUF];
@@ -381,16 +459,40 @@ void mainloop (TTY *tty,Socket *server_socket,Socket *client_socket,Ansi *a,Log
 
           if (red)
             {
 
           if (red)
             {
-              send_output (clients, buf, red);
+              if (clients)
+                send_output (clients, buf, red);
               vt102_parse (&c, buf, red);
             }
         }
 
 
 
               vt102_parse (&c, buf, red);
             }
         }
 
 
 
+      /*any data from the server */
+      if (client_socket)
+        {
+          if (socket_post_select (client_socket, &rfds, &wfds))
+            break;
+
+          while (client_socket->msg)
+            {
+              if (msg_from_server (ansi,client_socket->msg, &c))
+               break;
+              socket_consume_msg (client_socket);
+            }
+        }
+
+
+      /*update our local screen */
+      if (ansi)
+        {
+          if (ansi->dispatch)
+               ansi->dispatch (ansi, &c);
+
+         if (ansi->update)
+          ansi->update (ansi, &c);
+        }
     }
 
     }
 
-  clients_shutdown (clients);
-  terminal_atexit ();
-  printf ("QUAT\n");
+  if (clients)
+    clients_shutdown (clients);
 }
 }