X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=mx.h;h=f2a4e59b1922785564be9cc9688b8fcac54876af;hp=0df652f1e6d01f0516a70a4c55d5ce8baf4b6183;hb=b2a6a9673e124c222f921650a6f0025b64ab2145;hpb=c3e57678c8be193fc137854020f3a90887be97c9 diff --git a/mx.h b/mx.h index 0df652f..f2a4e59 100644 --- a/mx.h +++ b/mx.h @@ -9,16 +9,20 @@ */ /* - * This header file contains prototypes for internal functions used by the - * generic mailbox api. None of these functions should be called directly. + * mailbox abstraction + * when adding code dealing with folders or whatever, + * please use these only */ #ifndef _MX_H #define _MX_H -#include "mailbox.h" +#include -/* supported mailbox formats */ +/* + * supported mailbox formats + * in mx_init() the registration order must be exactly as given here!!!1! + */ enum { M_MBOX = 1, M_MMDF, @@ -38,49 +42,122 @@ enum { #endif }; -WHERE short DefaultMagic INITVAL (M_MBOX); +enum { + ACL_LOOKUP = 0, + ACL_READ, + ACL_SEEN, + ACL_WRITE, + ACL_INSERT, + ACL_POST, + ACL_CREATE, + ACL_DELETE, + ACL_ADMIN, + + RIGHTSMAX +}; + +/* ugly hack to define macro once (for pager+index) */ +#define CHECK_MX_ACL(c,f,s) if(!mx_acl_check(c,f)) \ + {\ + mutt_flushinp (); \ + mutt_error(_("%s not permitted by ACL."), s); \ + break; \ + } + +typedef struct { + /* folder magic */ + int type; + /* may we stat() it? */ + unsigned int local : 1; + /* tests if given path is of its magic */ + int (*mx_is_magic) (const char*, struct stat*); + /* tests if folder is empty */ + int (*mx_check_empty) (const char*); + /* test for access */ + int (*mx_access) (const char*, int); + /* read mailbox into ctx structure */ + int (*mx_open_mailbox) (CONTEXT*); + /* check ACL flags; if not implemented, always assume granted + * permissions */ + int (*mx_acl_check) (CONTEXT*, int); +} mx_t; + +/* called from main: init all folder types */ +void mx_init (void); + +/* flags for mx_open_mailbox() */ +#define M_NOSORT (1<<0) /* do not sort the mailbox after opening it */ +#define M_APPEND (1<<1) /* open mailbox for appending messages */ +#define M_READONLY (1<<2) /* open in read-only mode */ +#define M_QUIET (1<<3) /* do not print any messages */ +#define M_NEWFOLDER (1<<4) /* create a new folder - same as M_APPEND, but uses + * safe_fopen() for mbox-style folders. + */ + +/* mx_open_new_message() */ +#define M_ADD_FROM 1 /* add a From_ line */ -#define MMDF_SEP "\001\001\001\001\n" #define MAXLOCKATTEMPT 5 -int mbox_sync_mailbox (CONTEXT *, int *); -int mbox_open_mailbox (CONTEXT *); -int mbox_check_mailbox (CONTEXT *, int *); -int mbox_close_mailbox (CONTEXT *); -int mbox_lock_mailbox (CONTEXT *, int, int); -int mbox_parse_mailbox (CONTEXT *); -int mmdf_parse_mailbox (CONTEXT *); -void mbox_unlock_mailbox (CONTEXT *); -int mbox_check_empty (const char *); +/* return values from mx_check_mailbox() */ +enum { + M_NEW_MAIL = 1, /* new mail received in mailbox */ + M_LOCKED, /* couldn't lock the mailbox */ + M_REOPENED, /* mailbox was reopened */ + M_FLAGS /* nondestructive flags change (IMAP) */ +}; -int mh_read_dir (CONTEXT *, const char *); -int mh_sync_mailbox (CONTEXT *, int *); -int mh_check_mailbox (CONTEXT *, int *); -int mh_buffy (const char *); -int mh_check_empty (const char *); +typedef struct { + FILE *fp; /* pointer to the message data */ + char *path; /* path to temp file */ + short magic; /* type of mailbox this message belongs to */ + short write; /* nonzero if message is open for writing */ + struct { + unsigned read:1; + unsigned flagged:1; + unsigned replied:1; + } flags; + time_t received; /* the time at which this message was received */ +} MESSAGE; -int maildir_read_dir (CONTEXT *); -int maildir_check_mailbox (CONTEXT *, int *); -int maildir_check_empty (const char *); +WHERE short DefaultMagic INITVAL (M_MBOX); -int maildir_commit_message (CONTEXT *, MESSAGE *, HEADER *); -int mh_commit_message (CONTEXT *, MESSAGE *, HEADER *); +/* + * please use the following _ONLY_ when doing "something" + * with folders + */ + +CONTEXT *mx_open_mailbox (const char *, int, CONTEXT *); + +MESSAGE *mx_open_message (CONTEXT *, int); +MESSAGE *mx_open_new_message (CONTEXT *, HEADER *, int); + +void mx_fastclose_mailbox (CONTEXT *); + +int mx_close_mailbox (CONTEXT *, int *); +int mx_sync_mailbox (CONTEXT *, int *); +int mx_commit_message (MESSAGE *, CONTEXT *); +int mx_close_message (MESSAGE **); -int maildir_open_new_message (MESSAGE *, CONTEXT *, HEADER *); -int mh_open_new_message (MESSAGE *, CONTEXT *, HEADER *); +/* determines magic for given folder */ +int mx_get_magic (const char*); +/* sets/parses DefaultMagic */ +int mx_set_magic (const char *); +/* tests whether given folder magic is (valid and) local */ +int mx_is_local (int); -FILE *maildir_open_find_message (const char *, const char *); +int mx_check_mailbox (CONTEXT *, int *, int); -int mbox_strict_cmp_headers (const HEADER *, const HEADER *); -int mutt_reopen_mailbox (CONTEXT *, int *); +int mx_access (const char *, int); +int mx_check_empty (const char *); + +int mx_acl_check (CONTEXT*, int); void mx_alloc_memory (CONTEXT *); void mx_update_context (CONTEXT *, int); void mx_update_tables (CONTEXT *, int); - int mx_lock_file (const char *, int, int, int, int); int mx_unlock_file (const char *path, int fd, int dot); - -#endif +#endif /* !_MX_H */