annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 #ifndef __MESSAGE_PARSER_H
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2 #define __MESSAGE_PARSER_H
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3
4259
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
4 #include "message-header-parser.h"
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 953
diff changeset
5 #include "message-size.h"
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 953
diff changeset
6
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
7 enum message_part_flags {
106
5fe3e04ca8d9 Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents: 105
diff changeset
8 MESSAGE_PART_FLAG_MULTIPART = 0x01,
5fe3e04ca8d9 Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents: 105
diff changeset
9 MESSAGE_PART_FLAG_MULTIPART_DIGEST = 0x02,
5fe3e04ca8d9 Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents: 105
diff changeset
10 MESSAGE_PART_FLAG_MESSAGE_RFC822 = 0x04,
5fe3e04ca8d9 Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents: 105
diff changeset
11
5fe3e04ca8d9 Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents: 105
diff changeset
12 /* content-type: text/... */
5fe3e04ca8d9 Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents: 105
diff changeset
13 MESSAGE_PART_FLAG_TEXT = 0x08,
5fe3e04ca8d9 Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents: 105
diff changeset
14
5fe3e04ca8d9 Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents: 105
diff changeset
15 /* content-transfer-encoding: binary */
1534
676995d7c0ca IMAP protocol doesn't allow server to send NULs to client. Send ascii #128
Timo Sirainen <tss@iki.fi>
parents: 1322
diff changeset
16 MESSAGE_PART_FLAG_BINARY = 0x10,
676995d7c0ca IMAP protocol doesn't allow server to send NULs to client. Send ascii #128
Timo Sirainen <tss@iki.fi>
parents: 1322
diff changeset
17
676995d7c0ca IMAP protocol doesn't allow server to send NULs to client. Send ascii #128
Timo Sirainen <tss@iki.fi>
parents: 1322
diff changeset
18 /* message part header or body contains NULs */
1618
149ade487f48 Ignore Content-* headers if there's no MIME-Version header. Note that this
Timo Sirainen <tss@iki.fi>
parents: 1534
diff changeset
19 MESSAGE_PART_FLAG_HAS_NULS = 0x20,
149ade487f48 Ignore Content-* headers if there's no MIME-Version header. Note that this
Timo Sirainen <tss@iki.fi>
parents: 1534
diff changeset
20
149ade487f48 Ignore Content-* headers if there's no MIME-Version header. Note that this
Timo Sirainen <tss@iki.fi>
parents: 1534
diff changeset
21 /* Mime-Version header exists. */
149ade487f48 Ignore Content-* headers if there's no MIME-Version header. Note that this
Timo Sirainen <tss@iki.fi>
parents: 1534
diff changeset
22 MESSAGE_PART_FLAG_IS_MIME = 0x40
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
23 };
106
5fe3e04ca8d9 Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents: 105
diff changeset
24
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
25 struct message_part {
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
26 struct message_part *parent;
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
27 struct message_part *next;
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
28 struct message_part *children;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
105
31034993473c there was no need for MessagePart->pos.virtual_pos, so removed it.
Timo Sirainen <tss@iki.fi>
parents: 50
diff changeset
30 uoff_t physical_pos; /* absolute position from beginning of message */
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
31 struct message_size header_size;
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
32 struct message_size body_size;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
34 enum message_part_flags flags;
10
82b7de533f98 s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents: 9
diff changeset
35 void *context;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 };
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37
1697
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
38 struct message_parser_ctx;
1322
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1038
diff changeset
39
4259
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
40 struct message_block {
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
41 /* non-NULL if a header line was read */
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
42 struct message_header_line *hdr;
2404
8ef002a26f1c Added struct message_header_line.middle and middle_len to contain the ':'
Timo Sirainen <tss@iki.fi>
parents: 2150
diff changeset
43
4259
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
44 /* hdr = NULL, size = 0 block returned at the end of headers */
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
45 const unsigned char *data;
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
46 size_t size;
1322
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1038
diff changeset
47 };
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1038
diff changeset
48
1697
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
49 /* called once with hdr = NULL at the end of headers */
4259
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
50 typedef void message_part_header_callback_t(struct message_part *part,
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
51 struct message_header_line *hdr,
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
52 void *context);
1697
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
53
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
54 /* Initialize message parser. part_spool specifies where struct message_parts
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
55 are allocated from. */
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
56 struct message_parser_ctx *
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
57 message_parser_init(pool_t part_pool, struct istream *input);
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
58 struct message_part *message_parser_deinit(struct message_parser_ctx **ctx);
1697
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
59
4259
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
60 /* Read the next block of a message. Returns 1 if block is returned, 0 if
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
61 input stream is non-blocking and more data needs to be read, -1 when all is
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
62 done or error occurred (see stream's error status). */
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
63 int message_parser_parse_next_block(struct message_parser_ctx *ctx,
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
64 struct message_block *block_r);
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
65
1697
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
66 /* Read and parse header. */
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
67 void message_parser_parse_header(struct message_parser_ctx *ctx,
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
68 struct message_size *hdr_size,
4259
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
69 message_part_header_callback_t *callback,
1697
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
70 void *context);
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
71 /* Read and parse body. If message is a MIME multipart or message/rfc822
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
72 message, hdr_callback is called for all headers. body_callback is called
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
73 for the body content. */
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
74 void message_parser_parse_body(struct message_parser_ctx *ctx,
4259
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
75 message_part_header_callback_t *hdr_callback,
1697
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
76 void *context);
ef79ce6507ff Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents: 1689
diff changeset
77
4259
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
78 /* callback is called for each field in message header. */
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
79 void message_parse_from_parts(struct message_part *part, struct istream *input,
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
80 message_part_header_callback_t *callback,
fd315deac28f Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
81 void *context);
1322
97f8c00b8d4c Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents: 1038
diff changeset
82
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 #endif