]> git.llucax.com Git - software/mutt-debian.git/blob - mutt.h
Update and enable NNTP patch
[software/mutt-debian.git] / mutt.h
1
2 /*
3  * Copyright (C) 1996-2002 Michael R. Elkins <me@mutt.org>
4  * Copyright (C) 2004 g10 Code GmbH
5  * 
6  *     This program is free software; you can redistribute it and/or modify
7  *     it under the terms of the GNU General Public License as published by
8  *     the Free Software Foundation; either version 2 of the License, or
9  *     (at your option) any later version.
10  * 
11  *     This program is distributed in the hope that it will be useful,
12  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *     GNU General Public License for more details.
15  * 
16  *     You should have received a copy of the GNU General Public License
17  *     along with this program; if not, write to the Free Software
18  *     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */ 
20
21 #ifndef MUTT_H
22 #define MUTT_H 
23
24 #include <stdio.h>
25 #include <stdlib.h>
26 #ifdef HAVE_UNISTD_H
27 # include <unistd.h> /* needed for SEEK_SET */
28 #endif
29 #ifdef HAVE_UNIX_H
30 # include <unix.h>   /* needed for snprintf on QNX. */
31 #endif
32 #include <sys/types.h>
33 #include <sys/stat.h>
34 #include <time.h>
35 #include <limits.h>
36 #include <stdarg.h>
37 #include <signal.h>
38 /* On OS X 10.5.x, wide char functions are inlined by default breaking
39  * --without-wc-funcs compilation
40  */
41 #ifdef __APPLE_CC__
42 #define _DONT_USE_CTYPE_INLINE_
43 #endif
44 #ifdef HAVE_WCHAR_H
45 # include <wchar.h>
46 #endif
47 #if defined(HAVE_WCTYPE_H) && defined(HAVE_WC_FUNCS)
48 # include <wctype.h>
49 #endif
50
51 #ifndef _POSIX_PATH_MAX
52 #include <limits.h>
53 #endif
54
55 #include <pwd.h>
56 #include <grp.h>
57
58 #include "rfc822.h"
59 #include "hash.h"
60 #include "charset.h"
61
62 #ifndef HAVE_WC_FUNCS
63 # ifdef MB_LEN_MAX
64 #  undef MB_LEN_MAX
65 # endif
66 # define MB_LEN_MAX 16
67 #endif
68
69 #define MUTT_VERSION (VERSION)
70
71 /* nifty trick I stole from ELM 2.5alpha. */
72 #ifdef MAIN_C
73 #define WHERE 
74 #define INITVAL(x) = x
75 #else
76 #define WHERE extern
77 #define INITVAL(x) 
78 #endif
79
80 #define WHERE_DEFINED 1
81
82 #include "mutt_regex.h"
83
84 /* flags for mutt_enter_string() */
85 #define  M_ALIAS   1      /* do alias "completion" by calling up the alias-menu */
86 #define  M_FILE    (1<<1) /* do file completion */
87 #define  M_EFILE   (1<<2) /* do file completion, plus incoming folders */
88 #define  M_CMD     (1<<3) /* do completion on previous word */
89 #define  M_PASS    (1<<4) /* password mode (no echo) */
90 #define  M_CLEAR   (1<<5) /* clear input if printable character is pressed */
91 #define  M_COMMAND (1<<6) /* do command completion */
92 #define  M_PATTERN (1<<7) /* pattern mode - only used for history classes */
93
94 /* flags for mutt_get_token() */
95 #define M_TOKEN_EQUAL           1       /* treat '=' as a special */
96 #define M_TOKEN_CONDENSE        (1<<1)  /* ^(char) to control chars (macros) */
97 #define M_TOKEN_SPACE           (1<<2)  /* don't treat whitespace as a term */
98 #define M_TOKEN_QUOTE           (1<<3)  /* don't interpret quotes */
99 #define M_TOKEN_PATTERN         (1<<4)  /* !)|~ are terms (for patterns) */
100 #define M_TOKEN_COMMENT         (1<<5)  /* don't reap comments */
101 #define M_TOKEN_SEMICOLON       (1<<6)  /* don't treat ; as special */
102
103 /* flags for km_dokey() */
104 #define M_KM_UNBUFFERED 1 /* don't read from the key buffer */
105
106 typedef struct
107 {
108   char *data;   /* pointer to data */
109   char *dptr;   /* current read/write position */
110   size_t dsize; /* length of data */
111   int destroy;  /* destroy `data' when done? */
112 } BUFFER;
113
114 typedef struct
115 {
116   int ch; /* raw key pressed */
117   int op; /* function op */
118 } event_t;
119
120 /* flags for _mutt_system() */
121 #define M_DETACH_PROCESS        1       /* detach subprocess from group */
122
123 /* flags for mutt_FormatString() */
124 typedef enum
125 {
126   M_FORMAT_FORCESUBJ    = (1<<0), /* print the subject even if unchanged */
127   M_FORMAT_TREE         = (1<<1), /* draw the thread tree */
128   M_FORMAT_MAKEPRINT    = (1<<2), /* make sure that all chars are printable */
129   M_FORMAT_OPTIONAL     = (1<<3),
130   M_FORMAT_STAT_FILE    = (1<<4), /* used by mutt_attach_fmt */
131   M_FORMAT_ARROWCURSOR  = (1<<5), /* reserve space for arrow_cursor */
132   M_FORMAT_INDEX        = (1<<6), /* this is a main index entry */
133   M_FORMAT_NOFILTER     = (1<<7)  /* do not allow filtering on this pass */
134 } format_flag;
135
136 /* types for mutt_add_hook() */
137 #define M_FOLDERHOOK    1
138 #define M_MBOXHOOK      (1<<1)
139 #define M_SENDHOOK      (1<<2)
140 #define M_FCCHOOK       (1<<3)
141 #define M_SAVEHOOK      (1<<4)
142 #define M_CHARSETHOOK   (1<<5)
143 #define M_ICONVHOOK     (1<<6)
144 #define M_MESSAGEHOOK   (1<<7)
145 #define M_CRYPTHOOK     (1<<8)
146 #define M_ACCOUNTHOOK   (1<<9)
147 #define M_REPLYHOOK     (1<<10)
148 #define M_SEND2HOOK     (1<<11)
149
150 /* tree characters for linearize_tree and print_enriched_string */
151 #define M_TREE_LLCORNER         1
152 #define M_TREE_ULCORNER         2
153 #define M_TREE_LTEE             3
154 #define M_TREE_HLINE            4
155 #define M_TREE_VLINE            5
156 #define M_TREE_SPACE            6
157 #define M_TREE_RARROW           7
158 #define M_TREE_STAR             8
159 #define M_TREE_HIDDEN           9
160 #define M_TREE_EQUALS           10
161 #define M_TREE_TTEE             11
162 #define M_TREE_BTEE             12
163 #define M_TREE_MISSING          13
164 #define M_TREE_MAX              14
165
166 #define M_THREAD_COLLAPSE       (1<<0)
167 #define M_THREAD_UNCOLLAPSE     (1<<1)
168 #define M_THREAD_GET_HIDDEN     (1<<2)
169 #define M_THREAD_UNREAD         (1<<3)
170 #define M_THREAD_NEXT_UNREAD    (1<<4)
171
172 enum
173 {
174   /* modes for mutt_view_attachment() */
175   M_REGULAR = 1,
176   M_MAILCAP,
177   M_AS_TEXT,
178
179   /* action codes used by mutt_set_flag() and mutt_pattern_function() */
180   M_ALL,
181   M_NONE,
182   M_NEW,
183   M_OLD,
184   M_REPLIED,
185   M_READ,
186   M_UNREAD,
187   M_DELETE,
188   M_UNDELETE,
189   M_DELETED,
190   M_FLAG,
191   M_TAG,
192   M_UNTAG,
193   M_LIMIT,
194   M_EXPIRED,
195   M_SUPERSEDED,
196
197   /* actions for mutt_pattern_comp/mutt_pattern_exec */
198   M_AND,
199   M_OR,
200   M_THREAD,
201   M_TO,
202   M_CC,
203   M_COLLAPSED,
204   M_SUBJECT,
205   M_FROM,
206   M_DATE,
207   M_DATE_RECEIVED,
208   M_DUPLICATED,
209   M_UNREFERENCED,
210   M_ID,
211   M_BODY,
212   M_HEADER,
213   M_HORMEL,
214   M_WHOLE_MSG,
215   M_SENDER,
216   M_MESSAGE,
217   M_SCORE,
218   M_SIZE,
219   M_REFERENCE,
220   M_RECIPIENT,
221   M_LIST,
222   M_SUBSCRIBED_LIST,
223   M_PERSONAL_RECIP,
224   M_PERSONAL_FROM,
225   M_ADDRESS,
226   M_CRYPT_SIGN,
227   M_CRYPT_VERIFIED,
228   M_CRYPT_ENCRYPT,
229   M_PGP_KEY,
230   M_XLABEL,
231   M_MIMEATTACH,
232   
233   /* Options for Mailcap lookup */
234   M_EDIT,
235   M_COMPOSE,
236   M_PRINT,
237   M_AUTOVIEW,
238
239   /* options for socket code */
240   M_NEW_SOCKET,
241 #ifdef USE_SSL_OPENSSL
242   M_NEW_SSL_SOCKET,
243 #endif
244
245   /* Options for mutt_save_attachment */
246   M_SAVE_APPEND,
247   M_SAVE_OVERWRITE
248 };
249
250 /* possible arguments to set_quadoption() */
251 enum
252 {
253   M_NO,
254   M_YES,
255   M_ASKNO,
256   M_ASKYES
257 };
258
259 /* quad-option vars */
260 enum
261 {
262   OPT_ABORT,
263   OPT_BOUNCE,
264   OPT_COPY,
265   OPT_DELETE,
266   OPT_FORWEDIT,
267   OPT_FCCATTACH,
268   OPT_INCLUDE,
269   OPT_MFUPTO,
270   OPT_MIMEFWD,
271   OPT_MIMEFWDREST,
272   OPT_MOVE,
273   OPT_PGPMIMEAUTO,     /* ask to revert to PGP/MIME when inline fails */
274 #ifdef USE_POP
275   OPT_POPDELETE,
276   OPT_POPRECONNECT,
277 #endif
278   OPT_POSTPONE,
279   OPT_PRINT,
280   OPT_QUIT,
281   OPT_REPLYTO,
282   OPT_RECALL,
283 #if defined(USE_SSL)
284   OPT_SSLSTARTTLS,
285 #endif
286   OPT_SUBJECT,
287   OPT_VERIFYSIG,      /* verify PGP signatures */
288     
289   /* THIS MUST BE THE LAST VALUE. */
290   OPT_MAX
291 };
292
293 /* flags to ci_send_message() */
294 #define SENDREPLY       (1<<0)
295 #define SENDGROUPREPLY  (1<<1)
296 #define SENDLISTREPLY   (1<<2)
297 #define SENDFORWARD     (1<<3)
298 #define SENDPOSTPONED   (1<<4)
299 #define SENDBATCH       (1<<5)
300 #define SENDMAILX       (1<<6)
301 #define SENDKEY         (1<<7)
302 #define SENDRESEND      (1<<8)
303
304 /* flags to _mutt_select_file() */
305 #define M_SEL_BUFFY     (1<<0)
306 #define M_SEL_MULTI     (1<<1)
307 #define M_SEL_FOLDER    (1<<2)
308
309 /* flags for parse_spam_list */
310 #define M_SPAM          1
311 #define M_NOSPAM        2
312
313 /* boolean vars */
314 enum
315 {
316   OPTALLOW8BIT,
317   OPTALLOWANSI,
318   OPTARROWCURSOR,
319   OPTASCIICHARS,
320   OPTASKBCC,
321   OPTASKCC,
322   OPTATTACHSPLIT,
323   OPTAUTOEDIT,
324   OPTAUTOTAG,
325   OPTBEEP,
326   OPTBEEPNEW,
327   OPTBOUNCEDELIVERED,
328   OPTBRAILLEFRIENDLY,
329   OPTCHECKMBOXSIZE,
330   OPTCHECKNEW,
331   OPTCOLLAPSEUNREAD,
332   OPTCONFIRMAPPEND,
333   OPTCONFIRMCREATE,
334   OPTDELETEUNTAG,
335   OPTDIGESTCOLLAPSE,
336   OPTDUPTHREADS,
337   OPTEDITHDRS,
338   OPTENCODEFROM,
339   OPTENVFROM,
340   OPTFASTREPLY,
341   OPTFCCCLEAR,
342   OPTFOLLOWUPTO,
343   OPTFORCENAME,
344   OPTFORWDECODE,
345   OPTFORWQUOTE,
346 #ifdef USE_HCACHE
347   OPTHCACHEVERIFY,
348 #if defined(HAVE_QDBM) || defined(HAVE_TC)
349   OPTHCACHECOMPRESS,
350 #endif /* HAVE_QDBM */
351 #endif
352   OPTHDRS,
353   OPTHEADER,
354   OPTHELP,
355   OPTHIDDENHOST,
356   OPTHIDELIMITED,
357   OPTHIDEMISSING,
358   OPTHIDETHREADSUBJECT,
359   OPTHIDETOPLIMITED,
360   OPTHIDETOPMISSING,
361   OPTHONORDISP,
362   OPTIGNORELWS,
363   OPTIGNORELISTREPLYTO,
364 #ifdef USE_IMAP
365   OPTIMAPCHECKSUBSCRIBED,
366   OPTIMAPIDLE,
367   OPTIMAPLSUB,
368   OPTIMAPPASSIVE,
369   OPTIMAPPEEK,
370   OPTIMAPSERVERNOISE,
371 #endif
372 #if defined(USE_SSL)
373 # ifndef USE_SSL_GNUTLS
374   OPTSSLSYSTEMCERTS,
375   OPTSSLV2,
376 # endif /* USE_SSL_GNUTLS */
377   OPTSSLV3,
378   OPTTLSV1,
379   OPTSSLFORCETLS,
380   OPTSSLVERIFYDATES,
381   OPTSSLVERIFYHOST,
382 #endif /* defined(USE_SSL) */
383   OPTIMPLICITAUTOVIEW,
384   OPTINCLUDEONLYFIRST,
385   OPTKEEPFLAGGED,
386   OPTMAILCAPSANITIZE,
387   OPTMAILCHECKRECENT,
388   OPTMAILDIRTRASH,
389   OPTMARKERS,
390   OPTMARKOLD,
391   OPTMENUSCROLL,        /* scroll menu instead of implicit next-page */
392   OPTMENUMOVEOFF,       /* allow menu to scroll past last entry */
393 #if defined(USE_IMAP) || defined(USE_POP)
394   OPTMESSAGECACHECLEAN,
395 #endif
396   OPTMETAKEY,           /* interpret ALT-x as ESC-x */
397   OPTMETOO,
398   OPTMHPURGE,
399   OPTMIMEFORWDECODE,
400   OPTNARROWTREE,
401   OPTPAGERSTOP,
402   OPTPIPEDECODE,
403   OPTPIPESPLIT,
404 #ifdef USE_POP
405   OPTPOPAUTHTRYALL,
406   OPTPOPLAST,
407 #endif
408   OPTPRINTDECODE,
409   OPTPRINTSPLIT,
410   OPTPROMPTAFTER,
411   OPTREADONLY,
412   OPTREPLYSELF,
413   OPTRESOLVE,
414   OPTREVALIAS,
415   OPTREVNAME,
416   OPTREVREAL,
417   OPTRFC2047PARAMS,
418   OPTSAVEADDRESS,
419   OPTSAVEEMPTY,
420   OPTSAVENAME,
421   OPTSCORE,
422   OPTSIGDASHES,
423   OPTSIGONTOP,
424   OPTSORTRE,
425   OPTSPAMSEP,
426   OPTSTATUSONTOP,
427   OPTSTRICTTHREADS,
428   OPTSUSPEND,
429   OPTTEXTFLOWED,
430   OPTTHOROUGHSRC,
431   OPTTHREADRECEIVED,
432   OPTTILDE,
433   OPTUNCOLLAPSEJUMP,
434   OPTUSE8BITMIME,
435   OPTUSEDOMAIN,
436   OPTUSEFROM,
437   OPTUSEGPGAGENT,
438 #ifdef HAVE_LIBIDN
439   OPTUSEIDN,
440 #endif
441 #ifdef HAVE_GETADDRINFO
442   OPTUSEIPV6,
443 #endif
444   OPTWAITKEY,
445   OPTWEED,
446   OPTWRAP,
447   OPTWRAPSEARCH,
448   OPTWRITEBCC,          /* write out a bcc header? */
449   OPTXMAILER,
450
451   OPTCRYPTUSEGPGME,
452   OPTCRYPTUSEPKA,
453
454   /* PGP options */
455   
456   OPTCRYPTAUTOSIGN,
457   OPTCRYPTAUTOENCRYPT,
458   OPTCRYPTAUTOPGP,
459   OPTCRYPTAUTOSMIME,
460   OPTCRYPTREPLYENCRYPT,
461   OPTCRYPTREPLYSIGN,
462   OPTCRYPTREPLYSIGNENCRYPTED,
463   OPTCRYPTTIMESTAMP,
464   OPTSMIMEISDEFAULT,
465   OPTASKCERTLABEL,
466   OPTSDEFAULTDECRYPTKEY,
467   OPTPGPIGNORESUB,
468   OPTPGPCHECKEXIT,
469   OPTPGPLONGIDS,
470   OPTPGPAUTODEC,
471 #if 0
472   OPTPGPENCRYPTSELF,
473 #endif
474   OPTPGPRETAINABLESIG,
475   OPTPGPSTRICTENC,
476   OPTFORWDECRYPT,
477   OPTPGPSHOWUNUSABLE,
478   OPTPGPAUTOINLINE,
479   OPTPGPREPLYINLINE,
480
481   /* pseudo options */
482
483   OPTAUXSORT,           /* (pseudo) using auxillary sort function */
484   OPTFORCEREFRESH,      /* (pseudo) refresh even during macros */
485   OPTLOCALES,           /* (pseudo) set if user has valid locale definition */
486   OPTNOCURSES,          /* (pseudo) when sending in batch mode */
487   OPTNEEDREDRAW,        /* (pseudo) to notify caller of a submenu */
488   OPTSEARCHREVERSE,     /* (pseudo) used by ci_search_command */
489   OPTMSGERR,            /* (pseudo) used by mutt_error/mutt_message */
490   OPTSEARCHINVALID,     /* (pseudo) used to invalidate the search pat */
491   OPTSIGNALSBLOCKED,    /* (pseudo) using by mutt_block_signals () */
492   OPTSYSSIGNALSBLOCKED, /* (pseudo) using by mutt_block_signals_system () */
493   OPTNEEDRESORT,        /* (pseudo) used to force a re-sort */
494   OPTRESORTINIT,        /* (pseudo) used to force the next resort to be from scratch */
495   OPTVIEWATTACH,        /* (pseudo) signals that we are viewing attachments */
496   OPTFORCEREDRAWINDEX,  /* (pseudo) used to force a redraw in the main index */
497   OPTFORCEREDRAWPAGER,  /* (pseudo) used to force a redraw in the pager */
498   OPTSORTSUBTHREADS,    /* (pseudo) used when $sort_aux changes */
499   OPTNEEDRESCORE,       /* (pseudo) set when the `score' command is used */
500   OPTATTACHMSG,         /* (pseudo) used by attach-message */
501   OPTKEEPQUIET,         /* (pseudo) shut up the message and refresh
502                          *          functions while we are executing an
503                          *          external program.
504                          */
505   OPTMENUCALLER,        /* (pseudo) tell menu to give caller a take */
506   OPTREDRAWTREE,        /* (pseudo) redraw the thread tree */
507   OPTPGPCHECKTRUST,     /* (pseudo) used by pgp_select_key () */
508   OPTDONTHANDLEPGPKEYS, /* (pseudo) used to extract PGP keys */
509   OPTUNBUFFEREDINPUT,   /* (pseudo) don't use key buffer */
510
511   OPTMAX
512 };
513
514 #define mutt_bit_alloc(n) calloc ((n + 7) / 8, sizeof (char))
515 #define mutt_bit_set(v,n) v[n/8] |= (1 << (n % 8))
516 #define mutt_bit_unset(v,n) v[n/8] &= ~(1 << (n % 8))
517 #define mutt_bit_toggle(v,n) v[n/8] ^= (1 << (n % 8))
518 #define mutt_bit_isset(v,n) (v[n/8] & (1 << (n % 8)))
519
520 #define set_option(x) mutt_bit_set(Options,x)
521 #define unset_option(x) mutt_bit_unset(Options,x)
522 #define toggle_option(x) mutt_bit_toggle(Options,x)
523 #define option(x) mutt_bit_isset(Options,x)
524
525 typedef struct list_t
526 {
527   char *data;
528   struct list_t *next;
529 } LIST;
530
531 typedef struct rx_list_t
532 {
533   REGEXP *rx;
534   struct rx_list_t *next;
535 } RX_LIST;
536
537 typedef struct spam_list_t
538 {
539   REGEXP *rx;
540   int     nmatch;
541   char   *template;
542   struct spam_list_t *next;
543 } SPAM_LIST;
544
545 #define mutt_new_list() safe_calloc (1, sizeof (LIST))
546 #define mutt_new_rx_list() safe_calloc (1, sizeof (RX_LIST))
547 #define mutt_new_spam_list() safe_calloc (1, sizeof (SPAM_LIST))
548 void mutt_free_list (LIST **);
549 void mutt_free_rx_list (RX_LIST **);
550 void mutt_free_spam_list (SPAM_LIST **);
551 LIST *mutt_copy_list (LIST *);
552 int mutt_matches_ignore (const char *, LIST *);
553
554 /* add an element to a list */
555 LIST *mutt_add_list (LIST *, const char *);
556 LIST *mutt_add_list_n (LIST*, const void *, size_t);
557 LIST *mutt_find_list (LIST *, const char *);
558 int mutt_remove_from_rx_list (RX_LIST **l, const char *str);
559
560 void mutt_init (int, LIST *);
561
562 typedef struct alias
563 {
564   struct alias *self;           /* XXX - ugly hack */
565   char *name;
566   ADDRESS *addr;
567   struct alias *next;
568   short tagged;
569   short del;
570   short num;
571 } ALIAS;
572
573 typedef struct envelope
574 {
575   ADDRESS *return_path;
576   ADDRESS *from;
577   ADDRESS *to;
578   ADDRESS *cc;
579   ADDRESS *bcc;
580   ADDRESS *sender;
581   ADDRESS *reply_to;
582   ADDRESS *mail_followup_to;
583   char *list_post;              /* this stores a mailto URL, or nothing */
584   char *subject;
585   char *real_subj;              /* offset of the real subject */
586   char *message_id;
587   char *supersedes;
588   char *date;
589   char *x_label;
590   BUFFER *spam;
591   LIST *references;             /* message references (in reverse order) */
592   LIST *in_reply_to;            /* in-reply-to header content */
593   LIST *userhdrs;               /* user defined headers */
594
595   unsigned int irt_changed : 1; /* In-Reply-To changed to link/break threads */
596   unsigned int refs_changed : 1; /* References changed to break thread */
597 } ENVELOPE;
598
599 typedef struct parameter
600 {
601   char *attribute;
602   char *value;
603   struct parameter *next;
604 } PARAMETER;
605
606 /* Information that helps in determing the Content-* of an attachment */
607 typedef struct content
608 {
609   long hibin;              /* 8-bit characters */
610   long lobin;              /* unprintable 7-bit chars (eg., control chars) */
611   long crlf;               /* '\r' and '\n' characters */
612   long ascii;              /* number of ascii chars */
613   long linemax;            /* length of the longest line in the file */
614   unsigned int space : 1;  /* whitespace at the end of lines? */
615   unsigned int binary : 1; /* long lines, or CR not in CRLF pair */
616   unsigned int from : 1;   /* has a line beginning with "From "? */
617   unsigned int dot : 1;    /* has a line consisting of a single dot? */
618   unsigned int cr : 1;     /* has CR, even when in a CRLF pair */
619 } CONTENT;
620
621 typedef struct body
622 {
623   char *xtype;                  /* content-type if x-unknown */
624   char *subtype;                /* content-type subtype */
625   PARAMETER *parameter;         /* parameters of the content-type */
626   char *description;            /* content-description */
627   char *form_name;              /* Content-Disposition form-data name param */
628   long hdr_offset;              /* offset in stream where the headers begin.
629                                  * this info is used when invoking metamail,
630                                  * where we need to send the headers of the
631                                  * attachment
632                                  */
633   LOFF_T offset;                /* offset where the actual data begins */
634   LOFF_T length;                /* length (in bytes) of attachment */
635   char *filename;               /* when sending a message, this is the file
636                                  * to which this structure refers
637                                  */
638   char *d_filename;             /* filename to be used for the 
639                                  * content-disposition header.
640                                  * If NULL, filename is used 
641                                  * instead.
642                                  */
643   char *charset;                /* charset of attached file */
644   CONTENT *content;             /* structure used to store detailed info about
645                                  * the content of the attachment.  this is used
646                                  * to determine what content-transfer-encoding
647                                  * is required when sending mail.
648                                  */
649   struct body *next;            /* next attachment in the list */
650   struct body *parts;           /* parts of a multipart or message/rfc822 */
651   struct header *hdr;           /* header information for message/rfc822 */
652
653   struct attachptr *aptr;       /* Menu information, used in recvattach.c */
654
655   signed short attach_count;
656
657   time_t stamp;                 /* time stamp of last
658                                  * encoding update.
659                                  */
660   
661   unsigned int type : 4;        /* content-type primary type */
662   unsigned int encoding : 3;    /* content-transfer-encoding */
663   unsigned int disposition : 2; /* content-disposition */
664   unsigned int use_disp : 1;    /* Content-Disposition uses filename= ? */
665   unsigned int unlink : 1;      /* flag to indicate the the file named by
666                                  * "filename" should be unlink()ed before
667                                  * free()ing this structure
668                                  */
669   unsigned int tagged : 1;
670   unsigned int deleted : 1;     /* attachment marked for deletion */
671
672   unsigned int noconv : 1;      /* don't do character set conversion */
673   unsigned int force_charset : 1; 
674                                 /* send mode: don't adjust the character
675                                  * set when in send-mode.
676                                  */
677   unsigned int is_signed_data : 1; /* A lot of MUAs don't indicate
678                                       S/MIME signed-data correctly,
679                                       e.g. they use foo.p7m even for
680                                       the name of signed data.  This
681                                       flag is used to keep track of
682                                       the actual message type.  It
683                                       gets set during the verification
684                                       (which is done if the encryption
685                                       try failed) and check by the
686                                       function to figure the type of
687                                       the message. */
688
689   unsigned int goodsig : 1;     /* good cryptographic signature */
690   unsigned int warnsig : 1;     /* maybe good signature */
691   unsigned int badsig : 1;      /* bad cryptographic signature (needed to check encrypted s/mime-signatures) */
692
693   unsigned int collapsed : 1;   /* used by recvattach */
694   unsigned int attach_qualifies : 1;
695
696 } BODY;
697
698 /* #3279: AIX defines conflicting struct thread */
699 typedef struct mutt_thread THREAD;
700
701 typedef struct header
702 {
703   unsigned int security : 11;  /* bit 0-6: flags, bit 7,8: application.
704                                  see: crypt.h pgplib.h, smime.h */
705
706   unsigned int mime : 1;                /* has a MIME-Version header? */
707   unsigned int flagged : 1;             /* marked important? */
708   unsigned int tagged : 1;
709   unsigned int deleted : 1;
710   unsigned int changed : 1;
711   unsigned int attach_del : 1;          /* has an attachment marked for deletion */
712   unsigned int old : 1;
713   unsigned int read : 1;
714   unsigned int expired : 1;             /* already expired? */
715   unsigned int superseded : 1;          /* got superseded? */
716   unsigned int replied : 1;
717   unsigned int subject_changed : 1;     /* used for threading */
718   unsigned int threaded : 1;            /* used for threading */
719   unsigned int display_subject : 1;     /* used for threading */
720   unsigned int recip_valid : 1;         /* is_recipient is valid */
721   unsigned int active : 1;              /* message is not to be removed */
722   unsigned int trash : 1;               /* message is marked as trashed on disk.
723                                          * This flag is used by the maildir_trash
724                                          * option.
725                                          */
726   
727   /* timezone of the sender of this message */
728   unsigned int zhours : 5;
729   unsigned int zminutes : 6;
730   unsigned int zoccident : 1;
731
732   /* bits used for caching when searching */
733   unsigned int searched : 1;
734   unsigned int matched : 1;
735
736   /* tells whether the attachment count is valid */
737   unsigned int attach_valid : 1;
738
739   /* the following are used to support collapsing threads  */
740   unsigned int collapsed : 1;   /* is this message part of a collapsed thread? */
741   unsigned int limited : 1;     /* is this message in a limited view?  */
742   size_t num_hidden;            /* number of hidden messages in this view */
743
744   short recipient;              /* user_is_recipient()'s return value, cached */
745   
746   int pair;                     /* color-pair to use when displaying in the index */
747
748   time_t date_sent;             /* time when the message was sent (UTC) */
749   time_t received;              /* time when the message was placed in the mailbox */
750   LOFF_T offset;                /* where in the stream does this message begin? */
751   int lines;                    /* how many lines in the body of this message? */
752   int index;                    /* the absolute (unsorted) message number */
753   int msgno;                    /* number displayed to the user */
754   int virtual;                  /* virtual message number */
755   int score;
756   ENVELOPE *env;                /* envelope information */
757   BODY *content;                /* list of MIME parts */
758   char *path;
759   
760   char *tree;                   /* character string to print thread tree */
761   THREAD *thread;
762
763   /* Number of qualifying attachments in message, if attach_valid */
764   short attach_total;
765
766 #ifdef MIXMASTER
767   LIST *chain;
768 #endif
769
770 #ifdef USE_POP
771   int refno;                    /* message number on server */
772 #endif
773
774 #if defined USE_POP || defined USE_IMAP
775   void *data;                   /* driver-specific data */
776 #endif
777   
778   char *maildir_flags;          /* unknown maildir flags */
779 } HEADER;
780
781 struct mutt_thread
782 {
783   unsigned int fake_thread : 1;
784   unsigned int duplicate_thread : 1;
785   unsigned int sort_children : 1;
786   unsigned int check_subject : 1;
787   unsigned int visible : 1;
788   unsigned int deep : 1;
789   unsigned int subtree_visible : 2;
790   unsigned int next_subtree_visible : 1;
791   THREAD *parent;
792   THREAD *child;
793   THREAD *next;
794   THREAD *prev;
795   HEADER *message;
796   HEADER *sort_key;
797 };
798
799
800 /* flag to mutt_pattern_comp() */
801 #define M_FULL_MSG      (1<<0)  /* enable body and header matching */
802
803 typedef enum {
804   M_MATCH_FULL_ADDRESS = 1
805 } pattern_exec_flag;
806
807 typedef struct group_t
808 {
809   ADDRESS *as;
810   RX_LIST *rs;
811   char *name;
812 } group_t;
813
814 typedef struct group_context_t
815 {
816   group_t *g;
817   struct group_context_t *next;
818 } group_context_t;
819
820 typedef struct pattern_t
821 {
822   short op;
823   unsigned int not : 1;
824   unsigned int alladdr : 1;
825   unsigned int stringmatch : 1;
826   unsigned int groupmatch : 1;
827   unsigned int ign_case : 1;            /* ignore case for local stringmatch searches */
828   int min;
829   int max;
830   struct pattern_t *next;
831   struct pattern_t *child;              /* arguments to logical op */
832   union 
833   {
834     regex_t *rx;
835     group_t *g;
836     char *str;
837   } p;
838 } pattern_t;
839
840 /* ACL Rights */
841 enum
842 {
843   M_ACL_LOOKUP = 0,
844   M_ACL_READ,
845   M_ACL_SEEN,
846   M_ACL_WRITE,
847   M_ACL_INSERT,
848   M_ACL_POST,
849   M_ACL_CREATE,
850   M_ACL_DELMX,
851   M_ACL_DELETE,
852   M_ACL_EXPUNGE,
853   M_ACL_ADMIN,
854
855   RIGHTSMAX
856 };
857
858 typedef struct _context
859 {
860   char *path;
861   FILE *fp;
862   time_t mtime;
863   off_t size;
864   off_t vsize;
865   char *pattern;                /* limit pattern string */
866   pattern_t *limit_pattern;     /* compiled limit pattern */
867   HEADER **hdrs;
868   HEADER *last_tag;             /* last tagged msg. used to link threads */
869   THREAD *tree;                 /* top of thread tree */
870   HASH *id_hash;                /* hash table by msg id */
871   HASH *subj_hash;              /* hash table by subject */
872   HASH *thread_hash;            /* hash table for threading */
873   int *v2r;                     /* mapping from virtual to real msgno */
874   int hdrmax;                   /* number of pointers in hdrs */
875   int msgcount;                 /* number of messages in the mailbox */
876   int vcount;                   /* the number of virtual messages */
877   int tagged;                   /* how many messages are tagged? */
878   int new;                      /* how many new messages? */
879   int unread;                   /* how many unread messages? */
880   int deleted;                  /* how many deleted messages */
881   int flagged;                  /* how many flagged messages */
882   int msgnotreadyet;            /* which msg "new" in pager, -1 if none */
883
884   short magic;                  /* mailbox type */
885
886   unsigned char rights[(RIGHTSMAX + 7)/8];      /* ACL bits */
887
888   unsigned int locked : 1;      /* is the mailbox locked? */
889   unsigned int changed : 1;     /* mailbox has been modified */
890   unsigned int readonly : 1;    /* don't allow changes to the mailbox */
891   unsigned int dontwrite : 1;   /* dont write the mailbox on close */
892   unsigned int append : 1;      /* mailbox is opened in append mode */
893   unsigned int quiet : 1;       /* inhibit status messages? */
894   unsigned int collapsed : 1;   /* are all threads collapsed? */
895   unsigned int closing : 1;     /* mailbox is being closed */
896
897   /* driver hooks */
898   void *data;                   /* driver specific data */
899   int (*mx_close)(struct _context *);
900 } CONTEXT;
901
902 typedef struct
903 {
904   FILE *fpin;
905   FILE *fpout;
906   char *prefix;
907   int flags;
908 } STATE;
909
910 /* used by enter.c */
911
912 typedef struct
913 {
914   wchar_t *wbuf;
915   size_t wbuflen;
916   size_t lastchar;
917   size_t curpos;
918   size_t begin;
919   int    tabs;
920 } ENTER_STATE;
921
922 /* flags for the STATE struct */
923 #define M_DISPLAY       (1<<0) /* output is displayed to the user */
924 #define M_VERIFY        (1<<1) /* perform signature verification */
925 #define M_PENDINGPREFIX (1<<2) /* prefix to write, but character must follow */
926 #define M_WEED          (1<<3) /* weed headers even when not in display mode */
927 #define M_CHARCONV      (1<<4) /* Do character set conversions */
928 #define M_PRINTING      (1<<5) /* are we printing? - M_DISPLAY "light" */
929 #define M_REPLYING      (1<<6) /* are we replying? */
930 #define M_FIRSTDONE     (1<<7) /* the first attachment has been done */
931
932 #define state_set_prefix(s) ((s)->flags |= M_PENDINGPREFIX)
933 #define state_reset_prefix(s) ((s)->flags &= ~M_PENDINGPREFIX)
934 #define state_puts(x,y) fputs(x,(y)->fpout)
935 #define state_putc(x,y) fputc(x,(y)->fpout)
936
937 void state_mark_attach (STATE *);
938 void state_attach_puts (const char *, STATE *);
939 void state_prefix_putc (char, STATE *);
940 int  state_printf(STATE *, const char *, ...);
941 int state_putwc (wchar_t, STATE *);
942 int state_putws (const wchar_t *, STATE *);
943
944 /* for attachment counter */
945 typedef struct
946 {
947   char   *major;
948   int     major_int;
949   char   *minor;
950   regex_t minor_rx;
951 } ATTACH_MATCH;
952
953 #define M_PARTS_TOPLEVEL        (1<<0)  /* is the top-level part */
954
955 #include "ascii.h"
956 #include "protos.h"
957 #include "lib.h"
958 #include "globals.h"
959
960 #endif /*MUTT_H*/