chiark / gitweb /
*** empty log message ***
[sympathy.git] / apps / mainloop.c
index e674b2e06dd61237ba87adcbbe7b8dbc74ffdfeb..25718c48685f55fd183ab7949a9fe32b3c1b4e15 100644 (file)
@@ -6,10 +6,44 @@
  *
  */
 
-static char rcsid[] = "$Id$";
+static char rcsid[] =
+  "$Id$";
 
 /*
  * $Log$
+ * Revision 1.21  2008/03/02 10:27:24  james
+ * *** empty log message ***
+ *
+ * Revision 1.20  2008/02/28 16:57:51  james
+ * *** empty log message ***
+ *
+ * Revision 1.19  2008/02/28 16:37:16  james
+ * *** empty log message ***
+ *
+ * Revision 1.18  2008/02/28 11:27:48  james
+ * *** empty log message ***
+ *
+ * Revision 1.17  2008/02/27 09:42:53  james
+ * *** empty log message ***
+ *
+ * Revision 1.16  2008/02/27 09:42:21  james
+ * *** empty log message ***
+ *
+ * Revision 1.15  2008/02/27 01:31:38  james
+ * *** empty log message ***
+ *
+ * Revision 1.14  2008/02/27 01:31:14  james
+ * *** empty log message ***
+ *
+ * Revision 1.13  2008/02/26 23:56:12  james
+ * *** empty log message ***
+ *
+ * Revision 1.12  2008/02/26 23:23:16  james
+ * *** empty log message ***
+ *
+ * Revision 1.11  2008/02/24 00:43:55  james
+ * *** empty log message ***
+ *
  * Revision 1.10  2008/02/23 13:05:57  staffcvs
  * *** empty log message ***
  *
@@ -84,8 +118,9 @@ static char rcsid[] = "$Id$";
 
 #include "clients.h"
 
-typedef struct
-{
+Context *context;
+
+typedef struct {
   int nclients;
   int lines;
   int baud;
@@ -122,11 +157,10 @@ get_status (TTY * t, Clients * cs)
 
   cd = (tty_status.lines & TIOCM_CD) ? 1 : 0;
 
-  if (cd != last_cd_state)
-    {
-      gettimeofday (&last_cd_edge, NULL);
-      last_cd_state = cd;
-    }
+  if (cd != last_cd_state) {
+    gettimeofday (&last_cd_edge, NULL);
+    last_cd_state = cd;
+  }
 
   gettimeofday (&now, NULL);
   timersub (&now, &last_cd_edge, &dif);
@@ -139,45 +173,44 @@ static char *
 line_to_name (int l)
 {
 
-  switch (l)
-    {
+  switch (l) {
 #ifdef TIOCM_LE
-    case TIOCM_LE:
-      return "LE";
+  case TIOCM_LE:
+    return "LE";
 #endif
 #ifdef TIOCM_DTR
-    case TIOCM_DTR:
-      return "DTR";
+  case TIOCM_DTR:
+    return "DTR";
 #endif
 #ifdef TIOCM_RTS
-    case TIOCM_RTS:
-      return "RTS";
+  case TIOCM_RTS:
+    return "RTS";
 #endif
 #ifdef TIOCM_ST
-    case TIOCM_ST:
-      return "ST";
+  case TIOCM_ST:
+    return "ST";
 #endif
 #ifdef TIOCM_SR
-    case TIOCM_SR:
-      return "SR";
+  case TIOCM_SR:
+    return "SR";
 #endif
 #ifdef TIOCM_CTS
-    case TIOCM_CTS:
-      return "CTS";
+  case TIOCM_CTS:
+    return "CTS";
 #endif
 #ifdef TIOCM_CD
-    case TIOCM_CD:
-      return "CD";
+  case TIOCM_CD:
+    return "CD";
 #endif
 #ifdef TIOCM_RI
-    case TIOCM_RI:
-      return "RI";
+  case TIOCM_RI:
+    return "RI";
 #endif
 #ifdef TIOCM_DSR
-    case TIOCM_DSR:
-      return "DSR";
+  case TIOCM_DSR:
+    return "DSR";
 #endif
-    }
+  }
   return "??";
 }
 
@@ -199,20 +232,18 @@ log_line_changes (Context * ctx, int old, int new)
   while (*n)
     *(ptr++) = *(n++);
 
-  while (dif >= c)
-    {
+  while (dif >= c) {
 
-      if (dif & c)
-        {
-          *(ptr++) = ' ';
-          *(ptr++) = (new & c) ? '+' : '-';
-          n = line_to_name (c);
-          while (*n)
-            *(ptr++) = *(n++);
-        }
-
-      c <<= 1;
+    if (dif & c) {
+      *(ptr++) = ' ';
+      *(ptr++) = (new & c) ? '+' : '-';
+      n = line_to_name (c);
+      while (*n)
+        *(ptr++) = *(n++);
     }
+
+    c <<= 1;
+  }
   *(ptr++) = '>';
   *ptr = 0;
 
@@ -273,55 +304,45 @@ check_status (Context * c, Clients * cs)
   ptr = do_line (ptr, status.lines, TIOCM_RI);
   ptr = do_line (ptr, status.lines, TIOCM_CD);
 
-  if (status.blocked)
-    {
-      t = ", Locked";
-      while (*t)
-        *(ptr++) = *(t++);
-    }
-
-  if (status.crtscts)
-    {
-      t = ", Flow";
-      while (*t)
-        *(ptr++) = *(t++);
-    }
-
+  if (status.blocked) {
+    t = ", Locked";
+    while (*t)
+      *(ptr++) = *(t++);
+  }
+
+  if (status.crtscts) {
+    t = ", Flow";
+    while (*t)
+      *(ptr++) = *(t++);
+  }
 #if 0
-  if (status.lines & TIOCM_CD)
-    {
-      ptr +=
-        sprintf (ptr, ", On %d.%d", status.cd_edge_sec / 60,
-                 status.cd_edge_sec % 60);
-    }
-  else
-    {
-      ptr +=
-        sprintf (ptr, ", Off %d.%d", status.cd_edge_sec / 60,
-                 status.cd_edge_sec % 60);
-    }
+  if (status.lines & TIOCM_CD) {
+    ptr +=
+      sprintf (ptr, ", On %d.%d", status.cd_edge_sec / 60,
+               status.cd_edge_sec % 60);
+  } else {
+    ptr +=
+      sprintf (ptr, ", Off %d.%d", status.cd_edge_sec / 60,
+               status.cd_edge_sec % 60);
+  }
 #endif
 
   ptr +=
     sprintf (ptr, ", %d client%s", status.nclients,
              (status.nclients == 1) ? "" : "s");
 
-  if (c->tp->biterrs)
-    {
+  if (c->tp->biterrs) {
 
-      ptr +=
-        sprintf (ptr, ", %d err%s", c->tp->biterrs,
-                 (c->tp->biterrs == 1) ? "" : "s");
+    ptr +=
+      sprintf (ptr, ", %d err%s", c->tp->biterrs,
+               (c->tp->biterrs == 1) ? "" : "s");
 
-      if (c->tp->guessed_baud == -1)
-        {
-          ptr += sprintf (ptr, " try higher");
-        }
-      else if (c->tp->guessed_baud > 0)
-        {
-          ptr += sprintf (ptr, " try %db", c->tp->guessed_baud);
-        }
+    if (c->tp->guessed_baud == -1) {
+      ptr += sprintf (ptr, " try higher");
+    } else if (c->tp->guessed_baud > 0) {
+      ptr += sprintf (ptr, " try %db", c->tp->guessed_baud);
     }
+  }
 
   *ptr = 0;
 
@@ -340,198 +361,181 @@ check_status (Context * c, Clients * cs)
 static int
 msg_from_server (ANSI * a, IPC_Msg * m, Context * c)
 {
-  switch (m->hdr.type)
-    {
+  switch (m->hdr.type) {
 
-    case IPC_MSG_TYPE_NOOP:
-      break;
-    case IPC_MSG_TYPE_DEBUG:
+  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:
-      tty_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);
+    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;
     }
+    break;
+  case IPC_MSG_TYPE_TERM:
+    tty_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 * ansi, Log * log, int nhistory)
+          ANSI * ansi, Log * log, int nhistory, CRT_Pos * size)
 {
   fd_set rfds, wfds;
   Context c = { 0 };
   Clients *clients;
 
+  context = &c;
+
   c.tp = tty_parser_new ();
   c.u = utf8_new ();
 
-  c.v = vt102_new ();
+  c.v = vt102_new (size);
   c.h = history_new (nhistory);
   c.l = log;
   /* are we being fed by a tty or a socket */
