imap-fetch.c revision d21f14c01d5546f4bf1b2cbb28ac1f00c24d952a
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen/* Copyright (C) 2002-2004 Timo Sirainen */
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "common.h"
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen#include "buffer.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "istream.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "ostream.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "str.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "message-send.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "message-size.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "imap-date.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "commands.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "imap-fetch.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "imap-util.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen#include <stdlib.h>
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenconst struct imap_fetch_handler default_handlers[7];
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic buffer_t *fetch_handlers = NULL;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic int imap_fetch_handler_cmp(const void *p1, const void *p2)
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen const struct imap_fetch_handler *h1 = p1, *h2 = p2;
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return strcmp(h1->name, h2->name);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen}
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenvoid imap_fetch_handlers_register(const struct imap_fetch_handler *handlers,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen size_t count)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen void *data;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen size_t size;
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen if (fetch_handlers == NULL)
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen fetch_handlers = buffer_create_dynamic(default_pool, 128);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen buffer_append(fetch_handlers, handlers, sizeof(*handlers) * count);
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen data = buffer_get_modifyable_data(fetch_handlers, &size);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen qsort(data, size / sizeof(*handlers), sizeof(*handlers),
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen imap_fetch_handler_cmp);
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen}
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic int imap_fetch_handler_bsearch(const void *name_p, const void *handler_p)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen const char *name = name_p;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen const struct imap_fetch_handler *h = handler_p;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen int i;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen for (i = 0; h->name[i] != '\0'; i++) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (h->name[i] != name[i]) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (name[i] < 'A' || name[i] >= 'Z')
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return name[i] - h->name[i];
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return name[i] < 'A' || name[i] >= 'Z' ? 0 : -1;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen}
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainenint imap_fetch_init_handler(struct imap_fetch_context *ctx, const char *name,
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen struct imap_arg **args)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen const struct imap_fetch_handler *handler;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen handler = bsearch(name, fetch_handlers->data,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen fetch_handlers->used /
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen sizeof(struct imap_fetch_handler),
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen sizeof(struct imap_fetch_handler),
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen imap_fetch_handler_bsearch);
baf1148108b7d9739626b47cc57298c36929586aTimo Sirainen if (handler == NULL) {
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen client_send_command_error(ctx->cmd,
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen t_strconcat("Unknown command ", name, NULL));
baf1148108b7d9739626b47cc57298c36929586aTimo Sirainen return FALSE;
baf1148108b7d9739626b47cc57298c36929586aTimo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen return handler->init(ctx, name, args);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen}
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainenstruct imap_fetch_context *imap_fetch_init(struct client_command_context *cmd)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen{
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen struct client *client = cmd->client;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen struct imap_fetch_context *ctx;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (fetch_handlers == NULL) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen imap_fetch_handlers_register(default_handlers,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen sizeof(default_handlers) /
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen sizeof(default_handlers[0]));
6389aeec8c26b585e583c364b48ad12adf741898Timo Sirainen }
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen ctx = p_new(cmd->pool, struct imap_fetch_context, 1);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->client = client;
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen ctx->cmd = cmd;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->box = client->mailbox;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->cur_str = str_new(default_pool, 8192);
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen ctx->all_headers_buf = buffer_create_dynamic(cmd->pool, 128);
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen ctx->handlers = buffer_create_dynamic(cmd->pool, 128);
9c4e6f29ad07fbd27cb9ac510fa69f8c60709f1fTimo Sirainen ctx->line_finished = TRUE;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return ctx;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen}
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenvoid imap_fetch_add_handler(struct imap_fetch_context *ctx,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen imap_fetch_handler_t *handler, void *context)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen const struct imap_fetch_context_handler *handlers;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen struct imap_fetch_context_handler h;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen size_t i, size;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (context == NULL) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen /* don't allow duplicate handlers */
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen handlers = buffer_get_data(ctx->handlers, &size);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen size /= sizeof(*handlers);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen for (i = 0; i < size; i++) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (handlers[i].handler == handler &&
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen handlers[i].context == NULL)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen memset(&h, 0, sizeof(h));
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen h.handler = handler;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen h.context = context;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen buffer_append(ctx->handlers, &h, sizeof(h));
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen}
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenvoid imap_fetch_begin(struct imap_fetch_context *ctx,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen struct mail_search_arg *search_arg)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen const void *null = NULL;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen const void *data;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (ctx->flags_update_seen) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (mailbox_is_readonly(ctx->box))
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->flags_update_seen = FALSE;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen else if (!ctx->flags_have_handler) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->flags_show_only_seen_changes = TRUE;
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen (void)imap_fetch_init_handler(ctx, "FLAGS", NULL);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (buffer_get_used_size(ctx->all_headers_buf) != 0 &&
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ((ctx->fetch_data & (MAIL_FETCH_STREAM_HEADER |
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen MAIL_FETCH_STREAM_BODY)) == 0)) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen buffer_append(ctx->all_headers_buf, &null, sizeof(null));
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen data = buffer_get_data(ctx->all_headers_buf, NULL);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->all_headers_ctx =
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen mailbox_header_lookup_init(ctx->box, data);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->trans = mailbox_transaction_begin(ctx->box, TRUE);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->select_counter = ctx->client->select_counter;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->search_ctx =
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen mailbox_search_init(ctx->trans, NULL, search_arg, NULL,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->fetch_data, ctx->all_headers_ctx);
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen}
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenint imap_fetch(struct imap_fetch_context *ctx)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen const struct imap_fetch_context_handler *handlers;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen size_t size;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen int ret;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (ctx->cont_handler != NULL) {
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen ret = ctx->cont_handler(ctx);
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen if (ret == 0)
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen return 0;
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen if (ret < 0) {
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen if (ctx->cur_mail->expunged) {
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen /* not an error, just lost it. */
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen ctx->partial_fetch = TRUE;
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen ctx->partial_fetch = TRUE;
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen } else {
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen return -1;
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen }
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen }
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->cont_handler = NULL;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->cur_offset = 0;
07fe84e1db9fe5a79e815f000bd94ae61f5831dbTimo Sirainen ctx->cur_handler++;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen handlers = buffer_get_data(ctx->handlers, &size);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen size /= sizeof(*handlers);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen for (;;) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (o_stream_get_buffer_used_size(ctx->client->output) >=
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen CLIENT_OUTPUT_OPTIMAL_SIZE) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ret = o_stream_flush(ctx->client->output);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (ret <= 0)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return ret;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (ctx->cur_mail == NULL) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (ctx->cur_input != NULL) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen i_stream_unref(ctx->cur_input);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->cur_input = NULL;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->cur_mail = mailbox_search_next(ctx->search_ctx);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (ctx->cur_mail == NULL)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen break;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str_printfa(ctx->cur_str, "* %u FETCH (",
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->cur_mail->seq);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (o_stream_send(ctx->client->output,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str_data(ctx->cur_str),
2ae7cffa50608be0e1261e0a993333a8bdc0550dTimo Sirainen str_len(ctx->cur_str)) < 0)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str_truncate(ctx->cur_str, 0);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str_append_c(ctx->cur_str, ' ');
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->first = TRUE;
2ba4e9bedb0fa778dfbccec5370018b4d0040d9cTimo Sirainen ctx->line_finished = FALSE;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen for (; ctx->cur_handler < size; ctx->cur_handler++) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen t_push();
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ret = handlers[ctx->cur_handler].
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen handler(ctx, ctx->cur_mail,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen handlers[ctx->cur_handler].context);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen t_pop();
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen if (ret == 0)
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen return 0;
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen if (ret < 0) {
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen if (ctx->cur_mail->expunged) {
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen /* not an error, just lost it. */
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen ctx->partial_fetch = TRUE;
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen } else {
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen i_assert(ret < 0 ||
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen ctx->cont_handler != NULL);
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen return -1;
d21f14c01d5546f4bf1b2cbb28ac1f00c24d952aTimo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->cont_handler = NULL;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->cur_offset = 0;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (str_len(ctx->cur_str) > 1) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (o_stream_send(ctx->client->output,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str_data(ctx->cur_str) + ctx->first,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str_len(ctx->cur_str) - 1 -
2ae7cffa50608be0e1261e0a993333a8bdc0550dTimo Sirainen ctx->first) < 0)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
68cb7fad59a99eea1ecc39cb69262adfaa969d4fTimo Sirainen str_truncate(ctx->cur_str, 0);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2ba4e9bedb0fa778dfbccec5370018b4d0040d9cTimo Sirainen ctx->line_finished = TRUE;
2ae7cffa50608be0e1261e0a993333a8bdc0550dTimo Sirainen if (o_stream_send(ctx->client->output, ")\r\n", 3) < 0)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->cur_mail = NULL;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->cur_handler = 0;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return 1;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen}
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenint imap_fetch_deinit(struct imap_fetch_context *ctx)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str_free(ctx->cur_str);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2ba4e9bedb0fa778dfbccec5370018b4d0040d9cTimo Sirainen if (!ctx->line_finished) {
2ba4e9bedb0fa778dfbccec5370018b4d0040d9cTimo Sirainen if (o_stream_send(ctx->client->output, ")\r\n", 3) < 0)
1e62ad3955db977d527fa57d9584e504a8c26fd5Timo Sirainen ctx->failed = TRUE;
2ba4e9bedb0fa778dfbccec5370018b4d0040d9cTimo Sirainen }
2ba4e9bedb0fa778dfbccec5370018b4d0040d9cTimo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (ctx->cur_input != NULL) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen i_stream_unref(ctx->cur_input);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->cur_input = NULL;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (ctx->search_ctx != NULL) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (mailbox_search_deinit(ctx->search_ctx) < 0)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->failed = TRUE;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (ctx->all_headers_ctx != NULL)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen mailbox_header_lookup_deinit(ctx->all_headers_ctx);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (ctx->trans != NULL) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (ctx->failed)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen mailbox_transaction_rollback(ctx->trans);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen else {
b2c1349cf07410aefab0f5b17153af9e5cfcf48fTimo Sirainen if (mailbox_transaction_commit(ctx->trans, 0) < 0)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->failed = TRUE;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return ctx->failed ? -1 : 0;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen}
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic int fetch_body(struct imap_fetch_context *ctx, struct mail *mail,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen void *context __attr_unused__)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen{
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen const char *body;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen body = mail->get_special(mail, MAIL_FETCH_IMAP_BODY);
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen if (body == NULL)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (ctx->first)
0b1f70057d59ed3fe7a163bd4fde0c75353910f3Timo Sirainen ctx->first = FALSE;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen else {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (o_stream_send(ctx->client->output, " ", 1) < 0)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
0b1f70057d59ed3fe7a163bd4fde0c75353910f3Timo Sirainen }
0b1f70057d59ed3fe7a163bd4fde0c75353910f3Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (o_stream_send(ctx->client->output, "BODY (", 6) < 0 ||
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen o_stream_send_str(ctx->client->output, body) < 0 ||
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen o_stream_send(ctx->client->output, ")", 1) < 0)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return 1;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen}
0b1f70057d59ed3fe7a163bd4fde0c75353910f3Timo Sirainen
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainenstatic int fetch_body_init(struct imap_fetch_context *ctx, const char *name,
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen struct imap_arg **args)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen{
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen if (name[4] == '\0') {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->fetch_data |= MAIL_FETCH_IMAP_BODY;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen imap_fetch_add_handler(ctx, fetch_body, NULL);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return TRUE;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen return fetch_body_section_init(ctx, name, args);
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen}
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainenstatic int fetch_bodystructure(struct imap_fetch_context *ctx,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen struct mail *mail, void *context __attr_unused__)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen{
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen const char *bodystructure;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen bodystructure = mail->get_special(mail, MAIL_FETCH_IMAP_BODYSTRUCTURE);
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen if (bodystructure == NULL)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (ctx->first)
0b1f70057d59ed3fe7a163bd4fde0c75353910f3Timo Sirainen ctx->first = FALSE;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen else {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (o_stream_send(ctx->client->output, " ", 1) < 0)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
0b1f70057d59ed3fe7a163bd4fde0c75353910f3Timo Sirainen }
0b1f70057d59ed3fe7a163bd4fde0c75353910f3Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (o_stream_send(ctx->client->output, "BODYSTRUCTURE (", 15) < 0 ||
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen o_stream_send_str(ctx->client->output, bodystructure) < 0 ||
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen o_stream_send(ctx->client->output, ")", 1) < 0)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
0b1f70057d59ed3fe7a163bd4fde0c75353910f3Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return 1;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen}
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic int fetch_bodystructure_init(struct imap_fetch_context *ctx,
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen const char *name __attr_unused__,
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen struct imap_arg **args __attr_unused__)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->fetch_data |= MAIL_FETCH_IMAP_BODYSTRUCTURE;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen imap_fetch_add_handler(ctx, fetch_bodystructure, NULL);
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen return TRUE;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen}
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic int fetch_envelope(struct imap_fetch_context *ctx, struct mail *mail,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen void *context __attr_unused__)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen{
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen const char *envelope;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen envelope = mail->get_special(mail, MAIL_FETCH_IMAP_ENVELOPE);
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen if (envelope == NULL)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (ctx->first)
0b1f70057d59ed3fe7a163bd4fde0c75353910f3Timo Sirainen ctx->first = FALSE;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen else {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (o_stream_send(ctx->client->output, " ", 1) < 0)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
0b1f70057d59ed3fe7a163bd4fde0c75353910f3Timo Sirainen }
0b1f70057d59ed3fe7a163bd4fde0c75353910f3Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (o_stream_send(ctx->client->output, "ENVELOPE (", 10) < 0 ||
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen o_stream_send_str(ctx->client->output, envelope) < 0 ||
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen o_stream_send(ctx->client->output, ")", 1) < 0)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return 1;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen}
0b1f70057d59ed3fe7a163bd4fde0c75353910f3Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic int fetch_envelope_init(struct imap_fetch_context *ctx,
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen const char *name __attr_unused__,
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen struct imap_arg **args __attr_unused__)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->fetch_data |= MAIL_FETCH_IMAP_ENVELOPE;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen imap_fetch_add_handler(ctx, fetch_envelope, NULL);
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen return TRUE;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen}
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic int fetch_flags(struct imap_fetch_context *ctx, struct mail *mail,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen void *context __attr_unused__)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen{
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen enum mail_flags flags;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen const char *const *keywords;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen flags = mail->get_flags(mail);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen keywords = mail->get_keywords(mail);
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen if (ctx->flags_update_seen && (flags & MAIL_SEEN) == 0) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen /* Add \Seen flag */
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen flags |= MAIL_SEEN;
9a97b508a9bd66b1d75b108b57e0a5693eb3a086Timo Sirainen if (mail->update_flags(mail, MODIFY_ADD, MAIL_SEEN) < 0)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen } else if (ctx->flags_show_only_seen_changes) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return 1;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen }
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str_append(ctx->cur_str, "FLAGS (");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen imap_write_flags(ctx->cur_str, flags, keywords);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str_append(ctx->cur_str, ") ");
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return 1;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen}
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic int fetch_flags_init(struct imap_fetch_context *ctx,
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen const char *name __attr_unused__,
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen struct imap_arg **args __attr_unused__)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->flags_have_handler = TRUE;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->fetch_data |= MAIL_FETCH_FLAGS;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen imap_fetch_add_handler(ctx, fetch_flags, NULL);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return TRUE;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen}
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic int fetch_internaldate(struct imap_fetch_context *ctx, struct mail *mail,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen void *context __attr_unused__)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen time_t time;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen time = mail->get_received_date(mail);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (time == (time_t)-1)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return -1;
73d29cffe84aa9742353c40516a09e18385ab341Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str_printfa(ctx->cur_str, "INTERNALDATE \"%s\" ",
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen imap_to_datetime(time));
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return 1;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen}
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic int fetch_internaldate_init(struct imap_fetch_context *ctx,
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen const char *name __attr_unused__,
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen struct imap_arg **args __attr_unused__)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx->fetch_data |= MAIL_FETCH_RECEIVED_DATE;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen imap_fetch_add_handler(ctx, fetch_internaldate, NULL);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return TRUE;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen}
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic int fetch_uid(struct imap_fetch_context *ctx, struct mail *mail,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen void *context __attr_unused__)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str_printfa(ctx->cur_str, "UID %u ", mail->uid);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return 1;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen}
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic int fetch_uid_init(struct imap_fetch_context *ctx __attr_unused__,
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen const char *name __attr_unused__,
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen struct imap_arg **args __attr_unused__)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen imap_fetch_add_handler(ctx, fetch_uid, NULL);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return TRUE;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen}
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenconst struct imap_fetch_handler default_handlers[7] = {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { "BODY", fetch_body_init },
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { "BODYSTRUCTURE", fetch_bodystructure_init },
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { "ENVELOPE", fetch_envelope_init },
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { "FLAGS", fetch_flags_init },
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { "INTERNALDATE", fetch_internaldate_init },
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { "RFC822", fetch_rfc822_init },
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { "UID", fetch_uid_init }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen};