0
|
1 #ifndef __MESSAGE_PARSER_H
|
|
2 #define __MESSAGE_PARSER_H
|
|
3
|
|
4 typedef struct _MessagePart MessagePart;
|
|
5 typedef struct _MessagePosition MessagePosition;
|
|
6 typedef struct _MessageSize MessageSize;
|
|
7
|
|
8 struct _MessagePosition {
|
|
9 off_t physical_pos;
|
|
10 off_t virtual_pos;
|
|
11 };
|
|
12
|
|
13 struct _MessageSize {
|
|
14 size_t physical_size;
|
|
15 size_t virtual_size;
|
|
16 unsigned int lines;
|
|
17 };
|
|
18
|
|
19 struct _MessagePart {
|
|
20 MessagePart *parent;
|
|
21 MessagePart *next;
|
|
22 MessagePart *children;
|
|
23
|
|
24 MessagePosition pos;
|
|
25 MessageSize header_size;
|
|
26 MessageSize body_size;
|
|
27
|
|
28 unsigned int multipart:1;
|
|
29 unsigned int multipart_digest:1;
|
|
30 unsigned int message_rfc822:1;
|
|
31 unsigned int text:1; /* content-type: text/.. */
|
|
32 unsigned int binary:1; /* content-transfer-encoding: binary */
|
|
33
|
|
34 void *user_data;
|
|
35 };
|
|
36
|
|
37 /* NOTE: name and value aren't \0-terminated */
|
|
38 typedef void (*MessageHeaderFunc)(MessagePart *part,
|
|
39 const char *name, unsigned int name_len,
|
|
40 const char *value, unsigned int value_len,
|
|
41 void *user_data);
|
|
42
|
|
43 /* func is called for each field in message header. */
|
|
44 MessagePart *message_parse(Pool pool, const char *msg, size_t size,
|
|
45 MessageHeaderFunc func, void *user_data);
|
|
46
|
|
47 /* Call func for each field in message header. Fills the hdr_size.
|
|
48 part can be NULL, just make sure your header function works with it.
|
|
49 This function doesn't use temp. mempool so your header function may save
|
|
50 return values to it. */
|
|
51 void message_parse_header(MessagePart *part, const char *msg, size_t size,
|
|
52 MessageSize *hdr_size,
|
|
53 MessageHeaderFunc func, void *user_data);
|
|
54
|
|
55 #endif
|