source: owl.h @ 9835b7a

release-1.10release-1.8release-1.9
Last change on this file since 9835b7a was 33b6431b, checked in by David Benjamin <davidben@mit.edu>, 13 years ago
Clarify owl_io_dispatch ownership A created owl_io_dispatch is owned by whoever created. For instances where owl_select needs to remove one of them, we instead invalidate them. In the case of perl IO dispatches, they are owned by the nebulous blob that implicitly maps fd to IO dispatch. This is completely insane, but should avoid leaving people with invalid owl_io_dispatch pointers. Use this same mechanism to restore owl_select_prune_bad_fds logic. We really need to kill this and owl_timer in favor of glib's things.
  • Property mode set to 100644
File size: 17.9 KB
Line 
1/*  Copyright (c) 2006-2011 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_BARNOWL_OWL_H
10#define INC_BARNOWL_OWL_H
11
12#include "config.h"
13
14#include "compat/compat.h"
15
16#ifdef HAVE_STDBOOL_H
17#include <stdbool.h>
18#else
19#ifndef HAVE__BOOL
20#define _Bool signed char
21#endif
22#define bool _Bool
23#define false 0
24#define true 1
25#define __bool_true_false_are_defined 1
26#endif  /* HAVE_STDBOOL_H */
27
28#ifndef OWL_PERL
29#include <curses.h>
30#include <panel.h>
31#endif
32#include <sys/param.h>
33#include <EXTERN.h>
34#include <netdb.h>
35#include <regex.h>
36#include <time.h>
37#include <signal.h>
38#include <termios.h>
39#include "libfaim/aim.h"
40#include <wchar.h>
41#include "glib.h"
42#ifdef HAVE_LIBZEPHYR
43#include <zephyr/zephyr.h>
44#endif
45#ifdef HAVE_COM_ERR_H
46#include <com_err.h>
47#endif
48
49/* Perl and curses don't play nice. */
50#ifdef OWL_PERL
51typedef void WINDOW;
52typedef void PANEL;
53/* logout is defined in FreeBSD. */
54#define logout logout_
55#define HAS_BOOL
56#include <perl.h>
57#include "owl_perl.h"
58#undef logout
59#include "XSUB.h"
60#else
61typedef void SV;
62typedef void AV;
63typedef void HV;
64#endif
65
66#include "window.h"
67
68#ifndef OWL_VERSION_STRING
69#ifdef  GIT_VERSION
70#define stringify(x)       __stringify(x)
71#define __stringify(x)     #x
72#define OWL_VERSION_STRING stringify(GIT_VERSION)
73#else
74#define OWL_VERSION_STRING PACKAGE_VERSION
75#endif
76#endif /* !OWL_VERSION_STRING */
77
78/* Feature that is being tested to redirect stderr through a pipe.
79 * There may still be some portability problems with this. */
80#define OWL_STDERR_REDIR 1
81
82#define OWL_DEBUG 0
83#define OWL_DEBUG_FILE "/var/tmp/barnowl-debug"
84
85#define OWL_CONFIG_DIR "/.owl"             /* this is relative to the user's home directory */
86#define OWL_STARTUP_FILE "/.owl/startup"   /* this is relative to the user's home directory */
87
88#define OWL_FMTEXT_ATTR_NONE      0
89#define OWL_FMTEXT_ATTR_BOLD      1
90#define OWL_FMTEXT_ATTR_REVERSE   2
91#define OWL_FMTEXT_ATTR_UNDERLINE 4
92
93#define OWL_FMTEXT_UC_BASE 0x100000 /* Unicode Plane 16 - Supplementary Private Use Area-B*/
94#define OWL_FMTEXT_UC_ATTR ( OWL_FMTEXT_UC_BASE | 0x800 )
95#define OWL_FMTEXT_UC_ATTR_MASK 0x7
96#define OWL_FMTEXT_UC_COLOR_BASE ( OWL_FMTEXT_UC_BASE | 0x400 )
97#define OWL_FMTEXT_UC_FGCOLOR OWL_FMTEXT_UC_COLOR_BASE
98#define OWL_FMTEXT_UC_BGCOLOR ( OWL_FMTEXT_UC_COLOR_BASE | 0x200 )
99#define OWL_FMTEXT_UC_DEFAULT_COLOR 0x100
100#define OWL_FMTEXT_UC_FGDEFAULT ( OWL_FMTEXT_UC_FGCOLOR | OWL_FMTEXT_UC_DEFAULT_COLOR )
101#define OWL_FMTEXT_UC_BGDEFAULT ( OWL_FMTEXT_UC_BGCOLOR | OWL_FMTEXT_UC_DEFAULT_COLOR )
102#define OWL_FMTEXT_UC_COLOR_MASK 0xFF
103#define OWL_FMTEXT_UC_ALLCOLOR_MASK ( OWL_FMTEXT_UC_COLOR_MASK | OWL_FMTEXT_UC_DEFAULT_COLOR | 0x200)
104#define OWL_FMTEXT_UC_STARTBYTE_UTF8 '\xf4'
105
106#define OWL_COLOR_BLACK     0
107#define OWL_COLOR_RED       1
108#define OWL_COLOR_GREEN     2
109#define OWL_COLOR_YELLOW    3
110#define OWL_COLOR_BLUE      4
111#define OWL_COLOR_MAGENTA   5
112#define OWL_COLOR_CYAN      6
113#define OWL_COLOR_WHITE     7
114#define OWL_COLOR_DEFAULT   -1
115#define OWL_COLOR_INVALID   -2
116
117#define OWL_TAB_WIDTH 8
118
119#define OWL_EDITWIN_STYLE_MULTILINE 0
120#define OWL_EDITWIN_STYLE_ONELINE   1
121
122#define OWL_PROTOCOL_ZEPHYR         0
123#define OWL_PROTOCOL_AIM            1
124#define OWL_PROTOCOL_JABBER         2
125#define OWL_PROTOCOL_ICQ            3
126#define OWL_PROTOCOL_YAHOO          4
127#define OWL_PROTOCOL_MSN            5
128
129#define OWL_MESSAGE_DIRECTION_NONE  0
130#define OWL_MESSAGE_DIRECTION_IN    1
131#define OWL_MESSAGE_DIRECTION_OUT   2
132
133#define OWL_IO_READ   1
134#define OWL_IO_WRITE  2
135#define OWL_IO_EXCEPT 4
136
137#define OWL_DIRECTION_NONE      0
138#define OWL_DIRECTION_DOWNWARDS 1
139#define OWL_DIRECTION_UPWARDS   2
140
141#define OWL_LOGGING_DIRECTION_BOTH 0
142#define OWL_LOGGING_DIRECTION_IN   1
143#define OWL_LOGGING_DIRECTION_OUT  2
144
145#define OWL_SCROLLMODE_NORMAL      0
146#define OWL_SCROLLMODE_TOP         1
147#define OWL_SCROLLMODE_NEARTOP     2
148#define OWL_SCROLLMODE_CENTER      3
149#define OWL_SCROLLMODE_PAGED       4
150#define OWL_SCROLLMODE_PAGEDCENTER 5
151
152#define OWL_TAB               3  /* This *HAS* to be the size of TABSTR below */
153#define OWL_TABSTR        "   "
154#define OWL_MSGTAB            7
155#define OWL_TYPWIN_SIZE       8
156#define OWL_HISTORYSIZE       50
157
158/* Indicate current state, as well as what is allowed */
159#define OWL_CTX_ANY          0xffff
160/* Only one of these may be active at a time... */
161#define OWL_CTX_MODE_BITS    0x000f
162#define OWL_CTX_STARTUP      0x0001
163#define OWL_CTX_READCONFIG   0x0002
164#define OWL_CTX_INTERACTIVE  0x0004
165/* Only one of these may be active at a time... */
166#define OWL_CTX_ACTIVE_BITS  0xfff0
167#define OWL_CTX_POPWIN       0x00f0
168#define OWL_CTX_POPLESS      0x0010
169#define OWL_CTX_RECWIN       0x0f00
170#define OWL_CTX_RECV         0x0100
171#define OWL_CTX_TYPWIN       0xf000
172#define OWL_CTX_EDIT         0x7000
173#define OWL_CTX_EDITLINE     0x1000
174#define OWL_CTX_EDITMULTI    0x2000
175#define OWL_CTX_EDITRESPONSE 0x4000
176
177#define OWL_VARIABLE_OTHER      0
178#define OWL_VARIABLE_INT        1
179#define OWL_VARIABLE_BOOL       2
180#define OWL_VARIABLE_STRING     3
181
182#define OWL_OUTPUT_RETURN       0
183#define OWL_OUTPUT_POPUP        1
184#define OWL_OUTPUT_ADMINMSG     2
185
186#define OWL_FILTER_MAX_DEPTH    300
187
188#define OWL_KEYMAP_MAXSTACK     20
189
190#define OWL_KEYBINDING_NOOP     0   /* dummy binding that does nothing */
191#define OWL_KEYBINDING_COMMAND  1   /* command string */
192#define OWL_KEYBINDING_FUNCTION 2   /* function taking no args */
193
194#define OWL_DEFAULT_ZAWAYMSG    "I'm sorry, but I am currently away from the terminal and am\nnot able to receive your message.\n"
195#define OWL_DEFAULT_AAWAYMSG    "I'm sorry, but I am currently away from the terminal and am\nnot able to receive your message.\n"
196
197#define OWL_CMD_ALIAS_SUMMARY_PREFIX "command alias to: "
198
199#define OWL_WEBZEPHYR_PRINCIPAL "daemon/webzephyr.mit.edu"
200#define OWL_WEBZEPHYR_CLASS     "webzephyr"
201#define OWL_WEBZEPHYR_OPCODE    "webzephyr"
202
203#define OWL_ZEPHYR_NOSTRIP_HOST         "host/"
204#define OWL_ZEPHYR_NOSTRIP_RCMD         "rcmd."
205#define OWL_ZEPHYR_NOSTRIP_DAEMON5      "daemon/"
206#define OWL_ZEPHYR_NOSTRIP_DAEMON4      "daemon."
207
208#define OWL_REGEX_QUOTECHARS    "!+*.?[]^\\${}()|"
209#define OWL_REGEX_QUOTEWITH     "\\"
210
211#if defined(HAVE_DES_STRING_TO_KEY) && defined(HAVE_DES_KEY_SCHED) && defined(HAVE_DES_ECB_ENCRYPT)
212#define OWL_ENABLE_ZCRYPT 1
213#endif
214
215#define OWL_META(key) ((key)|010000)
216/* OWL_CTRL is definied in kepress.c */
217
218#define LINE 2048
219
220#ifdef HAVE_LIBZEPHYR
221/* libzephyr doesn't use const, so we appease the type system with this kludge.
222 * This just casts const char * to char * in a way that doesn't yield a warning
223 * from gcc -Wcast-qual. */
224static inline char *zstr(const char *str)
225{
226  union { char *rw; const char *ro; } u;
227  u.ro = str;
228  return u.rw;
229}
230#endif
231
232/* Convert char *const * into const char *const *.  This conversion is safe,
233 * and implicit in C++ (conv.qual 4) but for some reason not in C. */
234static inline const char *const *strs(char *const *pstr)
235{
236  return (const char *const *)pstr;
237}
238
239typedef struct _owl_variable {
240  char *name;
241  int   type;  /* OWL_VARIABLE_* */
242  void *pval_default;  /* for types other and string */
243  int   ival_default;  /* for types int and bool     */
244  char *validsettings;          /* documentation of valid settings */
245  char *summary;                /* summary of usage */
246  char *description;            /* detailed description */
247  void *val;                    /* current value */
248  int  (*validate_fn)(const struct _owl_variable *v, const void *newval);
249                                /* returns 1 if newval is valid */
250  int  (*set_fn)(struct _owl_variable *v, const void *newval); 
251                                /* sets the variable to a value
252                                 * of the appropriate type.
253                                 * unless documented, this
254                                 * should make a copy.
255                                 * returns 0 on success. */
256  int  (*set_fromstring_fn)(struct _owl_variable *v, const char *newval);
257                                /* sets the variable to a value
258                                 * of the appropriate type.
259                                 * unless documented, this
260                                 * should make a copy.
261                                 * returns 0 on success. */
262  const void *(*get_fn)(const struct _owl_variable *v);
263                                /* returns a reference to the current value.
264                                 * WARNING:  this approach is hard to make
265                                 * thread-safe... */
266  char *(*get_tostring_fn)(const struct _owl_variable *v, const void *val);
267                                /* converts val to a string;
268                                 * caller must free the result */
269  void (*delete_fn)(struct _owl_variable *v);
270                                /* frees val as needed */
271} owl_variable;
272
273typedef struct _owl_input {
274  int ch;
275  gunichar uch;
276} owl_input;
277
278typedef struct _owl_fmtext {
279  GString *buff;
280} owl_fmtext;
281
282typedef struct _owl_list {
283  int size;
284  int avail;
285  void **list;
286} owl_list;
287
288typedef struct _owl_dict_el {
289  char *k;                      /* key   */
290  void *v;                      /* value */
291} owl_dict_el;
292
293typedef struct _owl_dict {
294  int size;
295  int avail;
296  owl_dict_el *els;             /* invariant: sorted by k */
297} owl_dict;
298typedef owl_dict owl_vardict;   /* dict of variables */
299typedef owl_dict owl_cmddict;   /* dict of commands */
300
301typedef struct _owl_context {
302  int   mode;
303  void *data;           /* determined by mode */
304  char *keymap;
305  owl_window *cursor;
306  void (*deactivate_cb)(struct _owl_context*);
307  void (*delete_cb)(struct _owl_context*);
308  void *cbdata;
309} owl_context;
310
311typedef struct _owl_cmd {       /* command */
312  char *name;
313
314  char *summary;                /* one line summary of command */
315  char *usage;                  /* usage synopsis */
316  char *description;            /* long description of command */
317
318  int validctx;                 /* bitmask of valid contexts */
319
320  /* we should probably have a type here that says which of
321   * the following is valid, and maybe make the below into a union... */
322
323  /* Only one of these may be non-NULL ... */
324
325  char *cmd_aliased_to;         /* what this command is aliased to... */
326 
327  /* These don't take any context */
328  char *(*cmd_args_fn)(int argc, const char *const *argv, const char *buff); 
329                                /* takes argv and the full command as buff.
330                                 * caller must free return value if !NULL */
331  void (*cmd_v_fn)(void);       /* takes no args */
332  void (*cmd_i_fn)(int i);      /* takes an int as an arg */
333
334  /* The following also take the active context if it's valid */
335  char *(*cmd_ctxargs_fn)(void *ctx, int argc, const char *const *argv, const char *buff); 
336                                /* takes argv and the full command as buff.
337                                 * caller must free return value if !NULL */
338  void (*cmd_ctxv_fn)(void *ctx);               /* takes no args */
339  void (*cmd_ctxi_fn)(void *ctx, int i);        /* takes an int as an arg */
340  SV *cmd_perl;                                /* Perl closure that takes a list of args */
341} owl_cmd;
342
343
344typedef struct _owl_zwrite {
345  char *cmd;
346  char *zwriteline;
347  char *class;
348  char *inst;
349  char *realm;
350  char *opcode;
351  char *zsig;
352  char *message;
353  owl_list recips;
354  int cc;
355  int noping;
356} owl_zwrite;
357
358typedef struct _owl_pair {
359  const char *key;
360  char *value;
361} owl_pair;
362
363struct _owl_fmtext_cache;
364
365typedef struct _owl_message {
366  int id;
367  int direction;
368#ifdef HAVE_LIBZEPHYR
369  ZNotice_t notice;
370#endif
371  struct _owl_fmtext_cache * fmtext;
372  int delete;
373  const char *hostname;
374  owl_list attributes;            /* this is a list of pairs */
375  char *timestr;
376  time_t time;
377} owl_message;
378
379#define OWL_FMTEXT_CACHE_SIZE 1000
380/* We cache the saved fmtexts for the last bunch of messages we
381   rendered */
382typedef struct _owl_fmtext_cache {
383    owl_message * message;
384    owl_fmtext fmtext;
385} owl_fmtext_cache;
386
387typedef struct _owl_style {
388  char *name;
389  SV *perlobj;
390} owl_style;
391
392typedef struct _owl_mainwin {
393  int curtruncated;
394  int lasttruncated;
395  int lastdisplayed;
396  owl_window *window;
397} owl_mainwin;
398
399typedef struct _owl_editwin owl_editwin;
400typedef struct _owl_editwin_excursion owl_editwin_excursion;
401
402typedef struct _owl_viewwin {
403  owl_fmtext fmtext;
404  int textlines;
405  int topline;
406  int rightshift;
407  owl_window *window;
408  void (*onclose_hook) (struct _owl_viewwin *vwin, void *data);
409  void *onclose_hook_data;
410
411  gulong sig_resize_id;
412  owl_window *content;
413  gulong sig_content_redraw_id;
414  owl_window *status;
415  gulong sig_status_redraw_id;
416  owl_window *cmdwin;
417} owl_viewwin;
418 
419typedef struct _owl_popwin {
420  owl_window *border;
421  owl_window *content;
422  gulong sig_redraw_id;
423  gulong sig_resize_id;
424} owl_popwin;
425 
426typedef struct _owl_msgwin {
427  char *msg;
428  owl_window *window;
429  gulong redraw_id;
430} owl_msgwin;
431
432typedef struct _owl_messagelist {
433  owl_list list;
434} owl_messagelist;
435
436typedef struct _owl_regex {
437  int negate;
438  char *string;
439  regex_t re;
440} owl_regex;
441
442typedef struct _owl_filterelement {
443  int (*match_message)(const struct _owl_filterelement *fe, const owl_message *m);
444  /* Append a string representation of the filterelement onto buf*/
445  void (*print_elt)(const struct _owl_filterelement *fe, GString *buf);
446  /* Operands for and,or,not*/
447  struct _owl_filterelement *left, *right;
448  /* For regex filters*/
449  owl_regex re;
450  /* Used by regexes, filter references, and perl */
451  char *field;
452} owl_filterelement;
453
454typedef struct _owl_filter {
455  char *name;
456  owl_filterelement * root;
457  int fgcolor;
458  int bgcolor;
459} owl_filter;
460
461typedef struct _owl_view {
462  char *name;
463  owl_filter *filter;
464  owl_messagelist ml;
465  const owl_style *style;
466  int cachedmsgid;
467} owl_view;
468
469typedef struct _owl_history {
470  owl_list hist;
471  int cur;
472  int touched;
473  int partial;
474  int repeats;
475} owl_history;
476
477typedef struct _owl_mainpanel {
478  owl_window *panel;
479  owl_window *typwin;
480  owl_window *sepwin;
481  owl_window *msgwin;
482  owl_window *recwin;
483  int recwinlines;
484} owl_mainpanel;
485
486typedef struct _owl_keybinding {
487  int  *keys;                   /* keypress stack */
488  int   len;                    /* length of stack */
489  int   type;                   /* command or function? */
490  char *desc;                   /* description (or "*user*") */
491  char *command;                /* command, if of type command */
492  void (*function_fn)(void);    /* function ptr, if of type function */
493} owl_keybinding;
494
495typedef struct _owl_keymap {
496  char     *name;               /* name of keymap */
497  char     *desc;               /* description */
498  owl_list  bindings;           /* key bindings */
499  const struct _owl_keymap *parent;     /* parent */
500  void (*default_fn)(owl_input j);      /* default action (takes a keypress) */
501  void (*prealways_fn)(owl_input  j);   /* always called before a keypress is received */
502  void (*postalways_fn)(owl_input  j);  /* always called after keypress is processed */
503} owl_keymap;
504
505typedef struct _owl_keyhandler {
506  owl_dict  keymaps;            /* dictionary of keymaps */
507  const owl_keymap *active;             /* currently active keymap */
508  int       in_esc;             /* escape pressed? */
509  int       kpstack[OWL_KEYMAP_MAXSTACK+1]; /* current stack of keypresses */
510  int       kpstackpos;         /* location in stack (-1 = none) */
511} owl_keyhandler;
512
513typedef struct _owl_buddy {
514  int proto;
515  char *name;
516  int isidle;
517  int idlesince;
518} owl_buddy;
519
520typedef struct _owl_buddylist {
521  owl_list buddies;
522} owl_buddylist;
523
524typedef struct _owl_zbuddylist {
525  owl_list zusers;
526} owl_zbuddylist;
527
528typedef struct _owl_timer {
529  time_t time;
530  int interval;
531  void (*callback)(struct _owl_timer *, void *);
532  void (*destroy)(struct _owl_timer *);
533  void *data;
534  char *name;
535} owl_timer;
536
537typedef struct _owl_errqueue {
538  owl_list errlist;
539} owl_errqueue;
540
541typedef struct _owl_colorpair_mgr {
542  int next;
543  short **pairs;
544  bool overflow;
545} owl_colorpair_mgr;
546
547typedef struct _owl_io_dispatch {
548  int fd;                                     /* FD to watch for dispatch. */
549  int mode;
550  bool valid;
551  int needs_gc;
552  void (*callback)(const struct _owl_io_dispatch *, void *); /* C function to dispatch to. */
553  void (*destroy)(const struct _owl_io_dispatch *);  /* Destructor */
554  void *data;
555  GPollFD pollfd;
556} owl_io_dispatch;
557
558typedef struct _owl_popexec {
559  int refcount;
560  owl_viewwin *vwin;
561  int winactive;
562  pid_t pid;                    /* or 0 if it has terminated */
563  const owl_io_dispatch *dispatch;
564} owl_popexec;
565
566typedef struct _owl_global {
567  owl_mainwin mw;
568  owl_popwin *pw;
569  owl_msgwin msgwin;
570  owl_history cmdhist;          /* command history */
571  owl_history msghist;          /* outgoing message history */
572  owl_keyhandler kh;
573  owl_dict filters;
574  GList *filterlist;
575  owl_list puntlist;
576  owl_vardict vars;
577  owl_cmddict cmds;
578  GList *context_stack;
579  owl_errqueue errqueue;
580  int lines, cols;
581  int curmsg, topmsg;
582  int markedmsgid;              /* for finding the marked message when it has moved. */
583  int curmsg_vert_offset;
584  owl_view current_view;
585  owl_messagelist msglist;
586  WINDOW *input_pad;
587  owl_mainpanel mainpanel;
588  gulong typwin_erase_id;
589  int rightshift;
590  bool resizepending;
591  char *homedir;
592  char *confdir;
593  char *startupfile;
594  int direction;
595  int zaway;
596  char *cur_zaway_msg;
597  int haveconfig;
598  int config_format;
599  owl_editwin *tw;
600  owl_viewwin *vw;
601  void *perl;
602  int debug;
603  time_t starttime;
604  time_t lastinputtime;
605  char *startupargs;
606  int nextmsgid;
607  owl_colorpair_mgr cpmgr;
608  pid_t newmsgproc_pid;
609  owl_regex search_re;
610  aim_session_t aimsess;
611  aim_conn_t bosconn;
612  int aim_loggedin;         /* true if currently logged into AIM */
613  GSource *aim_event_source; /* where we get our AIM events from */
614  char *aim_screenname;     /* currently logged in AIM screen name */
615  char *aim_screenname_for_filters;     /* currently logged in AIM screen name */
616  owl_buddylist buddylist;  /* list of logged in AIM buddies */
617  GQueue *messagequeue;     /* for queueing up aim and other messages */
618  owl_dict styledict;       /* global dictionary of available styles */
619  char *response;           /* response to the last question asked */
620  int havezephyr;
621  int haveaim;
622  int ignoreaimlogin;
623  owl_zbuddylist zbuddies;
624  GList *zaldlist;
625  int pseudologin_notify;
626  struct termios startup_tio;
627  owl_list io_dispatch_list;
628  GList *timerlist;
629  owl_timer *aim_nop_timer;
630  int load_initial_subs;
631  FILE *debug_file;
632  char *kill_buffer;
633  int interrupt_count;
634  GMutex *interrupt_lock;
635} owl_global;
636
637/* globals */
638extern owl_global g;
639
640#include "owl_prototypes.h"
641
642/* These were missing from the Zephyr includes before Zephyr 3. */
643#if defined HAVE_LIBZEPHYR && defined ZCONST
644int ZGetSubscriptions(ZSubscription_t *, int *);
645int ZGetLocations(ZLocations_t *,int *);
646#endif
647
648#endif /* INC_BARNOWL_OWL_H */
Note: See TracBrowser for help on using the repository browser.