imap-sync.c revision 5fb3bff645380804c9db2510940c41db6b8fdb01
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen/* Copyright (C) 2002-2004 Timo Sirainen */
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#include "common.h"
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#include "str.h"
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#include "mail-storage.h"
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen#include "imap-util.h"
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#include "imap-sync.h"
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen#include "commands.h"
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainenstruct cmd_sync_context {
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen const char *tagline;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct imap_sync_context *sync_ctx;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen};
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainenstruct imap_sync_context {
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct client *client;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct mailbox *box;
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen enum imap_sync_flags imap_flags;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct mailbox_transaction_context *t;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct mailbox_sync_context *sync_ctx;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail *mail;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct mailbox_sync_rec sync_rec;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen uint32_t seq;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen unsigned int messages_count;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen bool failed;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen};
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainenstruct imap_sync_context *
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainenimap_sync_init(struct client *client, struct mailbox *box,
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen enum imap_sync_flags imap_flags, enum mailbox_sync_flags flags)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen{
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct imap_sync_context *ctx;
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen struct mailbox_status status;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen i_assert(client->mailbox == box);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen ctx = i_new(struct imap_sync_context, 1);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen ctx->client = client;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen ctx->box = box;
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen ctx->imap_flags = imap_flags;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen ctx->sync_ctx = mailbox_sync_init(box, flags);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen ctx->t = mailbox_transaction_begin(box, 0);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen ctx->mail = mail_alloc(ctx->t, MAIL_FETCH_FLAGS, 0);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen ctx->messages_count = client->messages_count;
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen /* if keyword list changed, send the new list before flag changes */
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen if (mailbox_get_status(ctx->box, STATUS_KEYWORDS, &status) == 0) {
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen if (client_save_keywords(&client->keywords, status.keywords))
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen client_send_mailbox_flags(client, box, status.keywords);
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen }
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen return ctx;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen}
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainenint imap_sync_deinit(struct imap_sync_context *ctx)
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen{
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen struct mailbox_status status;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen mail_free(&ctx->mail);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen if (mailbox_sync_deinit(&ctx->sync_ctx,
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen STATUS_MESSAGES | STATUS_RECENT, &status) < 0 ||
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen ctx->failed) {
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen mailbox_transaction_rollback(&ctx->t);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen i_free(ctx);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen return -1;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen }
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen mailbox_transaction_commit(&ctx->t, 0);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen t_push();
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen ctx->client->messages_count = status.messages;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen if (status.messages != ctx->messages_count) {
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen client_send_line(ctx->client,
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen t_strdup_printf("* %u EXISTS", status.messages));
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen }
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen if (status.recent != ctx->client->recent_count) {
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen ctx->client->recent_count = status.recent;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen client_send_line(ctx->client,
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen t_strdup_printf("* %u RECENT", status.recent));
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen }
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen t_pop();
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen i_free(ctx);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen return 0;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen}
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainenint imap_sync_more(struct imap_sync_context *ctx)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen{
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen enum mail_flags flags;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen const char *const *keywords;
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen string_t *str;
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen int ret = 1;
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen t_push();
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen str = t_str_new(256);
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen for (;;) {
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen if (ctx->seq == 0) {
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen /* get next one */
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen ret = mailbox_sync_next(ctx->sync_ctx,
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen &ctx->sync_rec);
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen if (ret <= 0) {
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen if (ret == 0) {
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen /* all finished ok */
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen ret = 1;
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen }
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen break;
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen }
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen }
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen if (ctx->sync_rec.seq2 > ctx->messages_count) {
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen /* don't send change notifications of messages we
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen haven't even announced to client yet */
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen if (ctx->sync_rec.seq1 > ctx->messages_count)
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen continue;
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen ctx->sync_rec.seq2 = ctx->messages_count;
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen }
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen switch (ctx->sync_rec.type) {
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen case MAILBOX_SYNC_TYPE_FLAGS:
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen case MAILBOX_SYNC_TYPE_KEYWORDS:
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen if (ctx->seq == 0)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen ctx->seq = ctx->sync_rec.seq1;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen ret = 1;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen for (; ctx->seq <= ctx->sync_rec.seq2; ctx->seq++) {
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen if (ret <= 0)
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen break;
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen if (mail_set_seq(ctx->mail, ctx->seq) < 0) {
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen t_pop();
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen return -1;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen }
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen flags = mail_get_flags(ctx->mail);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen keywords = mail_get_keywords(ctx->mail);
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen str_truncate(str, 0);
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen str_printfa(str, "* %u FETCH (", ctx->seq);
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen if (ctx->imap_flags & IMAP_SYNC_FLAG_SEND_UID) {
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen str_printfa(str, "UID %u ",
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen ctx->mail->uid);
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen }
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen str_append(str, "FLAGS (");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen imap_write_flags(str, flags, keywords);
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen str_append(str, "))");
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen ret = client_send_line(ctx->client, str_c(str));
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen }
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen break;
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen case MAILBOX_SYNC_TYPE_EXPUNGE:
d42c9a8f362b76740418c4f9f9441eb7fc661e57Timo Sirainen if (ctx->seq == 0)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen ctx->seq = ctx->sync_rec.seq2;
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen ret = 1;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen for (; ctx->seq >= ctx->sync_rec.seq1; ctx->seq--) {
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen if (ret <= 0)
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen break;
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen str_truncate(str, 0);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen str_printfa(str, "* %u EXPUNGE", ctx->seq);
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen ret = client_send_line(ctx->client, str_c(str));
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen }
d42c9a8f362b76740418c4f9f9441eb7fc661e57Timo Sirainen if (ctx->seq < ctx->sync_rec.seq1) {
d42c9a8f362b76740418c4f9f9441eb7fc661e57Timo Sirainen /* update only after we're finished, so that
d42c9a8f362b76740418c4f9f9441eb7fc661e57Timo Sirainen the seq2 > messages_count check above
d42c9a8f362b76740418c4f9f9441eb7fc661e57Timo Sirainen doesn't break */
d42c9a8f362b76740418c4f9f9441eb7fc661e57Timo Sirainen ctx->messages_count -=
d42c9a8f362b76740418c4f9f9441eb7fc661e57Timo Sirainen ctx->sync_rec.seq2 -
d42c9a8f362b76740418c4f9f9441eb7fc661e57Timo Sirainen ctx->sync_rec.seq1 + 1;
d42c9a8f362b76740418c4f9f9441eb7fc661e57Timo Sirainen }
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen break;
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen }
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen if (ret <= 0) {
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen /* failure / buffer full */
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen break;
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen }
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen ctx->seq = 0;
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen }
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen t_pop();
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen return ret;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen}
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainenint imap_sync_nonselected(struct mailbox *box, enum mailbox_sync_flags flags)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen{
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct mailbox_sync_context *ctx;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct mailbox_sync_rec sync_rec;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen ctx = mailbox_sync_init(box, flags);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen while (mailbox_sync_next(ctx, &sync_rec) > 0)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen ;
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen return mailbox_sync_deinit(&ctx, 0, NULL);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen}
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenstatic bool cmd_sync_continue(struct client_command_context *cmd)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen{
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen struct cmd_sync_context *ctx = cmd->context;
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen int ret;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen if ((ret = imap_sync_more(ctx->sync_ctx)) == 0)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen return FALSE;
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen if (ret < 0)
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen ctx->sync_ctx->failed = TRUE;
88286b0527bcc0711e312e9db65ca121a45213e3Timo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen if (imap_sync_deinit(ctx->sync_ctx) < 0) {
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen client_send_untagged_storage_error(cmd->client,
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen mailbox_get_storage(cmd->client->mailbox));
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen }
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen client_send_tagline(cmd, ctx->tagline);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen return TRUE;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen}
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenbool cmd_sync(struct client_command_context *cmd, enum mailbox_sync_flags flags,
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen enum imap_sync_flags imap_flags, const char *tagline)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen{
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct cmd_sync_context *ctx;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen if (cmd->client->mailbox == NULL) {
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen client_send_tagline(cmd, tagline);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen return TRUE;
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen }
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
294f1a51763015cda0e2d874c5027d6fe7a2cd54Timo Sirainen if ((client_workarounds & WORKAROUND_DELAY_NEWMAIL) != 0 &&
18634dae6e304bac982bb1e0ff1b6b88fc448dbcTimo Sirainen (flags & MAILBOX_SYNC_FLAG_FAST) != 0) {
18634dae6e304bac982bb1e0ff1b6b88fc448dbcTimo Sirainen /* expunges might break just as badly as new mail
18634dae6e304bac982bb1e0ff1b6b88fc448dbcTimo Sirainen notifications. besides, currently indexing code doesn't
18634dae6e304bac982bb1e0ff1b6b88fc448dbcTimo Sirainen handle expunges + no-newmail so this is required, unless
18634dae6e304bac982bb1e0ff1b6b88fc448dbcTimo Sirainen we did this only for no-expunges case.. */
18634dae6e304bac982bb1e0ff1b6b88fc448dbcTimo Sirainen flags |= MAILBOX_SYNC_FLAG_NO_NEWMAIL |
18634dae6e304bac982bb1e0ff1b6b88fc448dbcTimo Sirainen MAILBOX_SYNC_FLAG_NO_EXPUNGES;
18634dae6e304bac982bb1e0ff1b6b88fc448dbcTimo Sirainen }
294f1a51763015cda0e2d874c5027d6fe7a2cd54Timo Sirainen
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen ctx = p_new(cmd->pool, struct cmd_sync_context, 1);
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen ctx->tagline = p_strdup(cmd->pool, tagline);
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen ctx->sync_ctx = imap_sync_init(cmd->client, cmd->client->mailbox,
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen imap_flags, flags);
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen cmd->func = cmd_sync_continue;
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen cmd->context = ctx;
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen cmd->client->command_pending = TRUE;
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen return cmd_sync_continue(cmd);
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen}