index-fetch.c revision 100e980900f652c9114997d7153e010e0639effe
7cb128dc4cae2a03a742f63ba7afee23c78e3af0Phil Carmody/* Copyright (C) 2002 Timo Sirainen */
b321df9603081896b70ec44635af96d674a9839aTimo Sirainenstatic int index_fetch_internaldate(MailIndexRecord *rec, FetchContext *ctx)
e4d34f2fbee451219599d71505594df704093ce3Timo Sirainen date = imap_msgcache_get_internal_date(ctx->cache);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen t_string_printfa(ctx->str, "INTERNALDATE \"%s\" ",
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen "Couldn't generate INTERNALDATE for UID %u (index %s)",
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainenstatic int index_fetch_body(MailIndexRecord *rec, FetchContext *ctx)
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen body = imap_msgcache_get(ctx->cache, IMAP_CACHE_BODY);
e4d34f2fbee451219599d71505594df704093ce3Timo Sirainen t_string_printfa(ctx->str, "BODY (%s) ", body);
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen "Couldn't generate BODY for UID %u (index %s)",
31e7be5e1d41a77f08d26cef46aba1df24b3f1baTimo Sirainenstatic int index_fetch_bodystructure(MailIndexRecord *rec, FetchContext *ctx)
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen bodystructure = imap_msgcache_get(ctx->cache, IMAP_CACHE_BODYSTRUCTURE);
2cfe9983ce7a6280636ee12beccc2e865111967bTimo Sirainen t_string_printfa(ctx->str, "BODYSTRUCTURE (%s) ",
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainen "Couldn't generate BODYSTRUCTURE for UID %u (index %s)",
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainenstatic int index_fetch_envelope(MailIndexRecord *rec, FetchContext *ctx)
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen envelope = imap_msgcache_get(ctx->cache, IMAP_CACHE_ENVELOPE);
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainen t_string_printfa(ctx->str, "ENVELOPE (%s) ", envelope);
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainen "Couldn't generate ENVELOPE for UID %u (index %s)",
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainenstatic int index_fetch_rfc822_size(MailIndexRecord *rec, FetchContext *ctx)
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainen size = imap_msgcache_get_virtual_size(ctx->cache);
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainen "Couldn't get RFC822.SIZE for UID %u (index %s)",
dc8ba4890b74bde400e0feef96114940129ab181Timo Sirainen t_string_printfa(ctx->str, "RFC822.SIZE %"PRIuUOFF_T" ", size);
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainenstatic void index_fetch_flags(MailIndexRecord *rec, FetchContext *ctx)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void index_fetch_uid(MailIndexRecord *rec, FetchContext *ctx)
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainen t_string_printfa(ctx->str, "UID %u ", rec->uid);
a8e132559a7ebe54c8269d79ce29fa3338c76199Timo Sirainenstatic int index_fetch_send_rfc822(MailIndexRecord *rec, FetchContext *ctx)
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainen const char *str;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (!imap_msgcache_get_rfc822(ctx->cache, &inbuf,
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainen "Couldn't get RFC822 for UID %u (index %s)",
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainen str = t_strdup_printf(" RFC822 {%"PRIuUOFF_T"}\r\n",
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainen hdr_size.virtual_size + body_size.virtual_size);
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainen if (o_buffer_send(ctx->outbuf, str, strlen(str)) < 0)
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen body_size.physical_size += hdr_size.physical_size;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen body_size.virtual_size += hdr_size.virtual_size;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen return message_send(ctx->outbuf, inbuf, &body_size, 0, (uoff_t)-1);
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainenstatic int index_fetch_send_rfc822_header(MailIndexRecord *rec,
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen const char *str;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (!imap_msgcache_get_rfc822(ctx->cache, &inbuf, &hdr_size, NULL)) {
b321df9603081896b70ec44635af96d674a9839aTimo Sirainen "Couldn't get RFC822.HEADER for UID %u (index %s)",
38ceb710e2bc957a66a75c68957cb87746682a75Timo Sirainen str = t_strdup_printf(" RFC822.HEADER {%"PRIuUOFF_T"}\r\n",
38ceb710e2bc957a66a75c68957cb87746682a75Timo Sirainen if (o_buffer_send(ctx->outbuf, str, strlen(str)) < 0)
38ceb710e2bc957a66a75c68957cb87746682a75Timo Sirainen return message_send(ctx->outbuf, inbuf, &hdr_size, 0, (uoff_t)-1);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic int index_fetch_send_rfc822_text(MailIndexRecord *rec, FetchContext *ctx)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen const char *str;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (!imap_msgcache_get_rfc822(ctx->cache, &inbuf, NULL, &body_size)) {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen "Couldn't get RFC822.TEXT for UID %u (index %s)",
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen str = t_strdup_printf(" RFC822.TEXT {%"PRIuUOFF_T"}\r\n",
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (o_buffer_send(ctx->outbuf, str, strlen(str)) < 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen return message_send(ctx->outbuf, inbuf, &body_size, 0, (uoff_t)-1);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic ImapCacheField index_get_cache(MailFetchData *fetch_data)
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainen field |= IMAP_CACHE_MESSAGE_OPEN | IMAP_CACHE_MESSAGE_HDR_SIZE |
484e12acec34f16e5a8adc001e23ae48f1dda8c7Timo Sirainen field |= IMAP_CACHE_MESSAGE_OPEN | IMAP_CACHE_MESSAGE_HDR_SIZE;
484e12acec34f16e5a8adc001e23ae48f1dda8c7Timo Sirainen field |= IMAP_CACHE_MESSAGE_OPEN | IMAP_CACHE_MESSAGE_BODY_SIZE;
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen /* check what body[] sections want */
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen field |= index_fetch_body_get_cache(sect->section);
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainenstatic int fetch_msgcache_open(FetchContext *ctx, MailIndexRecord *rec)
38ceb710e2bc957a66a75c68957cb87746682a75Timo Sirainen return index_msgcache_open(ctx->cache, ctx->index, rec, fields);
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainenstatic int index_fetch_mail(MailIndex *index __attr_unused__,
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen unsigned int idx_seq,
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen /* first see what we need to do. this way we don't first do some
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen light parsing and later notice that we need to do heavier parsing
e4d34f2fbee451219599d71505594df704093ce3Timo Sirainen /* most likely message not found, just ignore it. */
b321df9603081896b70ec44635af96d674a9839aTimo Sirainen if (ctx->update_seen && (rec->msg_flags & MAIL_SEEN) == 0) {
b321df9603081896b70ec44635af96d674a9839aTimo Sirainen (void)index->update_flags(index, rec, idx_seq,
b321df9603081896b70ec44635af96d674a9839aTimo Sirainen t_string_printfa(ctx->str, "* %u FETCH (", client_seq);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* these can't fail */
b321df9603081896b70ec44635af96d674a9839aTimo Sirainen /* rest can */
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen /* send the data written into temp string,
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen not including the trailing zero */
if (data_written) {
return !failed;
int ret;
return FALSE;
return ret > 0;