source: owl.h @ c08a725

release-1.10release-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since c08a725 was 37f27bc, checked in by Nelson Elhage <nelhage@mit.edu>, 15 years ago
Switch the build system to using automake. Use automake for the build system, which lets us clean a bunch of cruft out of Makefile.in.
  • Property mode set to 100644
File size: 16.8 KB
Line 
1/*  Copyright (c) 2006-2009 The BarnOwl Developers. All rights reserved.
2 *  Copyright (c) 2004 James Kretchmar. All rights reserved.
3 *
4 *  This program is free software. You can redistribute it and/or
5 *  modify under the terms of the Sleepycat License. See the COPYING
6 *  file included with the distribution for more information.
7 */
8
9#ifndef INC_OWL_H
10#define INC_OWL_H
11
12#ifndef OWL_PERL
13#include <curses.h>
14#endif
15#include <sys/param.h>
16#include <EXTERN.h>
17#include <netdb.h>
18#include <regex.h>
19#include <time.h>
20#include <signal.h>
21#include <termios.h>
22#include "libfaim/aim.h"
23#include <wchar.h>
24#include "config.h"
25#include "glib.h"
26#ifdef HAVE_LIBZEPHYR
27#include <zephyr/zephyr.h>
28#endif
29#ifdef HAVE_COM_ERR_H
30#include <com_err.h>
31#endif
32
33/* Perl and curses don't play nice. */
34#ifdef OWL_PERL
35typedef void WINDOW;
36/* logout is defined in FreeBSD. */
37#define logout logout_
38/* aim.h defines bool */
39#define HAS_BOOL
40#include <perl.h>
41#include "owl_perl.h"
42#undef logout
43#include "XSUB.h"
44#else
45typedef void SV;
46#endif
47
48static const char owl_h_fileIdent[] = "$Id$";
49
50#define OWL_VERSION_STRING PACKAGE_VERSION
51
52/* Feature that is being tested to redirect stderr through a pipe.
53 * There may still be some portability problems with this. */
54#define OWL_STDERR_REDIR 1
55
56#define OWL_DEBUG 0
57#define OWL_DEBUG_FILE "/var/tmp/owldebug"
58
59#define OWL_CONFIG_DIR "/.owl"             /* this is relative to the user's home directory */
60#define OWL_STARTUP_FILE "/.owl/startup"   /* this is relative to the user's home directory */
61
62#define OWL_FMTEXT_ATTR_NONE      0
63#define OWL_FMTEXT_ATTR_BOLD      1
64#define OWL_FMTEXT_ATTR_REVERSE   2
65#define OWL_FMTEXT_ATTR_UNDERLINE 4
66
67#define OWL_FMTEXT_UC_BASE 0x100000 /* Unicode Plane 16 - Supplementary Private Use Area-B*/
68#define OWL_FMTEXT_UC_ATTR ( OWL_FMTEXT_UC_BASE | 0x800 )
69#define OWL_FMTEXT_UC_ATTR_MASK 0x7
70#define OWL_FMTEXT_UC_COLOR_BASE ( OWL_FMTEXT_UC_BASE | 0x400 )
71#define OWL_FMTEXT_UC_FGCOLOR OWL_FMTEXT_UC_COLOR_BASE
72#define OWL_FMTEXT_UC_BGCOLOR ( OWL_FMTEXT_UC_COLOR_BASE | 0x200 )
73#define OWL_FMTEXT_UC_DEFAULT_COLOR 0x100
74#define OWL_FMTEXT_UC_FGDEFAULT ( OWL_FMTEXT_UC_FGCOLOR | OWL_FMTEXT_UC_DEFAULT_COLOR )
75#define OWL_FMTEXT_UC_BGDEFAULT ( OWL_FMTEXT_UC_BGCOLOR | OWL_FMTEXT_UC_DEFAULT_COLOR )
76#define OWL_FMTEXT_UC_COLOR_MASK 0xFF
77#define OWL_FMTEXT_UC_ALLCOLOR_MASK ( OWL_FMTEXT_UC_COLOR_MASK | OWL_FMTEXT_UC_DEFAULT_COLOR | 0x200)
78#define OWL_FMTEXT_UC_STARTBYTE_UTF8 '\xf4'
79
80#define OWL_FMTEXT_UTF8_ATTR_NONE "\xf4\x80\xa0\x80"
81#define OWL_FMTEXT_UTF8_FGDEFAULT "\xf4\x80\x94\x80"
82#define OWL_FMTEXT_UTF8_BGDEFAULT "\xf4\x80\x9C\x80"
83
84#define OWL_COLOR_BLACK     0
85#define OWL_COLOR_RED       1
86#define OWL_COLOR_GREEN     2
87#define OWL_COLOR_YELLOW    3
88#define OWL_COLOR_BLUE      4
89#define OWL_COLOR_MAGENTA   5
90#define OWL_COLOR_CYAN      6
91#define OWL_COLOR_WHITE     7
92#define OWL_COLOR_DEFAULT   -1
93#define OWL_COLOR_INVALID   -2
94
95#define OWL_EDITWIN_STYLE_MULTILINE 0
96#define OWL_EDITWIN_STYLE_ONELINE   1
97
98#define OWL_PROTOCOL_ZEPHYR         0
99#define OWL_PROTOCOL_AIM            1
100#define OWL_PROTOCOL_JABBER         2
101#define OWL_PROTOCOL_ICQ            3
102#define OWL_PROTOCOL_YAHOO          4
103#define OWL_PROTOCOL_MSN            5
104
105#define OWL_MESSAGE_DIRECTION_NONE  0
106#define OWL_MESSAGE_DIRECTION_IN    1
107#define OWL_MESSAGE_DIRECTION_OUT   2
108
109#define OWL_MUX_READ   1
110#define OWL_MUX_WRITE  2
111#define OWL_MUX_EXCEPT 4
112
113#define OWL_DIRECTION_NONE      0
114#define OWL_DIRECTION_DOWNWARDS 1
115#define OWL_DIRECTION_UPWARDS   2
116
117#define OWL_LOGGING_DIRECTION_BOTH 0
118#define OWL_LOGGING_DIRECTION_IN   1
119#define OWL_LOGGING_DIRECTION_OUT  2
120
121#define OWL_SCROLLMODE_NORMAL      0
122#define OWL_SCROLLMODE_TOP         1
123#define OWL_SCROLLMODE_NEARTOP     2
124#define OWL_SCROLLMODE_CENTER      3
125#define OWL_SCROLLMODE_PAGED       4
126#define OWL_SCROLLMODE_PAGEDCENTER 5
127
128#define OWL_TAB               3  /* This *HAS* to be the size of TABSTR below */
129#define OWL_TABSTR        "   "
130#define OWL_MSGTAB            7
131#define OWL_TYPWIN_SIZE       8
132#define OWL_HISTORYSIZE       50
133
134/* Indicate current state, as well as what is allowed */
135#define OWL_CTX_ANY          0xffff
136/* Only one of these may be active at a time... */
137#define OWL_CTX_MODE_BITS    0x000f
138#define OWL_CTX_STARTUP      0x0001
139#define OWL_CTX_READCONFIG   0x0002
140#define OWL_CTX_INTERACTIVE  0x0004
141/* Only one of these may be active at a time... */
142#define OWL_CTX_ACTIVE_BITS  0xfff0
143#define OWL_CTX_POPWIN       0x00f0
144#define OWL_CTX_POPLESS      0x0010
145#define OWL_CTX_RECWIN       0x0f00
146#define OWL_CTX_RECV         0x0100
147#define OWL_CTX_TYPWIN       0xf000
148#define OWL_CTX_EDIT         0x7000
149#define OWL_CTX_EDITLINE     0x1000
150#define OWL_CTX_EDITMULTI    0x2000
151#define OWL_CTX_EDITRESPONSE 0x4000
152
153#define OWL_USERCLUE_NONE       0
154#define OWL_USERCLUE_CLASSES    1
155#define OWL_USERCLUE_FOOBAR     2
156#define OWL_USERCLUE_BAZ        4
157
158#define OWL_WEBBROWSER_NONE     0
159#define OWL_WEBBROWSER_NETSCAPE 1
160#define OWL_WEBBROWSER_GALEON   2
161#define OWL_WEBBROWSER_OPERA    3
162
163#define OWL_VARIABLE_OTHER      0
164#define OWL_VARIABLE_INT        1
165#define OWL_VARIABLE_BOOL       2
166#define OWL_VARIABLE_STRING     3
167
168#define OWL_FILTER_MAX_DEPTH    300
169
170#define OWL_KEYMAP_MAXSTACK     20
171
172#define OWL_KEYBINDING_COMMAND  1   /* command string */
173#define OWL_KEYBINDING_FUNCTION 2   /* function taking no args */
174
175#define OWL_DEFAULT_ZAWAYMSG    "I'm sorry, but I am currently away from the terminal and am\nnot able to receive your message.\n"
176#define OWL_DEFAULT_AAWAYMSG    "I'm sorry, but I am currently away from the terminal and am\nnot able to receive your message.\n"
177
178#define OWL_INCLUDE_REG_TESTS   1  /* whether to build in regression tests */
179
180#define OWL_CMD_ALIAS_SUMMARY_PREFIX "command alias to: "
181
182#define OWL_WEBZEPHYR_PRINCIPAL "daemon.webzephyr"
183#define OWL_WEBZEPHYR_CLASS     "webzephyr"
184#define OWL_WEBZEPHYR_OPCODE    "webzephyr"
185
186#define OWL_REGEX_QUOTECHARS    "+*.?[]^\\${}()"
187#define OWL_REGEX_QUOTEWITH     "\\"
188
189#if defined(HAVE_DES_STRING_TO_KEY) && defined(HAVE_DES_KEY_SCHED) && defined(HAVE_DES_ECB_ENCRYPT)
190#define OWL_ENABLE_ZCRYPT 1
191#endif
192
193#define OWL_META(key) ((key)|010000)
194/* OWL_CTRL is definied in kepress.c */
195
196#define LINE 2048
197
198typedef struct _owl_variable {
199  char *name;
200  int   type;  /* OWL_VARIABLE_* */
201  void *pval_default;  /* for types other and string */
202  int   ival_default;  /* for types int and bool     */
203  char *validsettings;          /* documentation of valid settings */
204  char *summary;                /* summary of usage */
205  char *description;            /* detailed description */
206  void *val;                    /* current value */
207  int  (*validate_fn)(struct _owl_variable *v, void *newval);
208                                /* returns 1 if newval is valid */
209  int  (*set_fn)(struct _owl_variable *v, void *newval); 
210                                /* sets the variable to a value
211                                 * of the appropriate type.
212                                 * unless documented, this
213                                 * should make a copy.
214                                 * returns 0 on success. */
215  int  (*set_fromstring_fn)(struct _owl_variable *v, char *newval);
216                                /* sets the variable to a value
217                                 * of the appropriate type.
218                                 * unless documented, this
219                                 * should make a copy.
220                                 * returns 0 on success. */
221  void *(*get_fn)(struct _owl_variable *v);
222                                /* returns a reference to the current value.
223                                 * WARNING:  this approach is hard to make
224                                 * thread-safe... */
225  int  (*get_tostring_fn)(struct _owl_variable *v, 
226                          char *buf, int bufsize, void *val); 
227                                /* converts val to a string
228                                 * and puts into buf */
229  void  (*free_fn)(struct _owl_variable *v);
230                                /* frees val as needed */
231} owl_variable;
232
233typedef struct _owl_input {
234  int ch;
235  gunichar uch;
236} owl_input;
237
238typedef struct _owl_fmtext {
239  int textlen;
240  int bufflen;
241  char *textbuff;
242  char default_attrs;
243  short default_fgcolor;
244  short default_bgcolor;
245} owl_fmtext;
246
247typedef struct _owl_list {
248  int size;
249  int avail;
250  void **list;
251} owl_list;
252
253typedef struct _owl_dict_el {
254  char *k;                      /* key   */
255  void *v;                      /* value */
256} owl_dict_el;
257
258typedef struct _owl_dict {
259  int size;
260  int avail;
261  owl_dict_el *els;             /* invariant: sorted by k */
262} owl_dict;
263typedef owl_dict owl_vardict;   /* dict of variables */
264typedef owl_dict owl_cmddict;   /* dict of commands */
265
266typedef struct _owl_context {
267  int   mode;
268  void *data;           /* determined by mode */
269} owl_context;
270
271typedef struct _owl_cmd {       /* command */
272  char *name;
273
274  char *summary;                /* one line summary of command */
275  char *usage;                  /* usage synopsis */
276  char *description;            /* long description of command */
277
278  int validctx;                 /* bitmask of valid contexts */
279
280  /* we should probably have a type here that says which of
281   * the following is valid, and maybe make the below into a union... */
282
283  /* Only one of these may be non-NULL ... */
284
285  char *cmd_aliased_to;         /* what this command is aliased to... */
286 
287  /* These don't take any context */
288  char *(*cmd_args_fn)(int argc, char **argv, char *buff); 
289                                /* takes argv and the full command as buff.
290                                 * caller must free return value if !NULL */
291  void (*cmd_v_fn)(void);       /* takes no args */
292  void (*cmd_i_fn)(int i);      /* takes an int as an arg */
293
294  /* The following also take the active context if it's valid */
295  char *(*cmd_ctxargs_fn)(void *ctx, int argc, char **argv, char *buff); 
296                                /* takes argv and the full command as buff.
297                                 * caller must free return value if !NULL */
298  void (*cmd_ctxv_fn)(void *ctx);               /* takes no args */
299  void (*cmd_ctxi_fn)(void *ctx, int i);        /* takes an int as an arg */
300  SV *cmd_perl;                                /* Perl closure that takes a list of args */
301} owl_cmd;
302
303
304typedef struct _owl_zwrite {
305  char *class;
306  char *inst;
307  char *realm;
308  char *opcode;
309  char *zsig;
310  char *message;
311  owl_list recips;
312  int cc;
313  int noping;
314} owl_zwrite;
315
316typedef struct _owl_pair {
317  char *key;
318  char *value;
319} owl_pair;
320
321struct _owl_fmtext_cache;
322
323typedef struct _owl_message {
324  int id;
325  int direction;
326#ifdef HAVE_LIBZEPHYR
327  ZNotice_t notice;
328#endif
329  struct _owl_fmtext_cache * fmtext;
330  int delete;
331  char *hostname;
332  owl_list attributes;            /* this is a list of pairs */
333  char *timestr;
334  time_t time;
335} owl_message;
336
337#define OWL_FMTEXT_CACHE_SIZE 1000
338/* We cache the saved fmtexts for the last bunch of messages we
339   rendered */
340typedef struct _owl_fmtext_cache {
341    owl_message * message;
342    owl_fmtext fmtext;
343} owl_fmtext_cache;
344
345typedef struct _owl_style {
346  char *name;
347  SV *perlobj;
348} owl_style;
349
350typedef struct _owl_mainwin {
351  int curtruncated;
352  int lasttruncated;
353  int lastdisplayed;
354} owl_mainwin;
355
356typedef struct _owl_viewwin {
357  owl_fmtext fmtext;
358  int textlines;
359  int topline;
360  int rightshift;
361  int winlines, wincols;
362  WINDOW *curswin;
363  void (*onclose_hook) (struct _owl_viewwin *vwin, void *data);
364  void *onclose_hook_data;
365} owl_viewwin;
366 
367typedef struct _owl_popwin {
368  WINDOW *borderwin;
369  WINDOW *popwin;
370  int lines;
371  int cols;
372  int active;
373  int needsfirstrefresh;
374} owl_popwin;
375
376typedef struct _owl_messagelist {
377  owl_list list;
378} owl_messagelist;
379
380typedef struct _owl_regex {
381  int negate;
382  char *string;
383  regex_t re;
384} owl_regex;
385
386typedef struct _owl_filterelement {
387  int (*match_message)(struct _owl_filterelement *fe, owl_message *m);
388  /* Append a string representation of the filterelement onto buf*/
389  void (*print_elt)(struct _owl_filterelement *fe, GString *buf);
390  /* Operands for and,or,not*/
391  struct _owl_filterelement *left, *right;
392  /* For regex filters*/
393  owl_regex re;
394  /* Used by regexes, filter references, and perl */
395  char *field;
396} owl_filterelement;
397
398typedef struct _owl_filter {
399  char *name;
400  owl_filterelement * root;
401  int fgcolor;
402  int bgcolor;
403  int cachedmsgid;  /* cached msgid: should move into view eventually */
404} owl_filter;
405
406typedef struct _owl_view {
407  char *name;
408  owl_filter *filter;
409  owl_messagelist ml;
410  owl_style *style;
411} owl_view;
412
413typedef struct _owl_history {
414  owl_list hist;
415  int cur;
416  int touched;
417  int partial;
418  int repeats;
419} owl_history;
420
421typedef struct _owl_editwin {
422  char *buff;
423  owl_history *hist;
424  int bufflen;
425  int allocated;
426  int buffx, buffy;
427  int topline;
428  int winlines, wincols, fillcol, wrapcol;
429  WINDOW *curswin;
430  int style;
431  int lock;
432  int dotsend;
433  int echochar;
434
435  char *command;
436  void (*callback)(struct _owl_editwin*);
437  void *cbdata;
438} owl_editwin;
439
440typedef struct _owl_keybinding {
441  int  *keys;                   /* keypress stack */
442  int   len;                    /* length of stack */
443  int   type;                   /* command or function? */
444  char *desc;                   /* description (or "*user*") */
445  char *command;                /* command, if of type command */
446  void (*function_fn)(void);    /* function ptr, if of type function */
447} owl_keybinding;
448
449typedef struct _owl_keymap {
450  char     *name;               /* name of keymap */
451  char     *desc;               /* description */
452  owl_list  bindings;           /* key bindings */
453  struct _owl_keymap *submap;   /* submap */
454  void (*default_fn)(owl_input j);      /* default action (takes a keypress) */
455  void (*prealways_fn)(owl_input  j);   /* always called before a keypress is received */
456  void (*postalways_fn)(owl_input  j);  /* always called after keypress is processed */
457} owl_keymap;
458
459typedef struct _owl_keyhandler {
460  owl_dict  keymaps;            /* dictionary of keymaps */
461  owl_keymap *active;           /* currently active keymap */
462  int       in_esc;             /* escape pressed? */
463  int       kpstack[OWL_KEYMAP_MAXSTACK+1]; /* current stack of keypresses */
464  int       kpstackpos;         /* location in stack (-1 = none) */
465} owl_keyhandler;
466
467typedef struct _owl_buddy {
468  int proto;
469  char *name;
470  int isidle;
471  int idlesince;
472} owl_buddy;
473
474typedef struct _owl_buddylist {
475  owl_list buddies;
476} owl_buddylist;
477
478typedef struct _owl_zbuddylist {
479  owl_list zusers;
480} owl_zbuddylist;
481
482typedef struct _owl_timer {
483  time_t time;
484  int interval;
485  void (*callback)(struct _owl_timer *, void *);
486  void (*destroy)(struct _owl_timer *);
487  void *data;
488} owl_timer;
489
490typedef struct _owl_errqueue {
491  owl_list errlist;
492} owl_errqueue;
493
494typedef struct _owl_colorpair_mgr {
495  int next;
496  short **pairs;
497} owl_colorpair_mgr;
498
499typedef struct _owl_obarray {
500  owl_list strings;
501} owl_obarray;
502
503typedef struct _owl_dispatch {
504  int fd;                                 /* FD to watch for dispatch. */
505  int needs_gc;
506  void (*cfunc)(struct _owl_dispatch*);   /* C function to dispatch to. */
507  void (*destroy)(struct _owl_dispatch*); /* Destructor */
508  void *data;
509} owl_dispatch;
510
511typedef struct _owl_popexec {
512  int refcount;
513  owl_viewwin *vwin;
514  int winactive;
515  int pid;                      /* or 0 if it has terminated */
516  owl_dispatch dispatch;
517} owl_popexec;
518
519typedef struct _owl_global {
520  owl_mainwin mw;
521  owl_popwin pw;
522  owl_history cmdhist;          /* command history */
523  owl_history msghist;          /* outgoing message history */
524  owl_keyhandler kh;
525  owl_list filterlist;
526  owl_list puntlist;
527  owl_vardict vars;
528  owl_cmddict cmds;
529  owl_context ctx;
530  owl_errqueue errqueue;
531  int lines, cols;
532  int curmsg, topmsg;
533  int markedmsgid;              /* for finding the marked message when it has moved. */
534  int curmsg_vert_offset;
535  owl_view current_view;
536  owl_messagelist msglist;
537  WINDOW *recwin, *sepwin, *msgwin, *typwin;
538  int needrefresh;
539  int rightshift;
540  int resizepending;
541  int recwinlines;
542  int typwinactive;
543  char *thishost;
544  char *homedir;
545  char *confdir;
546  char *startupfile;
547  int direction;
548  int zaway;
549  char *cur_zaway_msg;
550  int haveconfig;
551  int config_format;
552  void *buffercbdata;
553  owl_editwin tw;
554  owl_viewwin vw;
555  void *perl;
556  int debug;
557  time_t starttime;
558  time_t lastinputtime;
559  char *startupargs;
560  int userclue;
561  int nextmsgid;
562  int hascolors;
563  int colorpairs;
564  owl_colorpair_mgr cpmgr;
565  int searchactive;
566  int newmsgproc_pid;
567  int malloced, freed;
568  char *searchstring;
569  aim_session_t aimsess;
570  aim_conn_t bosconn;
571  owl_timer aim_noop_timer;
572  owl_timer aim_ignorelogin_timer;
573  int aim_loggedin;         /* true if currently logged into AIM */
574  int aim_doprocessing;     /* true if we should process AIM events (like pending login) */
575  char *aim_screenname;     /* currently logged in AIM screen name */
576  char *aim_screenname_for_filters;     /* currently logged in AIM screen name */
577  owl_buddylist buddylist;  /* list of logged in AIM buddies */
578  owl_list messagequeue;    /* for queueing up aim and other messages */
579  owl_dict styledict;       /* global dictionary of available styles */
580  char *response;           /* response to the last question asked */
581  int havezephyr;
582  int haveaim;
583  int ignoreaimlogin;
584  int got_err_signal;       /* 1 if we got an unexpected signal */
585  siginfo_t err_signal_info;
586  owl_zbuddylist zbuddies;
587  owl_timer zephyr_buddycheck_timer;
588  struct termios startup_tio;
589  owl_obarray obarray;
590  owl_list dispatchlist;
591  GList *timerlist;
592  owl_timer *aim_nop_timer;
593  int load_initial_subs;
594  int interrupted;
595} owl_global;
596
597/* globals */
598extern owl_global g;
599
600#include "owl_prototypes.h"
601
602/* these are missing from the zephyr includes for some reason */
603#ifdef HAVE_LIBZEPHYR
604int ZGetSubscriptions(ZSubscription_t *, int *);
605int ZGetLocations(ZLocations_t *,int *);
606#endif
607
608#endif /* INC_OWL_H */
Note: See TracBrowser for help on using the repository browser.