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