source: owl.h @ 12e291a

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