#ifndef MESSAGE_PARSER_H
#define MESSAGE_PARSER_H
#include "message-header-parser.h"
#include "message-size.h"
enum message_parser_flags {
MESSAGE_PARSER_FLAG_SKIP_BODY_BLOCK = 0x01,
MESSAGE_PARSER_FLAG_MIME_VERSION_STRICT = 0x02
};
enum message_part_flags {
MESSAGE_PART_FLAG_MULTIPART = 0x01,
MESSAGE_PART_FLAG_MULTIPART_DIGEST = 0x02,
MESSAGE_PART_FLAG_MESSAGE_RFC822 = 0x04,
MESSAGE_PART_FLAG_TEXT = 0x08,
MESSAGE_PART_FLAG_UNUSED = 0x10,
MESSAGE_PART_FLAG_HAS_NULS = 0x20,
MESSAGE_PART_FLAG_IS_MIME = 0x40
};
struct message_part {
struct message_part *parent;
struct message_part *next;
struct message_part *children;
uoff_t physical_pos;
struct message_size header_size;
struct message_size body_size;
enum message_part_flags flags;
void *context;
};
struct message_parser_ctx;
struct message_block {
struct message_part *part;
struct message_header_line *hdr;
const unsigned char *data;
size_t size;
};
typedef void message_part_header_callback_t(struct message_part *part,
struct message_header_line *hdr,
void *context);
extern message_part_header_callback_t *null_message_part_header_callback;
struct message_parser_ctx *
message_parser_init(pool_t part_pool, struct istream *input,
enum message_header_parser_flags hdr_flags,
enum message_parser_flags flags);
struct message_parser_ctx *
message_parser_init_from_parts(struct message_part *parts,
struct istream *input,
enum message_header_parser_flags hdr_flags,
enum message_parser_flags flags);
int message_parser_deinit(struct message_parser_ctx **ctx,
struct message_part **parts_r);
int message_parser_parse_next_block(struct message_parser_ctx *ctx,
struct message_block *block_r);
void message_parser_parse_header(struct message_parser_ctx *ctx,
struct message_size *hdr_size,
message_part_header_callback_t *callback,
void *context);
#ifdef CONTEXT_TYPE_SAFETY
# define message_parser_parse_header(ctx, hdr_size, callback, context) \
({(void)(1 ? 0 : callback((struct message_part *)0, \
(struct message_header_line *)0, context)); \
message_parser_parse_header(ctx, hdr_size, \
(message_part_header_callback_t *)callback, context); })
#else
# define message_parser_parse_header(ctx, hdr_size, callback, context) \
message_parser_parse_header(ctx, hdr_size, \
(message_part_header_callback_t *)callback, context)
#endif
void message_parser_parse_body(struct message_parser_ctx *ctx,
message_part_header_callback_t *hdr_callback,
void *context);
#ifdef CONTEXT_TYPE_SAFETY
# define message_parser_parse_body(ctx, callback, context) \
({(void)(1 ? 0 : callback((struct message_part *)0, \
(struct message_header_line *)0, context)); \
message_parser_parse_body(ctx, \
(message_part_header_callback_t *)callback, context); })
#else
# define message_parser_parse_body(ctx, callback, context) \
message_parser_parse_body(ctx, \
(message_part_header_callback_t *)callback, context)
#endif
#endif