]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Add imapc_mailbox.capabilities
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Sun, 23 Apr 2017 15:51:02 +0000 (18:51 +0300)
committerGitLab <gitlab@git.dovecot.net>
Mon, 24 Apr 2017 08:41:26 +0000 (11:41 +0300)
Use it instead of imapc_client_get_capabilities(). Simplifies the
following patch.

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

index eb21743de320cf6f252e98e3fccd7fafab10a67f..d151a2590953bcba986ac88b613842249832d5a0 100644 (file)
@@ -65,8 +65,6 @@ imapc_build_search_query_arg(struct imapc_mailbox *mbox,
                             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 @@ imapc_build_search_query_arg(struct imapc_mailbox *mbox,
                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 @@ imapc_build_search_query_arg(struct imapc_mailbox *mbox,
                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 @@ static bool imapc_build_search_query(struct imapc_mailbox *mbox,
                                     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;
        }
index b20e97cadd2723b9299514e743485168099d625d..a398baf1772c4b82226c0609145e8d62495ec54b 100644 (file)
@@ -77,11 +77,8 @@ bool imap_resp_text_code_parse(const char *str, enum mail_error *error_r)
 
 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_mailbox_open_callback(const struct imapc_command_reply *reply,
        imapc_client_stop(ctx->mbox->storage->client->client);
 }
 
-static void imapc_mailbox_get_extensions(struct imapc_mailbox *mbox)
+static void imapc_mailbox_get_capabilities(struct imapc_mailbox *mbox)
 {
-       enum imapc_capability capa =
-               imapc_client_get_capabilities(mbox->storage->client->client);
+       mbox->capabilities = imapc_client_get_capabilities(mbox->storage->client->client);
+}
 
+static void imapc_mailbox_get_extensions(struct imapc_mailbox *mbox)
+{
        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 @@ int imapc_mailbox_select(struct imapc_mailbox *mbox)
        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 @@ static int imapc_mailbox_run_status(struct mailbox *box,
        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 @@ static int imapc_mailbox_get_status(struct mailbox *box,
        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 @@ static int imapc_mailbox_get_metadata(struct mailbox *box,
                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 @@ static void imapc_notify_changes(struct mailbox *box)
        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 @@ static void imapc_notify_changes(struct mailbox *box)
                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
index acd4512e88cc1d9dcca6ed772bcd6a2f9ae987a6..8603e9eeb3b2555fa0a55654667aa2e43eb8cf6f 100644 (file)
@@ -91,6 +91,7 @@ struct imapc_mailbox {
        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;
index 7a31a9163cf31ffc628a84dab6a874bf2daa13b9..9fdf83fe39a775d1c023fbac29dcb12404be8b26 100644 (file)
@@ -165,13 +165,11 @@ imapc_sync_index_keyword(struct imapc_sync_context *ctx,
 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 int imapc_sync(struct imapc_mailbox *mbox)
 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