Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-storage/index/index-fetch.c @ 160:ff05b320482c HEAD
Bigger changes.. full_virtual_size was removed from index record and
MessagePart caching is now forced. Also added per-message flags, including
binary flags which can be used to check if CRs need to be inserted into
message data.
Added mbox-rewrite support which can be used to write out mbox file with
updated flags. This still has the problem of being able to read changed
custom flags, that'll require another bigger change.
There's also several other mostly mbox related fixes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 06 Sep 2002 16:43:58 +0300 |
parents | 2f67de235489 |
children | 4716cf66c2cc |
rev | line source |
---|---|
0 | 1 /* Copyright (C) 2002 Timo Sirainen */ |
2 | |
3 #include "lib.h" | |
4 #include "iobuffer.h" | |
5 #include "temp-string.h" | |
6 #include "index-storage.h" | |
7 #include "index-fetch.h" | |
8 #include "mail-messageset.h" | |
12
a4423c83b2b0
moved lib-imap/imap-message-send.* into lib-mail/message-send.*
Timo Sirainen <tss@iki.fi>
parents:
10
diff
changeset
|
9 #include "message-send.h" |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
111
diff
changeset
|
10 #include "imap-date.h" |
0 | 11 #include "imap-util.h" |
12 #include "imap-message-cache.h" | |
13 | |
14 #include <unistd.h> | |
15 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
16 static void index_fetch_body(MailIndexRecord *rec, FetchContext *ctx) |
0 | 17 { |
18 const char *body; | |
19 | |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
20 body = imap_msgcache_get(ctx->cache, IMAP_CACHE_BODY); |
0 | 21 if (body != NULL) |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
22 t_string_printfa(ctx->str, " BODY %s", body); |
0 | 23 else { |
24 i_error("Couldn't generate BODY for UID %u (index %s)", | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
25 rec->uid, ctx->index->filepath); |
0 | 26 } |
27 } | |
28 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
29 static void index_fetch_bodystructure(MailIndexRecord *rec, FetchContext *ctx) |
0 | 30 { |
31 const char *bodystructure; | |
32 | |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
33 bodystructure = imap_msgcache_get(ctx->cache, IMAP_CACHE_BODYSTRUCTURE); |
0 | 34 if (bodystructure != NULL) { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
35 t_string_printfa(ctx->str, " BODYSTRUCTURE %s", |
0 | 36 bodystructure); |
37 } else { | |
38 i_error("Couldn't generate BODYSTRUCTURE for UID %u (index %s)", | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
39 rec->uid, ctx->index->filepath); |
0 | 40 } |
41 } | |
42 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
43 static void index_fetch_envelope(MailIndexRecord *rec, FetchContext *ctx) |
0 | 44 { |
45 const char *envelope; | |
46 | |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
47 envelope = imap_msgcache_get(ctx->cache, IMAP_CACHE_ENVELOPE); |
0 | 48 if (envelope != NULL) |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
49 t_string_printfa(ctx->str, " ENVELOPE (%s)", envelope); |
0 | 50 else { |
51 i_error("Couldn't generate ENVELOPE for UID %u (index %s)", | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
52 rec->uid, ctx->index->filepath); |
0 | 53 } |
54 } | |
55 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
56 static void index_fetch_rfc822_size(MailIndexRecord *rec, FetchContext *ctx) |
0 | 57 { |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
58 MessageSize hdr_size, body_size; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
59 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
60 if (!imap_msgcache_get_rfc822(ctx->cache, NULL, |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
61 &hdr_size, &body_size)) { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
62 i_error("Couldn't get RFC822.SIZE for UID %u (index %s)", |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
63 rec->uid, ctx->index->filepath); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
64 return; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
65 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
66 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
67 t_string_printfa(ctx->str, " RFC822.SIZE %"UOFF_T_FORMAT, |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
68 hdr_size.virtual_size + body_size.virtual_size); |
0 | 69 } |
70 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
71 static void index_fetch_flags(MailIndexRecord *rec, FetchContext *ctx) |
0 | 72 { |
73 MailFlags flags; | |
74 | |
75 flags = rec->msg_flags; | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
76 if (rec->uid >= ctx->index->first_recent_uid) |
0 | 77 flags |= MAIL_RECENT; |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
78 if (ctx->update_seen) |
0 | 79 flags |= MAIL_SEEN; |
80 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
81 t_string_printfa(ctx->str, " FLAGS (%s)", |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
82 imap_write_flags(flags, ctx->custom_flags)); |
0 | 83 } |
84 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
85 static void index_fetch_internaldate(MailIndexRecord *rec, FetchContext *ctx) |
0 | 86 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
87 t_string_printfa(ctx->str, " INTERNALDATE \"%s\"", |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
111
diff
changeset
|
88 imap_to_datetime(rec->internal_date)); |
0 | 89 } |
90 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
91 static void index_fetch_uid(MailIndexRecord *rec, FetchContext *ctx) |
0 | 92 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
93 t_string_printfa(ctx->str, " UID %u", rec->uid); |
0 | 94 } |
95 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
96 static void index_fetch_rfc822(MailIndexRecord *rec, FetchContext *ctx) |
0 | 97 { |
98 MessageSize hdr_size, body_size; | |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
99 IOBuffer *inbuf; |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
100 const char *str; |
0 | 101 |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
102 if (!imap_msgcache_get_rfc822(ctx->cache, &inbuf, |
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
103 &hdr_size, &body_size)) { |
0 | 104 i_error("Couldn't get RFC822 for UID %u (index %s)", |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
105 rec->uid, ctx->index->filepath); |
0 | 106 return; |
107 } | |
108 | |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
109 str = t_strdup_printf(" RFC822 {%"UOFF_T_FORMAT"}\r\n", |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
110 hdr_size.virtual_size + body_size.virtual_size); |
111
8a9c6b71761f
avoid sending extra spaces in FETCH reply.
Timo Sirainen <tss@iki.fi>
parents:
106
diff
changeset
|
111 if (ctx->first) str++; else ctx->first = FALSE; |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
112 (void)io_buffer_send(ctx->outbuf, str, strlen(str)); |
0 | 113 |
114 body_size.physical_size += hdr_size.physical_size; | |
115 body_size.virtual_size += hdr_size.virtual_size; | |
50
d493b9cc265e
Introduced uoff_t which is the unsigned-equilevant of off_t. This was needed
Timo Sirainen <tss@iki.fi>
parents:
47
diff
changeset
|
116 (void)message_send(ctx->outbuf, inbuf, &body_size, 0, (uoff_t)-1); |
0 | 117 } |
118 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
119 static void index_fetch_rfc822_header(MailIndexRecord *rec, FetchContext *ctx) |
0 | 120 { |
121 MessageSize hdr_size; | |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
122 IOBuffer *inbuf; |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
123 const char *str; |
0 | 124 |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
125 if (!imap_msgcache_get_rfc822(ctx->cache, &inbuf, &hdr_size, NULL)) { |
0 | 126 i_error("Couldn't get RFC822.HEADER for UID %u (index %s)", |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
127 rec->uid, ctx->index->filepath); |
0 | 128 return; |
129 } | |
130 | |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
131 str = t_strdup_printf(" RFC822.HEADER {%"UOFF_T_FORMAT"}\r\n", |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
132 hdr_size.virtual_size); |
111
8a9c6b71761f
avoid sending extra spaces in FETCH reply.
Timo Sirainen <tss@iki.fi>
parents:
106
diff
changeset
|
133 if (ctx->first) str++; else ctx->first = FALSE; |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
134 (void)io_buffer_send(ctx->outbuf, str, strlen(str)); |
50
d493b9cc265e
Introduced uoff_t which is the unsigned-equilevant of off_t. This was needed
Timo Sirainen <tss@iki.fi>
parents:
47
diff
changeset
|
135 (void)message_send(ctx->outbuf, inbuf, &hdr_size, 0, (uoff_t)-1); |
0 | 136 } |
137 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
138 static void index_fetch_rfc822_text(MailIndexRecord *rec, FetchContext *ctx) |
0 | 139 { |
140 MessageSize body_size; | |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
141 IOBuffer *inbuf; |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
142 const char *str; |
0 | 143 |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
144 if (!imap_msgcache_get_rfc822(ctx->cache, &inbuf, NULL, &body_size)) { |
0 | 145 i_error("Couldn't get RFC822.TEXT for UID %u (index %s)", |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
146 rec->uid, ctx->index->filepath); |
0 | 147 return; |
148 } | |
149 | |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
150 str = t_strdup_printf(" RFC822.TEXT {%"UOFF_T_FORMAT"}\r\n", |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
151 body_size.virtual_size); |
111
8a9c6b71761f
avoid sending extra spaces in FETCH reply.
Timo Sirainen <tss@iki.fi>
parents:
106
diff
changeset
|
152 if (ctx->first) str++; else ctx->first = FALSE; |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
153 (void)io_buffer_send(ctx->outbuf, str, strlen(str)); |
50
d493b9cc265e
Introduced uoff_t which is the unsigned-equilevant of off_t. This was needed
Timo Sirainen <tss@iki.fi>
parents:
47
diff
changeset
|
154 (void)message_send(ctx->outbuf, inbuf, &body_size, 0, (uoff_t)-1); |
0 | 155 } |
156 | |
157 static ImapCacheField index_get_cache(MailFetchData *fetch_data) | |
158 { | |
159 MailFetchBodyData *sect; | |
160 ImapCacheField field; | |
161 | |
162 field = 0; | |
163 if (fetch_data->body) | |
164 field |= IMAP_CACHE_BODY; | |
165 if (fetch_data->bodystructure) | |
166 field |= IMAP_CACHE_BODYSTRUCTURE; | |
167 if (fetch_data->envelope) | |
168 field |= IMAP_CACHE_ENVELOPE; | |
169 | |
170 if (fetch_data->rfc822_size) { | |
171 field |= IMAP_CACHE_MESSAGE_HDR_SIZE | | |
172 IMAP_CACHE_MESSAGE_BODY_SIZE; | |
173 } | |
174 if (fetch_data->rfc822) { | |
175 field |= IMAP_CACHE_MESSAGE_OPEN | IMAP_CACHE_MESSAGE_HDR_SIZE | | |
176 IMAP_CACHE_MESSAGE_BODY_SIZE; | |
177 } | |
178 if (fetch_data->rfc822_header) | |
179 field |= IMAP_CACHE_MESSAGE_OPEN | IMAP_CACHE_MESSAGE_HDR_SIZE; | |
180 if (fetch_data->rfc822_text) | |
181 field |= IMAP_CACHE_MESSAGE_OPEN | IMAP_CACHE_MESSAGE_BODY_SIZE; | |
182 | |
183 /* check what body[] sections want */ | |
184 sect = fetch_data->body_sections; | |
185 for (; sect != NULL; sect = sect->next) | |
186 field |= index_fetch_body_get_cache(sect->section); | |
187 return field; | |
188 } | |
189 | |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
190 static void index_msgcache_open(FetchContext *ctx, MailIndexRecord *rec) |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
191 { |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
192 ImapCacheField fields; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
193 uoff_t virtual_header_size, virtual_body_size; |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
194 void *mail_cache_context; |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
195 |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
196 fields = index_get_cache(ctx->fetch_data); |
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
197 if (fields == 0) |
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
198 return; |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
199 |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
200 mail_cache_context = index_msgcache_get_context(ctx->index, rec); |
0 | 201 |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
202 virtual_header_size = |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
203 (rec->index_flags & INDEX_MAIL_FLAG_BINARY_HEADER) ? |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
204 rec->header_size : 0; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
205 virtual_body_size = |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
206 (rec->index_flags & INDEX_MAIL_FLAG_BINARY_BODY) ? |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
207 rec->body_size : 0; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
208 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
209 imap_msgcache_open(ctx->cache, rec->uid, fields, |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
210 virtual_header_size, virtual_body_size, |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
211 mail_cache_context); |
0 | 212 } |
213 | |
214 static int index_fetch_mail(MailIndex *index __attr_unused__, | |
215 MailIndexRecord *rec, unsigned int seq, | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
216 void *context) |
0 | 217 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
218 FetchContext *ctx = context; |
0 | 219 MailFetchBodyData *sect; |
220 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
221 ctx->str = t_string_new(2048); |
0 | 222 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
223 t_string_printfa(ctx->str, "* %u FETCH (", seq); |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
224 (void)io_buffer_send(ctx->outbuf, ctx->str->str, ctx->str->len); |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
225 t_string_truncate(ctx->str, 0); |
0 | 226 |
227 /* first see what we need to do. this way we don't first do some | |
228 light parsing and later notice that we need to do heavier parsing | |
229 anyway */ | |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
230 index_msgcache_open(ctx, rec); |
0 | 231 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
232 if (ctx->fetch_data->uid) |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
233 index_fetch_uid(rec, ctx); |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
234 if (ctx->fetch_data->flags) |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
235 index_fetch_flags(rec, ctx); |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
236 if (ctx->fetch_data->internaldate) |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
237 index_fetch_internaldate(rec, ctx); |
0 | 238 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
239 if (ctx->fetch_data->body) |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
240 index_fetch_body(rec, ctx); |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
241 if (ctx->fetch_data->bodystructure) |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
242 index_fetch_bodystructure(rec, ctx); |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
243 if (ctx->fetch_data->envelope) |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
244 index_fetch_envelope(rec, ctx); |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
245 if (ctx->fetch_data->rfc822_size) |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
246 index_fetch_rfc822_size(rec, ctx); |
0 | 247 |
248 /* send the data written into temp string, skipping the initial space */ | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
249 if (ctx->str->len > 0) { |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
250 (void)io_buffer_send(ctx->outbuf, ctx->str->str+1, |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
251 ctx->str->len-1); |
0 | 252 } |
111
8a9c6b71761f
avoid sending extra spaces in FETCH reply.
Timo Sirainen <tss@iki.fi>
parents:
106
diff
changeset
|
253 ctx->first = ctx->str->len == 0; |
0 | 254 |
255 /* large data */ | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
256 if (ctx->fetch_data->rfc822) |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
257 index_fetch_rfc822(rec, ctx); |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
258 if (ctx->fetch_data->rfc822_text) |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
259 index_fetch_rfc822_text(rec, ctx); |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
260 if (ctx->fetch_data->rfc822_header) |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
261 index_fetch_rfc822_header(rec, ctx); |
0 | 262 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
263 sect = ctx->fetch_data->body_sections; |
0 | 264 for (; sect != NULL; sect = sect->next) |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
265 index_fetch_body_section(rec, seq, sect, ctx); |
0 | 266 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
267 (void)io_buffer_send(ctx->outbuf, ")\r\n", 3); |
0 | 268 |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
269 imap_msgcache_close(ctx->cache); |
0 | 270 return TRUE; |
271 } | |
272 | |
273 int index_storage_fetch(Mailbox *box, MailFetchData *fetch_data, | |
274 IOBuffer *outbuf, int *all_found) | |
275 { | |
276 IndexMailbox *ibox = (IndexMailbox *) box; | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
277 FetchContext ctx; |
0 | 278 MailFetchBodyData *sect; |
279 int ret; | |
280 | |
281 if (!ibox->index->set_lock(ibox->index, MAIL_LOCK_SHARED)) | |
282 return mail_storage_set_index_error(ibox); | |
283 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
284 memset(&ctx, 0, sizeof(ctx)); |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
285 ctx.box = box; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
286 ctx.cache = ibox->cache; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
287 ctx.index = ibox->index; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
288 ctx.custom_flags = flags_file_list_get(ibox->flagsfile); |
0 | 289 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
290 ctx.fetch_data = fetch_data; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
291 ctx.outbuf = outbuf; |
0 | 292 |
293 /* If we have any BODY[..] sections, \Seen flag is added for | |
294 all messages */ | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
295 sect = ctx.fetch_data->body_sections; |
0 | 296 for (; sect != NULL; sect = sect->next) { |
297 if (!sect->peek) { | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
298 ctx.update_seen = TRUE; |
0 | 299 break; |
300 } | |
301 } | |
302 | |
47
306c20092a96
Errors in user-specified messagesets are now properly reported back to user.
Timo Sirainen <tss@iki.fi>
parents:
25
diff
changeset
|
303 ret = index_messageset_foreach(ibox, fetch_data->messageset, |
306c20092a96
Errors in user-specified messagesets are now properly reported back to user.
Timo Sirainen <tss@iki.fi>
parents:
25
diff
changeset
|
304 fetch_data->uidset, |
306c20092a96
Errors in user-specified messagesets are now properly reported back to user.
Timo Sirainen <tss@iki.fi>
parents:
25
diff
changeset
|
305 index_fetch_mail, &ctx); |
0 | 306 |
307 flags_file_list_unref(ibox->flagsfile); | |
308 | |
47
306c20092a96
Errors in user-specified messagesets are now properly reported back to user.
Timo Sirainen <tss@iki.fi>
parents:
25
diff
changeset
|
309 if (!ibox->index->set_lock(ibox->index, MAIL_LOCK_UNLOCK)) |
0 | 310 return mail_storage_set_index_error(ibox); |
311 | |
312 if (all_found != NULL) | |
313 *all_found = ret == 1; | |
314 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
315 if (ret >= 1 && ctx.update_seen && !box->readonly) { |
0 | 316 /* BODY[..] was fetched, set \Seen flag for all messages. |
317 This needs to be done separately because we need exclusive | |
318 lock for it */ | |
319 if (!index_storage_update_flags(box, fetch_data->messageset, | |
320 fetch_data->uidset, | |
321 MAIL_SEEN, NULL, MODIFY_ADD, | |
322 NULL, NULL, NULL)) | |
323 return FALSE; | |
324 } | |
325 | |
47
306c20092a96
Errors in user-specified messagesets are now properly reported back to user.
Timo Sirainen <tss@iki.fi>
parents:
25
diff
changeset
|
326 return ret >= 0; |
0 | 327 } |