diff options
Diffstat (limited to 'camel/providers/imapp/camel-imapp-utils.h')
-rw-r--r-- | camel/providers/imapp/camel-imapp-utils.h | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/camel/providers/imapp/camel-imapp-utils.h b/camel/providers/imapp/camel-imapp-utils.h new file mode 100644 index 0000000000..76ec178b63 --- /dev/null +++ b/camel/providers/imapp/camel-imapp-utils.h @@ -0,0 +1,145 @@ + +#ifndef _CAMEL_IMAPP_UTILS_H +#define _CAMEL_IMAPP_UTILS_H + +#include <camel/camel-mime-utils.h> + +/* FIXME: the enum should be split up into logical groups, so that testing + can be done more accurately? */ + +/* list of strings we know about that can be *quickly* tokenised */ +enum _imap_id { + IMAP_UNKNOWN = 0, + IMAP_ALERT, + IMAP_BYE, + IMAP_BAD, + IMAP_NO, + IMAP_OK, + IMAP_PREAUTH, + IMAP_NEWNAME, + IMAP_PARSE, + IMAP_PERMANENTFLAGS, + IMAP_READ_ONLY, + IMAP_READ_WRITE, + IMAP_TRYCREATE, + IMAP_UIDVALIDITY, + IMAP_UNSEEN, + IMAP_ENVELOPE, + IMAP_FLAGS, + IMAP_INTERNALDATE, + IMAP_RFC822_HEADER, + IMAP_RFC822_TEXT, + IMAP_RFC822_SIZE, + IMAP_BODYSTRUCTURE, + IMAP_BODY, + IMAP_UID, +}; + +/* str MUST be in upper case, tokenised using gperf function */ +enum _imap_id imap_tokenise(register const char *str, register unsigned int len); + +/* this flag should be part of imapfoldersummary */ +enum { + CAMEL_IMAPP_MESSAGE_RECENT = (1<<8), +}; + +/* ********************************************************************** */ +void imap_parse_flags(CamelIMAPPStream *stream, guint32 *flagsp) /* IO,PARSE */; +void imap_write_flags(CamelStream *stream, guint32 flags) /* IO */; + +/* ********************************************************************** */ +void imap_parse_param_list(CamelIMAPPStream *is, struct _header_param **plist) /* IO,PARSE */; +struct _CamelMimeDisposition *imap_parse_ext_optional(CamelIMAPPStream *is) /* IO,PARSE */; +struct _CamelMessageContentInfo *imap_parse_body_fields(CamelIMAPPStream *is) /* IO,PARSE */; +struct _header_address *imap_parse_address_list(CamelIMAPPStream *is) /* IO,PARSE */; +struct _CamelMessageInfo *imap_parse_envelope(CamelIMAPPStream *is) /* IO, PARSE */; +struct _CamelMessageContentInfo *imap_parse_body(CamelIMAPPStream *is) /* IO,PARSE */; +char *imap_parse_section(CamelIMAPPStream *is) /* IO,PARSE */; +void imap_free_body(struct _CamelMessageContentInfo *cinfo); + +/* ********************************************************************** */ +/* all the possible stuff we might get from a fetch request */ +/* this assumes the caller/server doesn't send any one of these types twice */ +struct _fetch_info { + guint32 got; /* what we got, see below */ + CamelStream *body; /* BODY[.*](<.*>)? */ + CamelStream *text; /* RFC822.TEXT */ + CamelStream *header; /* RFC822.HEADER */ + CamelMessageInfo *minfo; /* ENVELOPE */ + CamelMessageContentInfo *cinfo; /* BODYSTRUCTURE,BODY */ + guint32 size; /* RFC822.SIZE */ + guint32 offset; /* start offset of a BODY[]<offset.length> request */ + guint32 flags; /* FLAGS */ + char *date; /* INTERNALDATE */ + char *section; /* section for a BODY[section] request */ + char *uid; /* UID */ +}; + +#define FETCH_BODY (1<<0) +#define FETCH_TEXT (1<<1) +#define FETCH_HEADER (1<<2) +#define FETCH_MINFO (1<<3) +#define FETCH_CINFO (1<<4) +#define FETCH_SIZE (1<<5) +#define FETCH_OFFSET (1<<6) +#define FETCH_FLAGS (1<<7) +#define FETCH_DATE (1<<8) +#define FETCH_SECTION (1<<9) +#define FETCH_UID (1<<10) + +struct _fetch_info *imap_parse_fetch(CamelIMAPPStream *is); +void imap_free_fetch(struct _fetch_info *finfo); +void imap_dump_fetch(struct _fetch_info *finfo); + +/* ********************************************************************** */ + +struct _status_info { + enum _imap_id result; /* ok/no/bad/preauth only */ + enum _imap_id condition; /* read-only/read-write/alert/parse/trycreate/newname/permanentflags/uidvalidity/unseen */ + + union { + struct { + char *oldname; + char *newname; + } newname; + guint32 permanentflags; + guint32 uidvalidity; + guint32 unseen; + } u; + + char *text; +}; + +struct _status_info *imap_parse_status(CamelIMAPPStream *is); +void imap_free_status(struct _status_info *sinfo); + +/* ********************************************************************** */ + +/* should this just return a FolderInfo? + should this just return the name & flags & separator by reference? */ +struct _list_info { + guint32 flags:24; + char separator; + char *name; +}; + +struct _list_info *imap_parse_list(CamelIMAPPStream *is); +char *imapp_list_get_path(struct _list_info *li); +void imap_free_list(struct _list_info *linfo); + +/* ********************************************************************** */ + +struct _uidset_state { + struct _CamelIMAPPEngine *ie; + int len; + guint32 start; + guint32 last; +}; + +struct _CamelIMAPPEngine; +struct _CamelIMAPPCommand; +void imapp_uidset_init(struct _uidset_state *ss, struct _CamelIMAPPEngine *ie); +int imapp_uidset_done(struct _uidset_state *ss, struct _CamelIMAPPCommand *ic); +int imapp_uidset_add(struct _uidset_state *ss, struct _CamelIMAPPCommand *ic, const char *uid); + +#endif |