imap-sync.c revision 6384258c2f84e635d8ceffc3eeddad71f7538040
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore /* if multiple commands are in progress, we may need to wait for them
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore to finish before syncing mailbox. */
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore ARRAY_TYPE(seq_range) search_adds, search_removes;
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amorestatic void uids_to_seqs(struct mailbox *box, ARRAY_TYPE(seq_range) *uids)
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore unsigned int i, count;
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore for (i = 0; i < count; i++) {
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore mailbox_get_seq_range(box, range[i].seq1, range[i].seq2,
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore /* since we have to notify about expunged messages,
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore we expect that all the referenced UIDs exist */
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore i_assert(seq2 - seq1 == range[i].seq2 - range[i].seq1);
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore seq_range_array_add_range(&seqs, seq1, seq2);
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore /* replace uids with seqs */
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amoreimap_sync_send_search_update(struct imap_sync_context *ctx,
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore mailbox_search_result_sync(update->result, &ctx->search_removes,
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore imap_quote_append_string(cmd, update->tag, FALSE);
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore /* convert to sequences */
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore uids_to_seqs(ctx->client->mailbox, &ctx->search_removes);
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore uids_to_seqs(ctx->client->mailbox, &ctx->search_adds);
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore if (array_count(&ctx->search_removes) != 0) {
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore imap_write_seq_range(cmd, &ctx->search_removes);
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore imap_write_seq_range(cmd, &ctx->search_adds);
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore o_stream_send(ctx->client->output, str_data(cmd), str_len(cmd));
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amorestatic void imap_sync_send_search_updates(struct imap_sync_context *ctx)
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore unsigned int i, count;
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore if (!array_is_created(&ctx->client->search_updates))
bbb1277b6ec1b0daad4e3ed1a2b891d3e2ece2ebGarrett D'Amore if (!array_is_created(&ctx->search_removes)) {
} T_END;
struct imap_sync_context *
return ctx;
if (send_modseq == 0) {
(unsigned long long)send_modseq,
(unsigned long long)send_modseq));
int ret;
return ret;
const char *const *keywords;
MAILBOX_FEATURE_CONDSTORE) != 0) {
unsigned int i, count;
if (count == 0)
for (i = 0; i < count; i++) {
if (start_uid != 0) {
if (!comma)
prev_uid);
if (!comma)
case MAILBOX_SYNC_TYPE_FLAGS:
if (ret <= 0)
if (ret <= 0)
case MAILBOX_SYNC_TYPE_MODSEQ:
MAILBOX_FEATURE_CONDSTORE) == 0)
if (ret <= 0)
if (ret <= 0) {
return ret;
return TRUE;
int ret;
return FALSE;
if (ret < 0)
*flags_r = 0;
*imap_flags_r = 0;
fast_count++;
count++;
MAILBOX_SYNC_FLAG_FIX_INCONSISTENT)) == 0);
bool no_newmail;
if (no_newmail) {
return FALSE;
return TRUE;
return TRUE;
return TRUE;
return FALSE;
return FALSE;
return ret;
return FALSE;