-  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 ();
-    }
+  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 (ansi) {
+    c.d = cmd_new ();
+  } else {
+    c.d = NULL;
+  }
 
 
-  if (server_socket)
-    {
-      if (client_socket)
-        abort ();
-      clients = clients_new ();
-    }
-  else
-    {
-      clients = NULL;
-    }
+  vt102_reset (&c);
 
-  for (;;)
-    {
-      struct timeval tv = { 0, 250000 };
 
-      if ((c.d) && (c.d->disconnect))
-        break;
+  if (server_socket) {
+    if (client_socket)
+      abort ();
+    clients = clients_new ();
+  } else {
+    clients = NULL;
+  }
 
-      /*update the status lines, locally or remotely */
-      if (c.t)
-        check_status (&c, clients);
+  for (;;) {
+    struct timeval tv = { 0, 250000 };
 
-      FD_ZERO (&rfds);
-      FD_ZERO (&wfds);
+    if ((c.d) && (c.d->disconnect))
+      break;
 
-      if (c.t)
-        tty_pre_select (c.t, &rfds, &wfds);
+    /*update the status lines, locally or remotely */
+    if (c.t)
+      check_status (&c, clients);
 
-      if (server_socket)
-        {
-          FD_SET (server_socket->fd, &rfds);
-          clients_pre_select (clients, &rfds, &wfds);
-        }
+    FD_ZERO (&rfds);
+    FD_ZERO (&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 (client_socket)
-        socket_pre_select (client_socket, &rfds, &wfds);
+    if (client_socket)
+      socket_pre_select (client_socket, &rfds, &wfds);
 
-      if (ansi && ansi->terminal)
-        tty_pre_select (ansi->terminal, &rfds, &wfds);
+    if (ansi && ansi->terminal)
+      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)
+    /*any message from clients, or new connexions */
+    if (server_socket) {
+      Socket *new_client_socket;
+      if (FD_ISSET (server_socket->fd, &rfds)
+          && ((new_client_socket = socket_accept (server_socket)))) {
         {
-          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, new_client);
-                send_vt102 (c.v, new_client);
-
-              }
-            }
-
-          clients_post_select (clients, &c, &rfds, &wfds);
+          Client *new_client;
+          /*New client connexion */
+          new_client = clients_new_client (clients, new_client_socket, &c);
+
+          send_history (c.h, new_client);
+          send_vt102 (c.v, new_client);
+
         }
+      }
 
