chiark / gitweb /
28526f223a7f37dde24e3342f69da982c9335d9f
[sympathy.git] / apps / client.c
1 /*
2  * client.c:
3  *
4  * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
5  * All rights reserved.
6  *
7  */
8
9 static char rcsid[] = "$Id$";
10
11 /*
12  * $Log$
13  * Revision 1.4  2008/02/14 10:34:30  james
14  * *** empty log message ***
15  *
16  * Revision 1.3  2008/02/14 02:46:44  james
17  * *** empty log message ***
18  *
19  * Revision 1.2  2008/02/14 00:57:58  james
20  * *** empty log message ***
21  *
22  * Revision 1.1  2008/02/13 18:05:06  james
23  * *** empty log message ***
24  *
25  */
26
27 #include <sympathy.h>
28 #include "client.h"
29
30   //vt102_status_line (v, "VT102 foo bar baz I'm the urban spaceman baby");
31
32 static void
33 server_msg (IPC_Msg * m, Context * c)
34 {
35   switch (m->hdr.type)
36     {
37
38     case IPC_MSG_TYPE_NOOP:
39       break;
40     case IPC_MSG_TYPE_DEBUG:
41 //          fprintf (stderr,"%p [%d] %s\n", m, m->hdr.size , m->debug.msg );
42       break;
43     case IPC_MSG_TYPE_HISTORY:
44       history_add (c->h, m->history.history.line);
45       break;
46     case IPC_MSG_TYPE_VT102:
47       if (sizeof (VT102) != m->vt102.len)
48         abort ();
49
50       *(c->v) = m->vt102.vt102;
51       break;
52     case IPC_MSG_TYPE_TERM:
53       vt102_parse (c, m->term.term, m->term.len);
54       break;
55     case IPC_MSG_TYPE_STATUS:
56         vt102_status_line(c->v,m->status.status);
57         break;
58     default:
59       fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type);
60     }
61 }
62
63 void
64 client (void)
65 {
66   Socket *s;
67   fd_set rfds, wfds;
68
69   ANSI a = { 0 };
70   Context c;
71
72   s = socket_connect ("socket");
73
74   if (!s)
75     {
76       printf ("no socket");
77       return;
78     }
79
80   c.t = NULL;
81   c.v = vt102_new ();
82   c.h = history_new (200);
83   c.l = NULL;
84   c.k = keydis_ipc_new (s);
85
86   terminal_register_handlers ();
87   a.terminal = terminal_open (0, 1);
88
89   ansi_reset (&a, NULL);
90
91   for (;;)
92     {
93       struct timeval tv = { 0, 100000 };
94
95       FD_ZERO (&rfds);
96       FD_ZERO (&wfds);
97
98       socket_pre_select (s, &rfds, &wfds);
99       tty_pre_select (a.terminal, &rfds, &wfds);
100
101       select (FD_SETSIZE, &rfds, &wfds, NULL, &tv);
102
103       if (socket_post_select (s, &rfds, &wfds))
104         break;
105
106       while (s->msg)
107         {
108           server_msg (s->msg, &c);
109           socket_consume_msg (s);
110         }
111
112       if (ansi_dispatch (&a, &c))
113         break;
114
115       ansi_update (&a, &c);
116
117     }
118   ansi_terminal_reset (&a);
119   terminal_atexit ();
120   printf ("QUAT\n");
121
122
123 }