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; };