shithub: Nail

ref: 3febe6162a4cad56122ed33975237973f9a42a6d
dir: /mail.h/

View raw version
typedef struct Event	Event;
typedef struct Win	Win;
typedef struct Mesg	Mesg;
typedef struct Mbox	Mbox;
typedef struct Comp	Comp;

enum {
	Stack	= 64*1024,
	Bufsz	= 8192,
	Eventsz	= 256*UTFmax,
	Subjlen	= 56,
};

enum {
	Fdummy	= 1<<0,	/* message placeholder */
	Ftoplev	= 1<<1,	/* not a response to anything */
	Fopen	= 1<<2,	/* opened for viewing */

	Fresp	= 1<<3,	/* has been responded to */
	Fseen	= 1<<4,	/* has been viewed */
	Fdel	= 1<<5, /* was deleted */
	Ftodel	= 1<<6,	/* pending deletion */
};

enum {
	Vflat,
	Vgroup,
};

struct Event {
	char	action;
	char	type;
	int	q0;
	int	q1;
	int	flags;
	int	ntext;
	char	text[Eventsz + 1];
};

struct Win {
	int	id;
	Ioproc	*io;
	Biobuf	*event;
	int	revent;
	int	ctl;
	int	addr;
	int	data;
	int	open;
};

/*
 * In progress compositon
 */
struct Comp {
	Win;

	/* exec setup */
	Channel *sync;
	int	fd[2];

	/* to relate back the message */
	char	*replyto;
	char	*rname;
	char	*rpath;
	char	*rdigest;
	char	*path;

	int	quitting;
	Comp	*qnext;
};

/*
 * Message in mailbox
 */
struct Mesg {
	Win;

	/* bookkeeping */
	char	*name;
	int	flags;
	u32int	hash;
	char	quitting;
	Mesg	*qnext;

	/* exec setup */
	Channel *sync;
	char	*path;
	int	fd[2];

	Mesg	*parent;
	Mesg	**child;
	int	nchild;
	int	nsub;	/* transitive children */
	Mesg	**attachments;
	int	nattachments;

	/* info fields */
	char	*from;
	char	*to;
	char	*cc;
	char	*replyto;
	char	*date;
	char	*subject;
	char	*type;
	char	*disposition;
	char	*messageid;
	char	*filename;
	char	*digest;
	char	*mflags;
	char	*fromcolon;
	char	*inreplyto;

	vlong	time;
};

/*
 *The mailbox we're showing.
 */
struct Mbox {
	Win;

	Mesg	**mesg;
	Mesg	**hash;
	int	mesgsz;
	int	hashsz;
	int	nmesg;
	int	ndead;

	Mesg	*openmesg;
	Comp	*opencomp;
	int	canquit;

	Channel	*see;
	Channel	*show;
	Channel	*event;
	Channel	*send;

	int	view;
	int	nopen;
	char	*path;
};

extern Mbox	mbox;
extern int	threadsort;
extern int	plumbsendfd;
extern int	plumbseemailfd;
extern int	plumbshowmailfd;
extern int	plumbsendmailfd;
extern Reprog	*addrpat;
extern Reprog	*mesgpat;

/* window management */
void	wininit(Win*, char*);
int	winopen(Win*, char*, int);
Biobuf	*bwinopen(Win*, char*, int);
Biobuf	*bwindata(Win*, int);
void	winclose(Win*);
void	wintagwrite(Win*, char*);
int	winevent(Win*, Event*);
void	winreturn(Win*, Event*);
int	wineval(Win*, char*, ...);
int	winread(Win*, int, int, char*, int);
char	*matchaddr(Win*, Event*);
int	matchmesg(Win*, char*);
char	*winreadsel(Win*);
void	wingetsel(Win*, int*, int*);
void	winsetsel(Win*, int, int);

/* messages */
Mesg	*mblookupid(char*);
Mesg	*mesglookup(char*, char*);
Mesg	*mesgload(char*);
Mesg	*mesgopen(char*, char*);
int	mesgmatch(Mesg*, char*, char*);
void	mesgclear(Mesg*);
void	mesgfree(Mesg*);
void	mesgpath2name(char*, int, char*);

/* mailbox */
void	mbredraw(Mesg*, int, int);

/* composition */
void	compose(char*, Mesg*, int, int);

/* utils */
void	*emalloc(ulong);
void	*erealloc(void*, ulong);
char	*estrdup(char*);
char	*estrjoin(char*, ...);
char	*esmprint(char*, ...);
char	*rslurp(Mesg*, char*, int*);
char	*fslurp(int, int*);
u32int	strhash(char*);