source: owl.h @ c4efb46

release-1.10release-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since c4efb46 was 41c9a96, checked in by Anders Kaseorg <andersk@mit.edu>, 15 years ago
Reimplement search in terms of owl_regex. The current implementation of stristr has problems and there isn’t a good replacement available. This was its only caller, so we can get rid of it now. Also, this will make it possible to search with arbitrary regexes if someone feels like coming up with a syntax. Signed-off-by: Anders Kaseorg <andersk@mit.edu>
  • Property mode set to 100644
File size: 16.5 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_INCLUDE_REG_TESTS   1  /* whether to build in regression tests */
177
178#define OWL_CMD_ALIAS_SUMMARY_PREFIX "command alias to: "
179
180#define OWL_WEBZEPHYR_PRINCIPAL "daemon.webzephyr"
181#define OWL_WEBZEPHYR_CLASS     "webzephyr"
182#define OWL_WEBZEPHYR_OPCODE    "webzephyr"
183
184#define OWL_REGEX_QUOTECHARS    "+*.?[]^\\${}()"
185#define OWL_REGEX_QUOTEWITH     "\\"
186
187#if defined(HAVE_DES_STRING_TO_KEY) && defined(HAVE_DES_KEY_SCHED) && defined(HAVE_DES_ECB_ENCRYPT)
188#define OWL_ENABLE_ZCRYPT 1
189#endif
190
191#define OWL_META(key) ((key)|010000)
192/* OWL_CTRL is definied in kepress.c */
193
194#define LINE 2048
195
196typedef struct _owl_variable {
197  char *name;
198  int   type;  /* OWL_VARIABLE_* */
199  void *pval_default;  /* for types other and string */
200  int   ival_default;  /* for types int and bool     */
201  char *validsettings;          /* documentation of valid settings */
202  char *summary;                /* summary of usage */
203  char *description;            /* detailed description */
204  void *val;                    /* current value */
205  int  (*validate_fn)(struct _owl_variable *v, void *newval);
206                                /* returns 1 if newval is valid */
207  int  (*set_fn)(struct _owl_variable *v, void *newval); 
208                                /* sets the variable to a value
209                                 * of the appropriate type.
210                                 * unless documented, this
211                                 * should make a copy.
212                                 * returns 0 on success. */
213  int  (*set_fromstring_fn)(struct _owl_variable *v, char *newval);
214                                /* sets the variable to a value
215                                 * of the appropriate type.
216                                 * unless documented, this
217                                 * should make a copy.
218                                 * returns 0 on success. */
219  void *(*get_fn)(struct _owl_variable *v);
220                                /* returns a reference to the current value.
221                                 * WARNING:  this approach is hard to make
222                                 * thread-safe... */
223  int  (*get_tostring_fn)(struct _owl_variable *v, 
224                          char *buf, int bufsize, void *val); 
225                                /* converts val to a string
226                                 * and puts into buf */
227  void  (*free_fn)(struct _owl_variable *v);
228                                /* frees val as needed */
229} owl_variable;
230
231typedef struct _owl_input {
232  int ch;
233  gunichar uch;
234} owl_input;
235
236typedef struct _owl_fmtext {
237  int textlen;
238  int bufflen;
239  char *textbuff;
240  char default_attrs;
241  short default_fgcolor;
242  short default_bgcolor;
243} owl_fmtext;
244
245typedef struct _owl_list {
246  int size;
247  int avail;
248  void **list;
249} owl_list;
250
251typedef struct _owl_dict_el {
252  char *k;                      /* key   */
253  void *v;                      /* value */
254} owl_dict_el;
255
256typedef struct _owl_dict {
257  int size;
258  int avail;
259  owl_dict_el *els;             /* invariant: sorted by k */
260} owl_dict;
261typedef owl_dict owl_vardict;   /* dict of variables */
262typedef owl_dict owl_cmddict;   /* dict of commands */
263
264typedef struct _owl_context {
265  int   mode;
266  void *data;           /* determined by mode */
267} owl_context;
268
269typedef struct _owl_cmd {       /* command */
270  char *name;
271
272  char *summary;                /* one line summary of command */
273  char *usage;                  /* usage synopsis */
274  char *description;            /* long description of command */
275
276  int validctx;                 /* bitmask of valid contexts */
277
278  /* we should probably have a type here that says which of
279   * the following is valid, and maybe make the below into a union... */
280
281  /* Only one of these may be non-NULL ... */
282
283  char *cmd_aliased_to;         /* what this command is aliased to... */
284 
285  /* These don't take any context */
286  char *(*cmd_args_fn)(int argc, char **argv, char *buff); 
287                                /* takes argv and the full command as buff.
288                                 * caller must free return value if !NULL */
289  void (*cmd_v_fn)(void);       /* takes no args */
290  void (*cmd_i_fn)(int i);      /* takes an int as an arg */
291
292  /* The following also take the active context if it's valid */
293  char *(*cmd_ctxargs_fn)(void *ctx, int argc, char **argv, char *buff); 
294                                /* takes argv and the full command as buff.
295                                 * caller must free return value if !NULL */
296  void (*cmd_ctxv_fn)(void *ctx);               /* takes no args */
297  void (*cmd_ctxi_fn)(void *ctx, int i);        /* takes an int as an arg */
298  SV *cmd_perl;                                /* Perl closure that takes a list of args */
299} owl_cmd;
300
301
302typedef struct _owl_zwrite {
303  char *class;
304  char *inst;
305  char *realm;
306  char *opcode;
307  char *zsig;
308  char *message;
309  owl_list recips;
310  int cc;
311  int noping;
312} owl_zwrite;
313
314typedef struct _owl_pair {
315  char *key;
316  char *value;
317} owl_pair;
318
319struct _owl_fmtext_cache;
320
321typedef struct _owl_message {
322  int id;
323  int direction;
324#ifdef HAVE_LIBZEPHYR
325  ZNotice_t notice;
326#endif
327  struct _owl_fmtext_cache * fmtext;
328  int delete;
329  char *hostname;
330  owl_list attributes;            /* this is a list of pairs */
331  char *timestr;
332  time_t time;
333} owl_message;
334
335#define OWL_FMTEXT_CACHE_SIZE 1000
336/* We cache the saved fmtexts for the last bunch of messages we
337   rendered */
338typedef struct _owl_fmtext_cache {
339    owl_message * message;
340    owl_fmtext fmtext;
341} owl_fmtext_cache;
342
343typedef struct _owl_style {
344  char *name;
345  SV *perlobj;
346} owl_style;
347
348typedef struct _owl_mainwin {
349  int curtruncated;
350  int lasttruncated;
351  int lastdisplayed;
352} owl_mainwin;
353
354typedef struct _owl_viewwin {
355  owl_fmtext fmtext;
356  int textlines;
357  int topline;
358  int rightshift;
359  int winlines, wincols;
360  WINDOW *curswin;
361  void (*onclose_hook) (struct _owl_viewwin *vwin, void *data);
362  void *onclose_hook_data;
363} owl_viewwin;
364 
365typedef struct _owl_popwin {
366  WINDOW *borderwin;
367  WINDOW *popwin;
368  int lines;
369  int cols;
370  int active;
371  int needsfirstrefresh;
372} owl_popwin;
373
374typedef struct _owl_messagelist {
375  owl_list list;
376} owl_messagelist;
377
378typedef struct _owl_regex {
379  int negate;
380  char *string;
381  regex_t re;
382} owl_regex;
383
384typedef struct _owl_filterelement {
385  int (*match_message)(struct _owl_filterelement *fe, owl_message *m);
386  /* Append a string representation of the filterelement onto buf*/
387  void (*print_elt)(struct _owl_filterelement *fe, GString *buf);
388  /* Operands for and,or,not*/
389  struct _owl_filterelement *left, *right;
390  /* For regex filters*/
391  owl_regex re;
392  /* Used by regexes, filter references, and perl */
393  char *field;
394} owl_filterelement;
395
396typedef struct _owl_filter {
397  char *name;
398  owl_filterelement * root;
399  int fgcolor;
400  int bgcolor;
401  int cachedmsgid;  /* cached msgid: should move into view eventually */
402} owl_filter;
403
404typedef struct _owl_view {
405  char *name;
406  owl_filter *filter;
407  owl_messagelist ml;
408  owl_style *style;
409} owl_view;
410
411typedef struct _owl_history {
412  owl_list hist;
413  int cur;
414  int touched;
415  int partial;
416  int repeats;
417} owl_history;
418
419typedef struct _owl_editwin owl_editwin;
420typedef struct _owl_editwin_excursion owl_editwin_excursion;
421
422typedef struct _owl_keybinding {
423  int  *keys;                   /* keypress stack */
424  int   len;                    /* length of stack */
425  int   type;                   /* command or function? */
426  char *desc;                   /* description (or "*user*") */
427  char *command;                /* command, if of type command */
428  void (*function_fn)(void);    /* function ptr, if of type function */
429} owl_keybinding;
430
431typedef struct _owl_keymap {
432  char     *name;               /* name of keymap */
433  char     *desc;               /* description */
434  owl_list  bindings;           /* key bindings */
435  struct _owl_keymap *submap;   /* submap */
436  void (*default_fn)(owl_input j);      /* default action (takes a keypress) */
437  void (*prealways_fn)(owl_input  j);   /* always called before a keypress is received */
438  void (*postalways_fn)(owl_input  j);  /* always called after keypress is processed */
439} owl_keymap;
440
441typedef struct _owl_keyhandler {
442  owl_dict  keymaps;            /* dictionary of keymaps */
443  owl_keymap *active;           /* currently active keymap */
444  int       in_esc;             /* escape pressed? */
445  int       kpstack[OWL_KEYMAP_MAXSTACK+1]; /* current stack of keypresses */
446  int       kpstackpos;         /* location in stack (-1 = none) */
447} owl_keyhandler;
448
449typedef struct _owl_buddy {
450  int proto;
451  char *name;
452  int isidle;
453  int idlesince;
454} owl_buddy;
455
456typedef struct _owl_buddylist {
457  owl_list buddies;
458} owl_buddylist;
459
460typedef struct _owl_zbuddylist {
461  owl_list zusers;
462} owl_zbuddylist;
463
464typedef struct _owl_timer {
465  time_t time;
466  int interval;
467  void (*callback)(struct _owl_timer *, void *);
468  void (*destroy)(struct _owl_timer *);
469  void *data;
470} owl_timer;
471
472typedef struct _owl_errqueue {
473  owl_list errlist;
474} owl_errqueue;
475
476typedef struct _owl_colorpair_mgr {
477  int next;
478  short **pairs;
479} owl_colorpair_mgr;
480
481typedef struct _owl_obarray {
482  owl_list strings;
483} owl_obarray;
484
485typedef struct _owl_dispatch {
486  int fd;                                 /* FD to watch for dispatch. */
487  int needs_gc;
488  void (*cfunc)(struct _owl_dispatch*);   /* C function to dispatch to. */
489  void (*destroy)(struct _owl_dispatch*); /* Destructor */
490  void *data;
491} owl_dispatch;
492
493typedef struct _owl_popexec {
494  int refcount;
495  owl_viewwin *vwin;
496  int winactive;
497  int pid;                      /* or 0 if it has terminated */
498  owl_dispatch dispatch;
499} owl_popexec;
500
501typedef struct _owl_global {
502  owl_mainwin mw;
503  owl_popwin pw;
504  owl_history cmdhist;          /* command history */
505  owl_history msghist;          /* outgoing message history */
506  owl_keyhandler kh;
507  owl_list filterlist;
508  owl_list puntlist;
509  owl_vardict vars;
510  owl_cmddict cmds;
511  owl_context ctx;
512  owl_errqueue errqueue;
513  int lines, cols;
514  int curmsg, topmsg;
515  int markedmsgid;              /* for finding the marked message when it has moved. */
516  int curmsg_vert_offset;
517  owl_view current_view;
518  owl_messagelist msglist;
519  WINDOW *recwin, *sepwin, *msgwin, *typwin;
520  int needrefresh;
521  int rightshift;
522  int resizepending;
523  int recwinlines;
524  int typwinactive;
525  char *thishost;
526  char *homedir;
527  char *confdir;
528  char *startupfile;
529  int direction;
530  int zaway;
531  char *cur_zaway_msg;
532  int haveconfig;
533  int config_format;
534  void *buffercbdata;
535  owl_editwin *tw;
536  owl_viewwin vw;
537  void *perl;
538  int debug;
539  time_t starttime;
540  time_t lastinputtime;
541  char *startupargs;
542  int userclue;
543  int nextmsgid;
544  int hascolors;
545  int colorpairs;
546  owl_colorpair_mgr cpmgr;
547  int newmsgproc_pid;
548  int malloced, freed;
549  owl_regex search_re;
550  aim_session_t aimsess;
551  aim_conn_t bosconn;
552  owl_timer aim_noop_timer;
553  owl_timer aim_ignorelogin_timer;
554  int aim_loggedin;         /* true if currently logged into AIM */
555  int aim_doprocessing;     /* true if we should process AIM events (like pending login) */
556  char *aim_screenname;     /* currently logged in AIM screen name */
557  char *aim_screenname_for_filters;     /* currently logged in AIM screen name */
558  owl_buddylist buddylist;  /* list of logged in AIM buddies */
559  owl_list messagequeue;    /* for queueing up aim and other messages */
560  owl_dict styledict;       /* global dictionary of available styles */
561  char *response;           /* response to the last question asked */
562  int havezephyr;
563  int haveaim;
564  int ignoreaimlogin;
565  int got_err_signal;       /* 1 if we got an unexpected signal */
566  siginfo_t err_signal_info;
567  owl_zbuddylist zbuddies;
568  owl_timer zephyr_buddycheck_timer;
569  struct termios startup_tio;
570  owl_obarray obarray;
571  owl_list dispatchlist;
572  GList *timerlist;
573  owl_timer *aim_nop_timer;
574  int load_initial_subs;
575  int interrupted;
576} owl_global;
577
578/* globals */
579extern owl_global g;
580
581#include "owl_prototypes.h"
582
583/* these are missing from the zephyr includes for some reason */
584#ifdef HAVE_LIBZEPHYR
585int ZGetSubscriptions(ZSubscription_t *, int *);
586int ZGetLocations(ZLocations_t *,int *);
587#endif
588
589#endif /* INC_OWL_H */
Note: See TracBrowser for help on using the repository browser.