Mercurial > dovecot > core-2.2
diff src/lib-mail/message-parser.h @ 4259:fd315deac28f HEAD
Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
author | Timo Sirainen <timo.sirainen@movial.fi> |
---|---|
date | Mon, 08 May 2006 11:46:19 +0300 |
parents | 928229f8b3e6 |
children | 75d5843153f1 |
line wrap: on
line diff
--- a/src/lib-mail/message-parser.h Mon May 08 11:31:52 2006 +0300 +++ b/src/lib-mail/message-parser.h Mon May 08 11:46:19 2006 +0300 @@ -1,11 +1,9 @@ #ifndef __MESSAGE_PARSER_H #define __MESSAGE_PARSER_H +#include "message-header-parser.h" #include "message-size.h" -#define IS_LWSP(c) \ - ((c) == ' ' || (c) == '\t') - enum message_part_flags { MESSAGE_PART_FLAG_MULTIPART = 0x01, MESSAGE_PART_FLAG_MULTIPART_DIGEST = 0x02, @@ -38,47 +36,20 @@ }; struct message_parser_ctx; -struct message_header_parser_ctx; - -struct message_header_line { - const char *name; - size_t name_len; - - const unsigned char *value; - size_t value_len; - const unsigned char *full_value; - size_t full_value_len; - - const unsigned char *middle; - size_t middle_len; +struct message_block { + /* non-NULL if a header line was read */ + struct message_header_line *hdr; - uoff_t name_offset, full_value_offset; - - unsigned int continues:1; /* multiline header, continues in next line */ - unsigned int continued:1; /* multiline header, continues */ - unsigned int eoh:1; /* "end of headers" line */ - unsigned int no_newline:1; /* no \n after this line */ - unsigned int use_full_value:1; /* set if you want full_value */ + /* hdr = NULL, size = 0 block returned at the end of headers */ + const unsigned char *data; + size_t size; }; /* called once with hdr = NULL at the end of headers */ -typedef void message_header_callback_t(struct message_part *part, - struct message_header_line *hdr, - void *context); -/* called once with size = 0 at the end of message part */ -typedef void message_body_callback_t(struct message_part *part, - const unsigned char *data, size_t size, - void *context); - -/* callback is called for each field in message header. */ -void message_parse_from_parts(struct message_part *part, struct istream *input, - message_header_callback_t *callback, - void *context); -void message_parse_header(struct message_part *part, struct istream *input, - struct message_size *hdr_size, - message_header_callback_t *callback, void *context); - +typedef void message_part_header_callback_t(struct message_part *part, + struct message_header_line *hdr, + void *context); /* Initialize message parser. part_spool specifies where struct message_parts are allocated from. */ @@ -86,32 +57,27 @@ message_parser_init(pool_t part_pool, struct istream *input); struct message_part *message_parser_deinit(struct message_parser_ctx **ctx); +/* Read the next block of a message. Returns 1 if block is returned, 0 if + input stream is non-blocking and more data needs to be read, -1 when all is + done or error occurred (see stream's error status). */ +int message_parser_parse_next_block(struct message_parser_ctx *ctx, + struct message_block *block_r); + /* Read and parse header. */ void message_parser_parse_header(struct message_parser_ctx *ctx, struct message_size *hdr_size, - message_header_callback_t *callback, + message_part_header_callback_t *callback, void *context); /* Read and parse body. If message is a MIME multipart or message/rfc822 message, hdr_callback is called for all headers. body_callback is called for the body content. */ void message_parser_parse_body(struct message_parser_ctx *ctx, - message_header_callback_t *hdr_callback, - message_body_callback_t *body_callback, + message_part_header_callback_t *hdr_callback, void *context); -/* skip_initial_lwsp controls if we should skip LWSP after "header: ". - Note that there may not be the single whitespace after "header:", and that - "header : " is also possible. These two conditions can't be determined from - struct message_header_line. */ -struct message_header_parser_ctx * -message_parse_header_init(struct istream *input, struct message_size *hdr_size, - bool skip_initial_lwsp); -void message_parse_header_deinit(struct message_header_parser_ctx **ctx); - -/* Read and return next header line. Returns 1 if header is returned, 0 if - input stream is non-blocking and more data needs to be read, -1 when all is - done or error occurred (see stream's error status). */ -int message_parse_header_next(struct message_header_parser_ctx *ctx, - struct message_header_line **hdr_r); +/* callback is called for each field in message header. */ +void message_parse_from_parts(struct message_part *part, struct istream *input, + message_part_header_callback_t *callback, + void *context); #endif