Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-storage/index/index-mail-headers.c @ 6980:d373913cd763 HEAD
Memory leak fixes
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 09 Dec 2007 16:08:25 +0200 |
parents | 414c9d631a81 |
children | 7ed926ed7aa4 |
rev | line source |
---|---|
6429
65c69a53a7be
Replaced my Copyright notices. The year range always ends with 2007 now.
Timo Sirainen <tss@iki.fi>
parents:
6428
diff
changeset
|
1 /* Copyright (c) 2003-2007 Dovecot authors, see the included COPYING file */ |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "istream.h" |
3470
346a494c2feb
Moved array declaration to array-decl.h and include it in lib.h. So array.h
Timo Sirainen <tss@iki.fi>
parents:
3463
diff
changeset
|
5 #include "array.h" |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "buffer.h" |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "str.h" |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "message-date.h" |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1836
diff
changeset
|
9 #include "message-parser.h" |
6120
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
10 #include "message-header-decode.h" |
6083
1b0ef7a74448
Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents:
6006
diff
changeset
|
11 #include "istream-tee.h" |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
12 #include "istream-header-filter.h" |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include "imap-envelope.h" |
1689
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1687
diff
changeset
|
14 #include "imap-bodystructure.h" |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include "index-storage.h" |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #include "index-mail.h" |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 #include <stdlib.h> |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
20 struct index_header_lookup_ctx { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
21 struct mailbox_header_lookup_ctx ctx; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
22 pool_t pool; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
24 unsigned int count; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
25 unsigned int *idx; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
26 const char **name; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 }; |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
29 static const enum message_header_parser_flags hdr_parser_flags = |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
30 MESSAGE_HEADER_PARSER_FLAG_SKIP_INITIAL_LWSP | |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
31 MESSAGE_HEADER_PARSER_FLAG_DROP_CR; |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
32 static const enum message_parser_flags msg_parser_flags = |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
33 MESSAGE_PARSER_FLAG_SKIP_BODY_BLOCK; |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
34 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
35 static int header_line_cmp(const void *p1, const void *p2) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
36 { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
37 const struct index_mail_line *l1 = p1, *l2 = p2; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
38 int diff; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
39 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
40 diff = (int)l1->field_idx - (int)l2->field_idx; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
41 return diff != 0 ? diff : |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
42 (int)l1->line_num - (int)l2->line_num; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
43 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
44 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
45 static void index_mail_parse_header_finish(struct index_mail *mail) |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
47 struct index_mail_line *lines; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
48 const unsigned char *header, *data; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
49 const uint8_t *match; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
50 buffer_t *buf; |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
51 size_t data_size; |
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
52 unsigned int i, j, count, match_idx, match_count; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3525
diff
changeset
|
53 bool noncontiguous; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
54 |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4418
diff
changeset
|
55 lines = array_get_modifiable(&mail->header_lines, &count); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
56 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
57 /* sort it first so fields are grouped together and ordered by |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
58 line number */ |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
59 qsort(lines, count, sizeof(*lines), header_line_cmp); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
60 |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
61 match = array_get(&mail->header_match, &match_count); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
62 header = buffer_get_data(mail->header_data, NULL); |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2686
diff
changeset
|
63 buf = buffer_create_dynamic(pool_datastack_create(), 256); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
65 /* go through all the header lines we found */ |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
66 for (i = match_idx = 0; i < count; i = j) { |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
67 /* matches and header lines are both sorted, all matches |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
68 until lines[i] weren't found */ |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
69 while (match_idx < lines[i].field_idx && |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
70 match_idx < match_count) { |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
71 if (HEADER_MATCH_USABLE(mail, match[match_idx]) && |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
72 mail_cache_field_can_add(mail->trans->cache_trans, |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
73 mail->data.seq, |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
74 match_idx)) { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
75 /* this header doesn't exist. remember that. */ |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
76 i_assert((match[match_idx] & |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
77 HEADER_MATCH_FLAG_FOUND) == 0); |
4518
ed489df90232
index_mail_cache_add() was used with lib-storage's internal indexes for most
Timo Sirainen <tss@iki.fi>
parents:
4507
diff
changeset
|
78 index_mail_cache_add_idx(mail, match_idx, |
ed489df90232
index_mail_cache_add() was used with lib-storage's internal indexes for most
Timo Sirainen <tss@iki.fi>
parents:
4507
diff
changeset
|
79 NULL, 0); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
80 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
81 match_idx++; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
82 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
83 |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
84 if (match_idx < match_count) { |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
85 /* save index to first header line */ |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
86 j = i + 1; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
87 array_idx_set(&mail->header_match_lines, match_idx, &j); |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
88 match_idx++; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
89 } |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
90 |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
91 if (!mail_cache_field_can_add(mail->trans->cache_trans, |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
92 mail->data.seq, |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
93 lines[i].field_idx)) { |
3456
5ec00b12f4db
Don't store headers into cache file if they are already there.
Timo Sirainen <tss@iki.fi>
parents:
3301
diff
changeset
|
94 /* header is already cached */ |
3525
8ac16ccc3c73
Fixed a hang if parsed header was already cached.
Timo Sirainen <tss@iki.fi>
parents:
3493
diff
changeset
|
95 j = i + 1; |
3456
5ec00b12f4db
Don't store headers into cache file if they are already there.
Timo Sirainen <tss@iki.fi>
parents:
3301
diff
changeset
|
96 continue; |
5ec00b12f4db
Don't store headers into cache file if they are already there.
Timo Sirainen <tss@iki.fi>
parents:
3301
diff
changeset
|
97 } |
5ec00b12f4db
Don't store headers into cache file if they are already there.
Timo Sirainen <tss@iki.fi>
parents:
3301
diff
changeset
|
98 |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
99 /* buffer contains: { uint32_t line_num[], 0, header texts } |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
100 noncontiguous is just a small optimization.. */ |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
101 buffer_set_used_size(buf, 0); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
102 buffer_append(buf, &lines[i].line_num, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
103 sizeof(lines[i].line_num)); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
104 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
105 noncontiguous = FALSE; |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
106 for (j = i+1; j < count; j++) { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
107 if (lines[j].field_idx != lines[i].field_idx) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
108 break; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
110 if (lines[j].start_pos != lines[j-1].end_pos) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
111 noncontiguous = TRUE; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
112 buffer_append(buf, &lines[j].line_num, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
113 sizeof(lines[j].line_num)); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
114 } |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
115 buffer_append_zero(buf, sizeof(uint32_t)); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
117 if (noncontiguous) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
118 for (; i < j; i++) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
119 buffer_append(buf, header + lines[i].start_pos, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
120 lines[i].end_pos - |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
121 lines[i].start_pos); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
122 } |
2339
406692edc12d
Cache fixes. Decisions are saved again.
Timo Sirainen <tss@iki.fi>
parents:
2336
diff
changeset
|
123 i--; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
124 } else { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
125 buffer_append(buf, header + lines[i].start_pos, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
126 lines[j-1].end_pos - lines[i].start_pos); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
127 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
128 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
129 data = buffer_get_data(buf, &data_size); |
4518
ed489df90232
index_mail_cache_add() was used with lib-storage's internal indexes for most
Timo Sirainen <tss@iki.fi>
parents:
4507
diff
changeset
|
130 index_mail_cache_add_idx(mail, lines[i].field_idx, |
ed489df90232
index_mail_cache_add() was used with lib-storage's internal indexes for most
Timo Sirainen <tss@iki.fi>
parents:
4507
diff
changeset
|
131 data, data_size); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
132 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
133 |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
134 for (; match_idx < match_count; match_idx++) { |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
135 if (HEADER_MATCH_USABLE(mail, match[match_idx]) && |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
136 mail_cache_field_can_add(mail->trans->cache_trans, |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
137 mail->data.seq, |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
138 match_idx)) { |
2336 | 139 /* this header doesn't exist. remember that. */ |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
140 i_assert((match[match_idx] & |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
141 HEADER_MATCH_FLAG_FOUND) == 0); |
4518
ed489df90232
index_mail_cache_add() was used with lib-storage's internal indexes for most
Timo Sirainen <tss@iki.fi>
parents:
4507
diff
changeset
|
142 index_mail_cache_add_idx(mail, match_idx, NULL, 0); |
2336 | 143 } |
144 } | |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
145 } |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 |
3458
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
147 static unsigned int |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
148 get_header_field_idx(struct index_mailbox *ibox, const char *field) |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
149 { |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
150 struct mail_cache_field header_field = { |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
151 NULL, 0, MAIL_CACHE_FIELD_HEADER, 0, |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
152 MAIL_CACHE_DECISION_TEMP |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
153 }; |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
154 |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
155 T_FRAME( |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
156 header_field.name = t_strconcat("hdr.", field, NULL); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
157 mail_cache_register_fields(ibox->cache, &header_field, 1); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
158 ); |
3458
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
159 return header_field.idx; |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
160 } |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
161 |
5516
96f0b56489a2
Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents:
5506
diff
changeset
|
162 bool index_mail_want_parse_headers(struct index_mail *mail) |
96f0b56489a2
Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents:
5506
diff
changeset
|
163 { |
6842
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
164 if (mail->wanted_headers != NULL || |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
165 mail->data.save_bodystructure_header) |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
166 return TRUE; |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
167 |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
168 if ((mail->data.cache_fetch_fields & MAIL_FETCH_DATE) != 0 && |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
169 !mail->data.sent_date_parsed) |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
170 return TRUE; |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
171 return FALSE; |
5516
96f0b56489a2
Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents:
5506
diff
changeset
|
172 } |
96f0b56489a2
Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents:
5506
diff
changeset
|
173 |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
174 static void index_mail_parse_header_register_all_wanted(struct index_mail *mail) |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
175 { |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
176 const struct mail_cache_field *all_cache_fields; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
177 unsigned int i, count; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
178 |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
179 all_cache_fields = |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
180 mail_cache_register_get_list(mail->ibox->cache, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
181 pool_datastack_create(), &count); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
182 for (i = 0; i < count; i++) { |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
183 if (strncasecmp(all_cache_fields[i].name, "hdr.", 4) != 0) |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
184 continue; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
185 if (!mail_cache_field_want_add(mail->trans->cache_trans, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
186 mail->data.seq, i)) |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
187 continue; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
188 |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
189 array_idx_set(&mail->header_match, all_cache_fields[i].idx, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
190 &mail->header_match_value); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
191 } |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
192 } |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
193 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
194 void index_mail_parse_header_init(struct index_mail *mail, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
195 struct mailbox_header_lookup_ctx *_headers) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
196 { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
197 struct index_header_lookup_ctx *headers = |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
198 (struct index_header_lookup_ctx *)_headers; |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
199 unsigned int i; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
200 |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
201 mail->header_seq = mail->data.seq; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
202 if (mail->header_data == NULL) { |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2686
diff
changeset
|
203 mail->header_data = buffer_create_dynamic(default_pool, 4096); |
4596
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
204 i_array_init(&mail->header_lines, 32); |
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
205 i_array_init(&mail->header_match, 32); |
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
206 i_array_init(&mail->header_match_lines, 32); |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
207 mail->header_match_value = HEADER_MATCH_SKIP_COUNT; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
208 } else { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
209 buffer_set_used_size(mail->header_data, 0); |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
210 array_clear(&mail->header_lines); |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
211 array_clear(&mail->header_match_lines); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
212 |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
213 mail->header_match_value += HEADER_MATCH_SKIP_COUNT; |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
214 i_assert((mail->header_match_value & |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
215 (HEADER_MATCH_SKIP_COUNT-1)) == 0); |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
216 if (mail->header_match_value == 0) { |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
217 /* wrapped, we'll have to clear the buffer */ |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
218 array_clear(&mail->header_match); |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
219 mail->header_match_value = HEADER_MATCH_SKIP_COUNT; |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
220 } |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
221 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
222 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
223 if (headers != NULL) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
224 for (i = 0; i < headers->count; i++) { |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
225 array_idx_set(&mail->header_match, headers->idx[i], |
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
226 &mail->header_match_value); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
230 if (mail->wanted_headers != NULL && mail->wanted_headers != headers) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
231 headers = mail->wanted_headers; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
232 for (i = 0; i < headers->count; i++) { |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
233 array_idx_set(&mail->header_match, headers->idx[i], |
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
234 &mail->header_match_value); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 } |
3458
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
237 |
6842
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
238 if ((mail->data.cache_fetch_fields & MAIL_FETCH_DATE) != 0) { |
3458
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
239 array_idx_set(&mail->header_match, |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
240 get_header_field_idx(mail->ibox, "Date"), |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
241 &mail->header_match_value); |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
242 } |
3493
3cc5229f1560
Header caching was more or less broken.
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
243 |
6006
9da1ec15340d
We didn't cache correctly headers that existed in cache file for other
Timo Sirainen <tss@iki.fi>
parents:
5625
diff
changeset
|
244 /* register also all the other headers that exist in cache file */ |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
245 T_FRAME( |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
246 index_mail_parse_header_register_all_wanted(mail); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
247 ); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
250 static void index_mail_parse_finish_imap_envelope(struct index_mail *mail) |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
252 string_t *str; |
6842
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
253 unsigned int cache_field; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
255 str = str_new(mail->data_pool, 256); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
256 imap_envelope_write_part_data(mail->data.envelope_data, str); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
257 mail->data.envelope = str_c(str); |
1765
6c0c2ff2c113
Stop parsing cached headers when we've got everything.
Timo Sirainen <tss@iki.fi>
parents:
1758
diff
changeset
|
258 |
6842
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
259 cache_field = mail->ibox->cache_fields[MAIL_CACHE_IMAP_ENVELOPE].idx; |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
260 if (mail_cache_field_want_add(mail->trans->cache_trans, |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
261 mail->data.seq, cache_field)) { |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
262 index_mail_cache_add_idx(mail, cache_field, |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
263 str_data(str), str_len(str)); |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
264 } |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
265 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 |
3463
693baa083a79
Mark *all* non-found headers that are registered in cache file as non-found
Timo Sirainen <tss@iki.fi>
parents:
3458
diff
changeset
|
267 void index_mail_parse_header(struct message_part *part, |
693baa083a79
Mark *all* non-found headers that are registered in cache file as non-found
Timo Sirainen <tss@iki.fi>
parents:
3458
diff
changeset
|
268 struct message_header_line *hdr, |
693baa083a79
Mark *all* non-found headers that are registered in cache file as non-found
Timo Sirainen <tss@iki.fi>
parents:
3458
diff
changeset
|
269 struct index_mail *mail) |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 { |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 struct index_mail_data *data = &mail->data; |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
272 unsigned int field_idx, count; |
3045
ccfd78cc07cc
mail->get_header() was pretty broken. This affected SORT/THREAD.
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
273 uint8_t *match; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
275 data->parse_line_num++; |
1689
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1687
diff
changeset
|
276 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
277 if (data->save_bodystructure_header) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
278 i_assert(part != NULL); |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
279 imap_bodystructure_parse_header(mail->data_pool, part, hdr); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
280 } |
1689
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1687
diff
changeset
|
281 |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 if (data->save_envelope) { |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
283 imap_envelope_parse_header(mail->data_pool, |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 &data->envelope_data, hdr); |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
286 if (hdr == NULL) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
287 index_mail_parse_finish_imap_envelope(mail); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 if (hdr == NULL) { |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 /* end of headers */ |
6842
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
292 if (mail->data.save_sent_date) |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
293 mail->data.sent_date_parsed = TRUE; |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
294 T_FRAME( |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
295 index_mail_parse_header_finish(mail); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
296 ); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
297 data->save_bodystructure_header = FALSE; |
3463
693baa083a79
Mark *all* non-found headers that are registered in cache file as non-found
Timo Sirainen <tss@iki.fi>
parents:
3458
diff
changeset
|
298 return; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
301 if (!hdr->continued) { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
302 T_FRAME( |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
303 const char *cache_field_name = |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
304 t_strconcat("hdr.", hdr->name, NULL); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
305 data->parse_line.field_idx = |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
306 mail_cache_register_lookup(mail->ibox->cache, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
307 cache_field_name); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
308 ); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
309 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
310 field_idx = data->parse_line.field_idx; |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
311 match = array_get_modifiable(&mail->header_match, &count); |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
312 if (field_idx >= count || |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
313 !HEADER_MATCH_USABLE(mail, match[field_idx])) { |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
314 /* we don't want this header. */ |
3463
693baa083a79
Mark *all* non-found headers that are registered in cache file as non-found
Timo Sirainen <tss@iki.fi>
parents:
3458
diff
changeset
|
315 return; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
316 } |
1765
6c0c2ff2c113
Stop parsing cached headers when we've got everything.
Timo Sirainen <tss@iki.fi>
parents:
1758
diff
changeset
|
317 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
318 if (!hdr->continued) { |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
319 /* beginning of a line. add the header name. */ |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
320 data->parse_line.start_pos = str_len(mail->header_data); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
321 data->parse_line.line_num = data->parse_line_num; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
322 str_append(mail->header_data, hdr->name); |
2404
8ef002a26f1c
Added struct message_header_line.middle and middle_len to contain the ':'
Timo Sirainen <tss@iki.fi>
parents:
2355
diff
changeset
|
323 str_append_n(mail->header_data, hdr->middle, hdr->middle_len); |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
324 |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
325 /* remember that we saw this header so we don't add it to |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
326 cache as nonexisting. */ |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
327 match[field_idx] |= HEADER_MATCH_FLAG_FOUND; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
328 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
329 str_append_n(mail->header_data, hdr->value, hdr->value_len); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
330 if (!hdr->no_newline) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
331 str_append(mail->header_data, "\n"); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
332 if (!hdr->continues) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
333 data->parse_line.end_pos = str_len(mail->header_data); |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
334 array_append(&mail->header_lines, &data->parse_line, 1); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
335 } |
1765
6c0c2ff2c113
Stop parsing cached headers when we've got everything.
Timo Sirainen <tss@iki.fi>
parents:
1758
diff
changeset
|
336 } |
6c0c2ff2c113
Stop parsing cached headers when we've got everything.
Timo Sirainen <tss@iki.fi>
parents:
1758
diff
changeset
|
337 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
338 static void |
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:
4070
diff
changeset
|
339 index_mail_parse_part_header_cb(struct message_part *part, |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
340 struct message_header_line *hdr, |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
341 struct index_mail *mail) |
1765
6c0c2ff2c113
Stop parsing cached headers when we've got everything.
Timo Sirainen <tss@iki.fi>
parents:
1758
diff
changeset
|
342 { |
3463
693baa083a79
Mark *all* non-found headers that are registered in cache file as non-found
Timo Sirainen <tss@iki.fi>
parents:
3458
diff
changeset
|
343 index_mail_parse_header(part, hdr, mail); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 |
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:
4070
diff
changeset
|
346 static void |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
347 index_mail_parse_header_cb(struct message_header_line *hdr, |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
348 struct index_mail *mail) |
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:
4070
diff
changeset
|
349 { |
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:
4070
diff
changeset
|
350 index_mail_parse_header(mail->data.parts, hdr, mail); |
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:
4070
diff
changeset
|
351 } |
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:
4070
diff
changeset
|
352 |
6265
0ee2b0691f3e
Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
353 struct istream * |
0ee2b0691f3e
Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
354 index_mail_cache_parse_init(struct mail *_mail, struct istream *input) |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
355 { |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
356 struct index_mail *mail = (struct index_mail *)_mail; |
6083
1b0ef7a74448
Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents:
6006
diff
changeset
|
357 struct tee_istream *tee; |
1b0ef7a74448
Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents:
6006
diff
changeset
|
358 struct istream *input2; |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
359 |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
360 i_assert(mail->data.parser_ctx == NULL); |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
361 |
6526
c4205f6ac88f
Make sure we parse everything so they can be saved to cache.
Timo Sirainen <tss@iki.fi>
parents:
6445
diff
changeset
|
362 /* we're doing everything for now, figure out later if we want to |
c4205f6ac88f
Make sure we parse everything so they can be saved to cache.
Timo Sirainen <tss@iki.fi>
parents:
6445
diff
changeset
|
363 save them. */ |
c4205f6ac88f
Make sure we parse everything so they can be saved to cache.
Timo Sirainen <tss@iki.fi>
parents:
6445
diff
changeset
|
364 mail->data.save_sent_date = TRUE; |
c4205f6ac88f
Make sure we parse everything so they can be saved to cache.
Timo Sirainen <tss@iki.fi>
parents:
6445
diff
changeset
|
365 mail->data.save_bodystructure_header = TRUE; |
c4205f6ac88f
Make sure we parse everything so they can be saved to cache.
Timo Sirainen <tss@iki.fi>
parents:
6445
diff
changeset
|
366 mail->data.save_bodystructure_body = TRUE; |
c4205f6ac88f
Make sure we parse everything so they can be saved to cache.
Timo Sirainen <tss@iki.fi>
parents:
6445
diff
changeset
|
367 |
6142
6c0bfc35af03
Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents:
6120
diff
changeset
|
368 tee = tee_i_stream_create(input); |
6c0bfc35af03
Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents:
6120
diff
changeset
|
369 input = tee_i_stream_create_child(tee); |
6c0bfc35af03
Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents:
6120
diff
changeset
|
370 input2 = tee_i_stream_create_child(tee); |
6083
1b0ef7a74448
Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents:
6006
diff
changeset
|
371 |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
372 index_mail_parse_header_init(mail, NULL); |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
373 mail->data.parser_ctx = |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
374 message_parser_init(mail->data_pool, input, |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
375 hdr_parser_flags, msg_parser_flags); |
6083
1b0ef7a74448
Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents:
6006
diff
changeset
|
376 i_stream_unref(&input); |
1b0ef7a74448
Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents:
6006
diff
changeset
|
377 return input2; |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
378 } |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
379 |
5506
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
380 static void index_mail_init_parser(struct index_mail *mail) |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
381 { |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
382 struct index_mail_data *data = &mail->data; |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
383 |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
384 if (data->parser_ctx != NULL) |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
385 (void)message_parser_deinit(&data->parser_ctx); |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
386 |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
387 if (data->parts == NULL) { |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
388 data->parser_ctx = message_parser_init(mail->data_pool, |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
389 data->stream, |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
390 hdr_parser_flags, |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
391 msg_parser_flags); |
5506
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
392 } else { |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
393 data->parser_ctx = |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
394 message_parser_init_from_parts(data->parts, |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
395 data->stream, |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
396 hdr_parser_flags, |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
397 msg_parser_flags); |
5506
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
398 } |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
399 } |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
400 |
2336 | 401 int index_mail_parse_headers(struct index_mail *mail, |
402 struct mailbox_header_lookup_ctx *headers) | |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
403 { |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
404 struct index_mail_data *data = &mail->data; |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
405 struct istream *input; |
4507
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
406 uoff_t old_offset; |
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
407 |
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
408 old_offset = data->stream == NULL ? 0 : data->stream->v_offset; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
409 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
410 if (mail_get_stream(&mail->mail.mail, NULL, NULL, &input) < 0) |
2509
146591955618
Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents:
2451
diff
changeset
|
411 return -1; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
412 |
2336 | 413 index_mail_parse_header_init(mail, headers); |
1689
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1687
diff
changeset
|
414 |
5625
ebf443cae951
Assert-crashfix in some conditions.
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
415 if (data->parts == NULL || data->save_bodystructure_header) { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
416 /* initialize bodystructure parsing in case we read the whole |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
417 message. */ |
5506
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
418 index_mail_init_parser(mail); |
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
|
419 message_parser_parse_header(data->parser_ctx, &data->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:
4070
diff
changeset
|
420 index_mail_parse_part_header_cb, |
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:
4070
diff
changeset
|
421 mail); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
422 } else { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
423 /* just read the header */ |
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:
4070
diff
changeset
|
424 message_parse_header(data->stream, &data->hdr_size, |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
425 hdr_parser_flags, |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
426 index_mail_parse_header_cb, mail); |
1689
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1687
diff
changeset
|
427 } |
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
|
428 data->hdr_size_set = TRUE; |
3458
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
429 data->access_part &= ~PARSE_HDR; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
430 |
4507
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
431 i_stream_seek(data->stream, old_offset); |
2509
146591955618
Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents:
2451
diff
changeset
|
432 return 0; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
433 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
434 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
435 static void |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
436 imap_envelope_parse_callback(struct message_header_line *hdr, |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
437 struct index_mail *mail) |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
438 { |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
439 imap_envelope_parse_header(mail->data_pool, |
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
440 &mail->data.envelope_data, hdr); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
441 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
442 if (hdr == NULL) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
443 index_mail_parse_finish_imap_envelope(mail); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
444 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
445 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
446 int index_mail_headers_get_envelope(struct index_mail *mail) |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
447 { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
448 struct mailbox_header_lookup_ctx *header_ctx; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
449 struct istream *stream; |
4507
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
450 uoff_t old_offset; |
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
451 |
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
452 old_offset = mail->data.stream == NULL ? 0 : |
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
453 mail->data.stream->v_offset; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
454 |
2328
6527f1da0ee3
Avoid parsing headers twice to get IMAP envelope.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
455 mail->data.save_envelope = TRUE; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
456 header_ctx = mailbox_header_lookup_init(&mail->ibox->box, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
457 imap_envelope_headers); |
6980 | 458 if (mail_get_header_stream(&mail->mail.mail, header_ctx, &stream) < 0) { |
459 mailbox_header_lookup_deinit(&header_ctx); | |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
460 return -1; |
6980 | 461 } |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
462 |
2686
6e0a7083a880
Don't crash if fetching ENVELOPE for expunged message.
Timo Sirainen <tss@iki.fi>
parents:
2509
diff
changeset
|
463 if (mail->data.envelope == NULL && stream != NULL) { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
464 /* we got the headers from cache - parse them to get the |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
465 envelope */ |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
466 message_parse_header(stream, NULL, hdr_parser_flags, |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
467 imap_envelope_parse_callback, mail); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
468 mail->data.save_envelope = FALSE; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
469 } |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
470 mailbox_header_lookup_deinit(&header_ctx); |
4507
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
471 |
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
472 if (mail->data.stream != NULL) |
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
473 i_stream_seek(mail->data.stream, old_offset); |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
474 return 0; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
475 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
476 |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
477 static size_t get_header_size(buffer_t *buffer, size_t pos) |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
478 { |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
479 const unsigned char *data; |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
480 size_t i, size; |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
481 |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
482 data = buffer_get_data(buffer, &size); |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
483 i_assert(pos <= size); |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
484 |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
485 for (i = pos; i < size; i++) { |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
486 if (data[i] == '\n') { |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
487 if (i+1 == size || |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
488 (data[i+1] != ' ' && data[i+1] != '\t')) |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
489 return i - pos; |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
490 } |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
491 } |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
492 return size - pos; |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
493 } |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
494 |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
495 static int index_mail_header_is_parsed(struct index_mail *mail, |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
496 unsigned int field_idx) |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
497 { |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
498 const uint8_t *match; |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
499 unsigned int count; |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
500 |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
501 match = array_get(&mail->header_match, &count); |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
502 if (field_idx < count && HEADER_MATCH_USABLE(mail, match[field_idx])) |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
503 return (match[field_idx] & HEADER_MATCH_FLAG_FOUND) != 0; |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
504 return -1; |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
505 } |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
506 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3525
diff
changeset
|
507 static bool skip_header(const unsigned char **data, size_t len) |
3288
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
508 { |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
509 const unsigned char *p = *data; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
510 size_t i; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
511 |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
512 for (i = 0; i < len; i++) { |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
513 if (p[i] == ':') |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
514 break; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
515 } |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
516 if (i == len) |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
517 return FALSE; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
518 |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
519 for (i++; i < len; i++) { |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
520 if (!IS_LWSP(p[i])) |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
521 break; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
522 } |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
523 |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
524 *data = p + i; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
525 return TRUE; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
526 } |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
527 |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
528 static const char *const * |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
529 index_mail_get_parsed_header(struct index_mail *mail, unsigned int field_idx) |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
530 { |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4418
diff
changeset
|
531 ARRAY_DEFINE(header_values, const char *); |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
532 const struct index_mail_line *lines; |
3288
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
533 const unsigned char *header, *value_start, *value_end; |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
534 const unsigned int *line_idx; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
535 const char *value; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
536 unsigned int i, lines_count, first_line_idx; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
537 |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
538 line_idx = array_idx(&mail->header_match_lines, field_idx); |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
539 i_assert(*line_idx != 0); |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
540 first_line_idx = *line_idx - 1; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
541 |
4596
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
542 p_array_init(&header_values, mail->data_pool, 4); |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
543 header = buffer_get_data(mail->header_data, NULL); |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
544 |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
545 lines = array_get(&mail->header_lines, &lines_count); |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
546 for (i = first_line_idx; i < lines_count; i++) { |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
547 if (lines[i].field_idx != lines[first_line_idx].field_idx) |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
548 break; |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
549 |
3288
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
550 /* skip header: and drop ending LF */ |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
551 value_start = header + lines[i].start_pos; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
552 value_end = header + lines[i].end_pos; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
553 if (skip_header(&value_start, value_end - value_start)) { |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
554 if (value_start != value_end && value_end[-1] == '\n') |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
555 value_end--; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
556 value = p_strndup(mail->data_pool, value_start, |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
557 value_end - value_start); |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
558 array_append(&header_values, &value, 1); |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
559 } |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
560 } |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
561 |
6838
e726f298d87e
mail_get_headers() returned bad data when headers were already cached.
Timo Sirainen <tss@iki.fi>
parents:
6526
diff
changeset
|
562 (void)array_append_space(&header_values); |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
563 return array_idx(&header_values, 0); |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
564 } |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
565 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
566 static int |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
567 index_mail_get_raw_headers(struct index_mail *mail, const char *field, |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
568 const char *const **value_r) |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
569 { |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
570 const char *headers[2], *value; |
2336 | 571 struct mailbox_header_lookup_ctx *headers_ctx; |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
572 unsigned char *data; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
573 unsigned int field_idx; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
574 string_t *dest; |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
575 size_t i, len; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
576 int ret; |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4418
diff
changeset
|
577 ARRAY_DEFINE(header_values, const char *); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
578 |
3301
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
579 i_assert(field != NULL); |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
580 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
581 field_idx = get_header_field_idx(mail->ibox, field); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
582 |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
583 dest = str_new(mail->data_pool, 128); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
584 if (mail_cache_lookup_headers(mail->trans->cache_view, dest, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
585 mail->data.seq, &field_idx, 1) <= 0) { |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
586 /* not in cache / error - first see if it's already parsed */ |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
587 p_free(mail->data_pool, dest); |
6445
4d33a6959d32
Don't assert-crash if looking up a non-parsed header after headers were
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
588 |
4d33a6959d32
Don't assert-crash if looking up a non-parsed header after headers were
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
589 if (mail->header_seq != mail->data.seq || |
4d33a6959d32
Don't assert-crash if looking up a non-parsed header after headers were
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
590 index_mail_header_is_parsed(mail, field_idx) < 0) { |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
591 /* parse */ |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
592 headers[0] = field; headers[1] = NULL; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
593 headers_ctx = mailbox_header_lookup_init( |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
594 &mail->ibox->box, headers); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
595 ret = index_mail_parse_headers(mail, headers_ctx); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
596 mailbox_header_lookup_deinit(&headers_ctx); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
597 if (ret < 0) |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
598 return -1; |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
599 } |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
600 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
601 if ((ret = index_mail_header_is_parsed(mail, field_idx)) <= 0) { |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
602 /* not found */ |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
603 i_assert(ret != -1); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
604 *value_r = p_new(mail->data_pool, const char *, 1); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
605 return 0; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
606 } |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
607 *value_r = index_mail_get_parsed_header(mail, field_idx); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
608 return 0; |
1771
63254344ea0e
get_header() returned only first line of multiline headers
Timo Sirainen <tss@iki.fi>
parents:
1770
diff
changeset
|
609 } |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4418
diff
changeset
|
610 data = buffer_get_modifiable_data(dest, &len); |
1771
63254344ea0e
get_header() returned only first line of multiline headers
Timo Sirainen <tss@iki.fi>
parents:
1770
diff
changeset
|
611 |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
612 if (len == 0) { |
3045
ccfd78cc07cc
mail->get_header() was pretty broken. This affected SORT/THREAD.
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
613 /* cached as non-existing. */ |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
614 *value_r = p_new(mail->data_pool, const char *, 1); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
615 return 0; |
3045
ccfd78cc07cc
mail->get_header() was pretty broken. This affected SORT/THREAD.
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
616 } |
ccfd78cc07cc
mail->get_header() was pretty broken. This affected SORT/THREAD.
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
617 |
4596
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
618 p_array_init(&header_values, mail->data_pool, 4); |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
619 |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
620 /* cached. skip "header name: " parts in dest. */ |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
621 for (i = 0; i < len; i++) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
622 if (data[i] == ':') { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
623 if (i+1 != len && data[++i] == ' ') i++; |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
624 |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
625 /* @UNSAFE */ |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
626 len = get_header_size(dest, i); |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
627 data[i + len] = '\0'; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
628 value = (const char *)data + i; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
629 i += len + 1; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
630 |
6838
e726f298d87e
mail_get_headers() returned bad data when headers were already cached.
Timo Sirainen <tss@iki.fi>
parents:
6526
diff
changeset
|
631 array_append(&header_values, &value, 1); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
632 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
633 } |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
634 |
6838
e726f298d87e
mail_get_headers() returned bad data when headers were already cached.
Timo Sirainen <tss@iki.fi>
parents:
6526
diff
changeset
|
635 (void)array_append_space(&header_values); |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
636 *value_r = array_idx(&header_values, 0); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
637 return 0; |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
638 } |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
639 |
6120
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
640 static const char *const * |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
641 index_mail_headers_decode(struct index_mail *mail, const char *const *list, |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
642 unsigned int max_count) |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
643 { |
6120
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
644 const char **decoded_list; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
645 unsigned int i, count; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
646 buffer_t *buf; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
647 |
6424
687efa138e77
Renamed strarray_length/remote() to str_array_length/remove()
Timo Sirainen <tss@iki.fi>
parents:
6423
diff
changeset
|
648 count = str_array_length(list); |
6120
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
649 if (count > max_count) |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
650 count = max_count; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
651 decoded_list = p_new(mail->data_pool, const char *, count + 1); |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
652 |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
653 buf = buffer_create_dynamic(pool_datastack_create(), 512); |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
654 |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
655 for (i = 0; i < count; i++) { |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
656 buffer_set_used_size(buf, 0); |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
657 if (!message_header_decode_utf8((const unsigned char *)list[i], |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
658 strlen(list[i]), buf, FALSE)) |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
659 decoded_list[i] = list[i]; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
660 else { |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
661 decoded_list[i] = p_strndup(mail->data_pool, |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
662 buf->data, buf->used); |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
663 } |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
664 } |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
665 return decoded_list; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
666 } |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
667 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
668 int index_mail_get_headers(struct mail *_mail, const char *field, |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
669 bool decode_to_utf8, const char *const **value_r) |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
670 { |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
671 struct index_mail *mail = (struct index_mail *)_mail; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
672 |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
673 if (index_mail_get_raw_headers(mail, field, value_r) < 0) |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
674 return -1; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
675 if (!decode_to_utf8 || **value_r == NULL) |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
676 return 0; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
677 |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
678 T_FRAME( |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
679 *value_r = index_mail_headers_decode(mail, *value_r, -1U); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
680 ); |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
681 return 0; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
682 } |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
683 |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
684 int index_mail_get_first_header(struct mail *_mail, const char *field, |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
685 bool decode_to_utf8, const char **value_r) |
6120
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
686 { |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
687 struct index_mail *mail = (struct index_mail *)_mail; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
688 const char *const *list; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
689 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
690 if (index_mail_get_raw_headers(mail, field, &list) < 0) |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
691 return -1; |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
692 if (decode_to_utf8 && list[0] != NULL) { |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
693 T_FRAME( |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
694 list = index_mail_headers_decode(mail, list, 1); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
695 ); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
696 } |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
697 *value_r = list[0]; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
698 return list[0] != NULL ? 1 : 0; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
699 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
700 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
701 static void header_cache_callback(struct message_header_line *hdr, |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
702 bool *matched, struct index_mail *mail) |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
703 { |
2451
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2436
diff
changeset
|
704 if (hdr != NULL && hdr->eoh) |
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2436
diff
changeset
|
705 *matched = FALSE; |
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2436
diff
changeset
|
706 |
3463
693baa083a79
Mark *all* non-found headers that are registered in cache file as non-found
Timo Sirainen <tss@iki.fi>
parents:
3458
diff
changeset
|
707 index_mail_parse_header(NULL, hdr, mail); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
708 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
709 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
710 int index_mail_get_header_stream(struct mail *_mail, |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
711 struct mailbox_header_lookup_ctx *_headers, |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
712 struct istream **stream_r) |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
713 { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
714 struct index_mail *mail = (struct index_mail *)_mail; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
715 struct index_header_lookup_ctx *headers = |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
716 (struct index_header_lookup_ctx *)_headers; |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
717 struct istream *input; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
718 string_t *dest; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
719 |
2509
146591955618
Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents:
2451
diff
changeset
|
720 if (mail->data.save_bodystructure_header) { |
146591955618
Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents:
2451
diff
changeset
|
721 /* we have to parse the header. */ |
146591955618
Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents:
2451
diff
changeset
|
722 if (index_mail_parse_headers(mail, _headers) < 0) |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
723 return -1; |
2509
146591955618
Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents:
2451
diff
changeset
|
724 } |
146591955618
Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents:
2451
diff
changeset
|
725 |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
726 dest = str_new(mail->data_pool, 256); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
727 if (mail_cache_lookup_headers(mail->trans->cache_view, dest, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
728 mail->data.seq, headers->idx, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
729 headers->count) > 0) { |
4062
788f5caab763
Last memory leak fix actually started crashing.
Timo Sirainen <tss@iki.fi>
parents:
3909
diff
changeset
|
730 if (mail->data.filter_stream != NULL) |
4070
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
731 i_stream_destroy(&mail->data.filter_stream); |
4062
788f5caab763
Last memory leak fix actually started crashing.
Timo Sirainen <tss@iki.fi>
parents:
3909
diff
changeset
|
732 mail->data.filter_stream = |
6142
6c0bfc35af03
Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents:
6120
diff
changeset
|
733 i_stream_create_from_data(str_data(dest), |
4062
788f5caab763
Last memory leak fix actually started crashing.
Timo Sirainen <tss@iki.fi>
parents:
3909
diff
changeset
|
734 str_len(dest)); |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
735 *stream_r = mail->data.filter_stream; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
736 return 0; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
737 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
738 /* not in cache / error */ |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
739 p_free(mail->data_pool, dest); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
740 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
741 if (mail_get_stream(&mail->mail.mail, NULL, NULL, &input) < 0) |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
742 return -1; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
743 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
744 if (mail->data.filter_stream != NULL) |
4070
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
745 i_stream_destroy(&mail->data.filter_stream); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
746 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
747 index_mail_parse_header_init(mail, _headers); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
748 mail->data.filter_stream = |
2451
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2436
diff
changeset
|
749 i_stream_create_header_filter(mail->data.stream, |
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2436
diff
changeset
|
750 HEADER_FILTER_INCLUDE | |
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2436
diff
changeset
|
751 HEADER_FILTER_HIDE_BODY, |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
752 headers->name, headers->count, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
753 header_cache_callback, mail); |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
754 *stream_r = mail->data.filter_stream; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
755 return 0; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
756 } |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
757 |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
758 static struct mailbox_header_lookup_ctx * |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
759 index_header_lookup_init_real(struct mailbox *box, const char *const headers[]) |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
760 { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
761 struct index_mailbox *ibox = (struct index_mailbox *)box; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
762 struct mail_cache_field *fields, header_field = { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
763 NULL, 0, MAIL_CACHE_FIELD_HEADER, 0, |
2339
406692edc12d
Cache fixes. Decisions are saved again.
Timo Sirainen <tss@iki.fi>
parents:
2336
diff
changeset
|
764 MAIL_CACHE_DECISION_TEMP |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
765 }; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
766 struct index_header_lookup_ctx *ctx; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
767 const char *const *name; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
768 const char **sorted_headers; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
769 pool_t pool; |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
770 unsigned int i, count; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
771 |
3301
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
772 i_assert(*headers != NULL); |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
773 |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
774 for (count = 0, name = headers; *name != NULL; name++) |
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
775 count++; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
776 |
3301
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
777 /* @UNSAFE: headers need to be sorted for filter stream. */ |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
778 sorted_headers = t_new(const char *, count); |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
779 memcpy(sorted_headers, headers, count * sizeof(*sorted_headers)); |
6423
13b0a3ba5f7b
Added i_ prefix to strcmp_p(), strcasecmp_p() and memcasecmp().
Timo Sirainen <tss@iki.fi>
parents:
6280
diff
changeset
|
780 qsort(sorted_headers, count, sizeof(*sorted_headers), i_strcasecmp_p); |
3301
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
781 headers = sorted_headers; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
782 |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
783 /* @UNSAFE */ |
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
784 fields = t_new(struct mail_cache_field, count); |
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
785 for (i = 0; i < count; i++) { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
786 header_field.name = t_strconcat("hdr.", headers[i], NULL); |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
787 fields[i] = header_field; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
788 } |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
789 mail_cache_register_fields(ibox->cache, fields, count); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
790 |
4585
26bbf71e9b5e
Grow index_header_lookup_ctx pool initial size.
Timo Sirainen <tss@iki.fi>
parents:
4518
diff
changeset
|
791 pool = pool_alloconly_create("index_header_lookup_ctx", 1024); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
792 ctx = p_new(pool, struct index_header_lookup_ctx, 1); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
793 ctx->ctx.box = box; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
794 ctx->pool = pool; |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
795 ctx->count = count; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
796 |
3301
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
797 ctx->idx = p_new(pool, unsigned int, count); |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
798 ctx->name = p_new(pool, const char *, count); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
799 |
3301
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
800 /* @UNSAFE */ |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
801 for (i = 0; i < count; i++) { |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
802 ctx->idx[i] = fields[i].idx; |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
803 ctx->name[i] = p_strdup(pool, headers[i]); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
804 } |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
805 return &ctx->ctx; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
806 } |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
807 |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
808 struct mailbox_header_lookup_ctx * |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
809 index_header_lookup_init(struct mailbox *box, const char *const headers[]) |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
810 { |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
811 struct mailbox_header_lookup_ctx *ctx; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
812 |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
813 T_FRAME( |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
814 ctx = index_header_lookup_init_real(box, headers); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
815 ); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6842
diff
changeset
|
816 return ctx; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
817 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
818 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
819 void index_header_lookup_deinit(struct mailbox_header_lookup_ctx *_ctx) |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
820 { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
821 struct index_header_lookup_ctx *ctx = |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
822 (struct index_header_lookup_ctx *)_ctx; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
823 |
6428
7cad076906eb
pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents:
6424
diff
changeset
|
824 pool_unref(&ctx->pool); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
825 } |