aboutsummaryrefslogblamecommitdiffstats
path: root/camel/providers/imapp/camel-imapp-utils.h
blob: 76ec178b6334aec30ba1192b02fe56369029bfc2 (plain) (tree)

















































                                                                                 

                                                                                              
                                                                                             
                                                                                     


























































































                                                                                                                           

#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