Mercurial > dovecot > core-2.2
changeset 21974:b33e28d1e471
imapc: Add imapc_mailbox.capabilities
Use it instead of imapc_client_get_capabilities(). Simplifies the
following patch.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sun, 23 Apr 2017 18:51:02 +0300 |
parents | 67b7d931e8a8 |
children | b523b154523e |
files | src/lib-storage/index/imapc/imapc-search.c src/lib-storage/index/imapc/imapc-storage.c src/lib-storage/index/imapc/imapc-storage.h src/lib-storage/index/imapc/imapc-sync.c |
diffstat | 4 files changed, 23 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/imapc/imapc-search.c Sun Apr 23 18:57:15 2017 +0300 +++ b/src/lib-storage/index/imapc/imapc-search.c Sun Apr 23 18:51:02 2017 +0300 @@ -65,8 +65,6 @@ const struct mail_search_arg *arg, string_t *str) { - enum imapc_capability capa = - imapc_client_get_capabilities(mbox->storage->client->client); struct mail_search_arg arg2 = *arg; const char *error; @@ -100,7 +98,7 @@ return TRUE; case SEARCH_BEFORE: case SEARCH_SINCE: - if ((capa & IMAPC_CAPABILITY_WITHIN) == 0) { + if ((mbox->capabilities & IMAPC_CAPABILITY_WITHIN) == 0) { /* a bit kludgy way to check this.. */ size_t pos = str_len(str); if (!mail_search_arg_to_imap(str, arg, &error)) @@ -126,7 +124,7 @@ return mail_search_arg_to_imap(str, arg, &error); /* extensions */ case SEARCH_MODSEQ: - if ((capa & IMAPC_CAPABILITY_CONDSTORE) == 0) + if ((mbox->capabilities & IMAPC_CAPABILITY_CONDSTORE) == 0) return FALSE; return mail_search_arg_to_imap(str, arg, &error); case SEARCH_INTHREAD: @@ -164,15 +162,13 @@ const struct mail_search_args *args, const char **query_r) { - enum imapc_capability capa = - imapc_client_get_capabilities(mbox->storage->client->client); string_t *str = t_str_new(128); if (!IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_SEARCH)) { /* SEARCH command passthrough not enabled */ return FALSE; } - if ((capa & IMAPC_CAPABILITY_ESEARCH) == 0) { + if ((mbox->capabilities & IMAPC_CAPABILITY_ESEARCH) == 0) { /* FIXME: not supported for now */ return FALSE; }
--- a/src/lib-storage/index/imapc/imapc-storage.c Sun Apr 23 18:57:15 2017 +0300 +++ b/src/lib-storage/index/imapc/imapc-storage.c Sun Apr 23 18:51:02 2017 +0300 @@ -77,11 +77,8 @@ bool imapc_mailbox_has_modseqs(struct imapc_mailbox *mbox) { - enum imapc_capability capa = - imapc_client_get_capabilities(mbox->storage->client->client); - - return (capa & (IMAPC_CAPABILITY_CONDSTORE | - IMAPC_CAPABILITY_QRESYNC)) != 0 && + return (mbox->capabilities & (IMAPC_CAPABILITY_CONDSTORE | + IMAPC_CAPABILITY_QRESYNC)) != 0 && IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_MODSEQ); } @@ -606,14 +603,16 @@ imapc_client_stop(ctx->mbox->storage->client->client); } +static void imapc_mailbox_get_capabilities(struct imapc_mailbox *mbox) +{ + mbox->capabilities = imapc_client_get_capabilities(mbox->storage->client->client); +} + static void imapc_mailbox_get_extensions(struct imapc_mailbox *mbox) { - enum imapc_capability capa = - imapc_client_get_capabilities(mbox->storage->client->client); - if (mbox->guid_fetch_field_name == NULL) { /* see if we can get message GUIDs somehow */ - if ((capa & IMAPC_CAPABILITY_X_GM_EXT_1) != 0) { + if ((mbox->capabilities & IMAPC_CAPABILITY_X_GM_EXT_1) != 0) { /* GMail */ mbox->guid_fetch_field_name = "X-GM-MSGID"; } @@ -631,6 +630,7 @@ if (mbox->storage->client->auth_failed) { return -1; } + imapc_mailbox_get_capabilities(mbox); if (imapc_mailbox_has_modseqs(mbox)) { if (!array_is_created(&mbox->rseq_modseqs)) @@ -898,6 +898,8 @@ struct imapc_simple_context sctx; string_t *str; + imapc_mailbox_get_capabilities(mbox); + str = t_str_new(256); if ((items & STATUS_MESSAGES) != 0) str_append(str, " MESSAGES"); @@ -968,17 +970,17 @@ return 0; } -static int imapc_mailbox_get_namespaces(struct imapc_storage *storage) +static int imapc_mailbox_get_namespaces(struct imapc_mailbox *mbox) { - enum imapc_capability capa; + struct imapc_storage *storage = mbox->storage; struct imapc_command *cmd; struct imapc_simple_context sctx; if (storage->namespaces_requested) return 0; - capa = imapc_client_get_capabilities(storage->client->client); - if ((capa & IMAPC_CAPABILITY_NAMESPACE) == 0) { + imapc_mailbox_get_capabilities(mbox); + if ((mbox->capabilities & IMAPC_CAPABILITY_NAMESPACE) == 0) { /* NAMESPACE capability not supported */ return 0; } @@ -1028,7 +1030,7 @@ items &= ~MAILBOX_METADATA_GUID; } if ((items & MAILBOX_METADATA_BACKEND_NAMESPACE) != 0) { - if (imapc_mailbox_get_namespaces(mbox->storage) < 0) + if (imapc_mailbox_get_namespaces(mbox) < 0) return -1; ns = imapc_namespace_find_mailbox(mbox->storage, box->name); @@ -1088,7 +1090,6 @@ struct imapc_mailbox *mbox = (struct imapc_mailbox *)box; const struct mail_storage_settings *set = box->storage->set; struct imapc_command *cmd; - enum imapc_capability capa; if (box->notify_callback == NULL) { if (mbox->to_idle_check != NULL) @@ -1096,8 +1097,7 @@ return; } - capa = imapc_client_get_capabilities(mbox->storage->client->client); - if ((capa & IMAPC_CAPABILITY_IDLE) != 0) { + if ((mbox->capabilities & IMAPC_CAPABILITY_IDLE) != 0) { /* remote server is already in IDLE. but since some servers don't notice changes immediately, we'll force them to check here by sending a NOOP. this helps with clients that break
--- a/src/lib-storage/index/imapc/imapc-storage.h Sun Apr 23 18:57:15 2017 +0300 +++ b/src/lib-storage/index/imapc/imapc-storage.h Sun Apr 23 18:51:02 2017 +0300 @@ -91,6 +91,7 @@ struct mailbox box; struct imapc_storage *storage; struct imapc_client_mailbox *client_box; + enum imapc_capability capabilities; struct mail_index_transaction *delayed_sync_trans; struct mail_index_view *sync_view, *delayed_sync_view;
--- a/src/lib-storage/index/imapc/imapc-sync.c Sun Apr 23 18:57:15 2017 +0300 +++ b/src/lib-storage/index/imapc/imapc-sync.c Sun Apr 23 18:51:02 2017 +0300 @@ -165,13 +165,11 @@ static void imapc_sync_expunge_finish(struct imapc_sync_context *ctx) { string_t *str; - enum imapc_capability caps; if (array_count(&ctx->expunged_uids) == 0) return; - caps = imapc_client_get_capabilities(ctx->mbox->storage->client->client); - if ((caps & IMAPC_CAPABILITY_UIDPLUS) == 0) { + if ((ctx->mbox->capabilities & IMAPC_CAPABILITY_UIDPLUS) == 0) { /* just expunge everything */ imapc_sync_cmd(ctx, "EXPUNGE"); return; @@ -547,13 +545,10 @@ static void imapc_noop_if_needed(struct imapc_mailbox *mbox, enum mailbox_sync_flags flags) { - enum imapc_capability capabilities; - - capabilities = imapc_client_get_capabilities(mbox->storage->client->client); if (!mbox->initial_sync_done) { /* we just SELECTed/EXAMINEd the mailbox, don't do another NOOP. */ - } else if ((capabilities & IMAPC_CAPABILITY_IDLE) == 0 || + } else if ((mbox->capabilities & IMAPC_CAPABILITY_IDLE) == 0 || (flags & MAILBOX_SYNC_FLAG_FULL_READ) != 0) { /* do NOOP to make sure we have the latest changes before starting sync. this is necessary either because se don't