enum {
Ebase64,
Equoted,
};
enum {
FlagJunk,
FlagNonJunk,
FlagReplied,
FlagFlagged,
FlagDeleted,
FlagDraft,
FlagSeen,
};
static struct {
int flag;
char *name;
} flagtab[] = {
FlagJunk, "junk",
FlagNonJunk, "notjunk",
FlagReplied, "replied",
FlagFlagged, "flagged",
FlagDeleted, "deleted",
FlagDraft, "draft",
FlagSeen, "seen"
};
#define MAX_LINE 1000 // RFC says lines could be MAX 998+CR+LF
#define CACHELEN 1024*10 // 10k bytes default cache per message
typedef struct Message Message;
typedef struct Mailbox Mailbox;
typedef struct Mime Mime;
typedef struct Cache Cache;
struct Mime
{
// mime info
char *boundary;
char *endboundary;
char *type;
char *charset;
char *disposition;
char *filename;
char *encoding;
};
struct Cache
{
int l;
uchar b[CACHELEN];
};
struct Message
{
int id;
int status;
int flags;
// pointers to mbox file
vlong start; // start of message
vlong end; // end of message
vlong hstart; // start of header
vlong hend; // end of header
vlong bstart; // start of body
vlong bend; // end of body
Mime mime;
Cache *cache;
int linecount;
/* message ops */
/* single read calls */
vlong (*bcc)(Message*,char**);
vlong (*cc)(Message*,char**);
vlong (*date)(Message*,char**);
vlong (*digest)(Message*,char**);
vlong (*disposition)(Message*,char**);
vlong (*filename)(Message*,char**);
vlong (*from)(Message*,char**);
vlong (*header)(Message*,char**);
vlong (*info)(Message*,char**);
vlong (*inreplyto)(Message*,char**);
vlong (*lines)(Message*,char**);
vlong (*messageid)(Message*,char**);
vlong (*mimeheader)(Message*,char**);
vlong (*replyto)(Message*,char**);
vlong (*sender)(Message*,char**);
vlong (*subject)(Message*,char**);
vlong (*to)(Message*,char**);
vlong (*type)(Message*,char**);
vlong (*unixdate)(Message*,char**);
vlong (*unixheader)(Message*,char**);
/* multiple reads calls*/
vlong (*body)(Message*,char**, vlong , vlong);
vlong (*raw)(Message*,char**, vlong , vlong);
vlong (*rawbody)(Message*,char**, vlong , vlong);
vlong (*rawheader)(Message*,char**, vlong , vlong);
vlong (*rawunix)(Message*,char**, vlong , vlong);
Message *part;
Message *next;
Message *root;
Mailbox *b;
};
typedef struct Mailbox Mailbox;
struct Mailbox
{
int idc; /* message id counter */
char *name;
char *file;
int r,w;
Biobuf br,bw;
Message *msgs;
Mailbox *next;
/* mailbox ops */
int (*sync)(Mailbox*);
int (*open)(Mailbox*);
int (*close)(Mailbox*);
int (*fetch)(Mailbox*);
int (*purge)(Mailbox*);
};
typedef struct Fileinfo Fileinfo;
struct Fileinfo{
Message *m;
int Q;
};
|