index-fetch.c revision 02b32cf39a098edf60981fc228e4b034f11f3b90
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (C) 2002 Timo Sirainen */
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomistatic int index_fetch_body(MailIndexRecord *rec, FetchContext *ctx)
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi const char *body;
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi body = imap_msgcache_get(ctx->cache, IMAP_CACHE_BODY);
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi i_error("Couldn't generate BODY for UID %u (index %s)",
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomistatic int index_fetch_bodystructure(MailIndexRecord *rec, FetchContext *ctx)
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi bodystructure = imap_msgcache_get(ctx->cache, IMAP_CACHE_BODYSTRUCTURE);
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi i_error("Couldn't generate BODYSTRUCTURE for UID %u (index %s)",
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomistatic int index_fetch_envelope(MailIndexRecord *rec, FetchContext *ctx)
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi envelope = imap_msgcache_get(ctx->cache, IMAP_CACHE_ENVELOPE);
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi t_string_printfa(ctx->str, "ENVELOPE (%s) ", envelope);
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi i_error("Couldn't generate ENVELOPE for UID %u (index %s)",
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomistatic int index_fetch_rfc822_size(MailIndexRecord *rec, FetchContext *ctx)
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi i_error("Couldn't get RFC822.SIZE for UID %u (index %s)",
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi t_string_printfa(ctx->str, "RFC822.SIZE %"PRIuUOFF_T" ",
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomistatic void index_fetch_flags(MailIndexRecord *rec, FetchContext *ctx)
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomistatic void index_fetch_internaldate(MailIndexRecord *rec, FetchContext *ctx)
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi t_string_printfa(ctx->str, "INTERNALDATE \"%s\" ",
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomistatic void index_fetch_uid(MailIndexRecord *rec, FetchContext *ctx)
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomistatic int index_fetch_send_rfc822(MailIndexRecord *rec, FetchContext *ctx)
84b746f56209d4a85af73cd26850e75f519ae0b0Timo Sirainen const char *str;
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi i_error("Couldn't get RFC822 for UID %u (index %s)",
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi str = t_strdup_printf(" RFC822 {%"PRIuUOFF_T"}\r\n",
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi if (io_buffer_send(ctx->outbuf, str, strlen(str)) < 0)
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi body_size.physical_size += hdr_size.physical_size;
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi return message_send(ctx->outbuf, inbuf, &body_size, 0, (uoff_t)-1);
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomistatic int index_fetch_send_rfc822_header(MailIndexRecord *rec,
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi const char *str;
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi if (!imap_msgcache_get_rfc822(ctx->cache, &inbuf, &hdr_size, NULL)) {
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi i_error("Couldn't get RFC822.HEADER for UID %u (index %s)",
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi str = t_strdup_printf(" RFC822.HEADER {%"PRIuUOFF_T"}\r\n",
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi if (io_buffer_send(ctx->outbuf, str, strlen(str)) < 0)
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi return message_send(ctx->outbuf, inbuf, &hdr_size, 0, (uoff_t)-1);
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomistatic int index_fetch_send_rfc822_text(MailIndexRecord *rec, FetchContext *ctx)
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi const char *str;
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi if (!imap_msgcache_get_rfc822(ctx->cache, &inbuf, NULL, &body_size)) {
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi i_error("Couldn't get RFC822.TEXT for UID %u (index %s)",
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi str = t_strdup_printf(" RFC822.TEXT {%"PRIuUOFF_T"}\r\n",
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi if (io_buffer_send(ctx->outbuf, str, strlen(str)) < 0)
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi return message_send(ctx->outbuf, inbuf, &body_size, 0, (uoff_t)-1);
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomistatic ImapCacheField index_get_cache(MailFetchData *fetch_data)
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi field |= IMAP_CACHE_MESSAGE_OPEN | IMAP_CACHE_MESSAGE_HDR_SIZE |
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi field |= IMAP_CACHE_MESSAGE_OPEN | IMAP_CACHE_MESSAGE_HDR_SIZE;
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi field |= IMAP_CACHE_MESSAGE_OPEN | IMAP_CACHE_MESSAGE_BODY_SIZE;
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi /* check what body[] sections want */
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi field |= index_fetch_body_get_cache(sect->section);
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomistatic void index_msgcache_open(FetchContext *ctx, MailIndexRecord *rec)
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi mail_cache_context = index_msgcache_get_context(ctx->index, rec);
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi (rec->index_flags & INDEX_MAIL_FLAG_BINARY_HEADER) ?
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi (rec->index_flags & INDEX_MAIL_FLAG_BINARY_BODY) ?
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomistatic int index_fetch_mail(MailIndex *index __attr_unused__,
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi unsigned int orig_len;
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi /* first see what we need to do. this way we don't first do some
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi light parsing and later notice that we need to do heavier parsing
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi /* these can't fail */
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi /* rest can */
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi /* send the data written into temp string,
4d9181518769b1f78d8078f7fae899fd0b95907fAki Tuomi not including the trailing zero */
if (data_written) {
return !failed;
int ret;
return FALSE;
return ret >= 0;