-      /*any data from the port */
-      if (c.t && FD_ISSET (c.t->rfd, &rfds))
-        {
-          char buf[IPC_MAX_BUF];
-          int red;
+      clients_post_select (clients, &c, &rfds, &wfds);
+    }
 
-          red = c.t->recv (c.t, buf, sizeof (buf));
+    /*any data from the port */
+    if (c.t && FD_ISSET (c.t->rfd, &rfds)) {
+      char buf[IPC_MAX_BUF];
+      int red;
 
-          if (red < 0)
-            break;
+      red = c.t->recv (c.t, buf, sizeof (buf));
 
-          if (red)
-            {
-              if (clients)
-                send_output (clients, buf, red);
-              tty_parse (&c, buf, red);
-            }
-        }
+      if (red < 0)
+        break;
 
+      if (red) {
+        if (clients)
+          send_output (clients, buf, red);
+        tty_parse (&c, buf, red);
+      }
+    }
 
 
-      /*any data from the server */
-      if (client_socket)
-        {
-          int one_shot;
-          if (socket_post_select (client_socket, &rfds, &wfds))
-            break;
-
-          while (client_socket->msg)
-            {
-              if (msg_from_server (ansi, client_socket->msg, &c))
-                one_shot++;
-
-              socket_consume_msg (client_socket);
-            }
-          if (one_shot)
-            break;
-        }
 
+    /*any data from the server */
+    if (client_socket) {
+      int one_shot;
+      if (socket_post_select (client_socket, &rfds, &wfds))
+        break;
 
-      /*update our local screen */
-      if (ansi)
-        {
-          if (ansi->dispatch)
-            ansi->dispatch (ansi, &c);
+      while (client_socket->msg) {
+        if (msg_from_server (ansi, client_socket->msg, &c))
+          one_shot++;
 
-          if (ansi->update)
-            ansi->update (ansi, &c);
-        }
+        socket_consume_msg (client_socket);
+      }
+      if (one_shot)
+        break;
+    }
+
+
+    /*update our local screen */
+    if (ansi) {
+      if (ansi->dispatch)
+        ansi->dispatch (ansi, &c);
+
+      if (ansi->update)
+        ansi->update (ansi, &c);
     }
+  }
 
   if (clients)
     clients_shutdown (clients);