# HG changeset patch # User Timo Sirainen # Date 1182960650 -10800 # Node ID 45735dd11f1767b6a150dd4f8471625b76454b50 # Parent ec09ad1d017fb2957c059767a33f1dd7f910bdd9 Moved several namespace booleans to a flags field. Removed unused subscriptions boolean. diff -r ec09ad1d017f -r 45735dd11f17 src/imap/cmd-list.c --- a/src/imap/cmd-list.c Wed Jun 27 17:00:32 2007 +0300 +++ b/src/imap/cmd-list.c Wed Jun 27 19:10:50 2007 +0300 @@ -95,7 +95,8 @@ { const char *str; - if (!ctx->inbox_found && ctx->ns->inbox && ctx->match_inbox && + if (!ctx->inbox_found && ctx->match_inbox && + (ctx->ns->flags & NAMESPACE_FLAG_INBOX) != 0 && (ctx->list_flags & MAILBOX_LIST_ITER_SUBSCRIBED) == 0) { /* INBOX always exists */ str = t_strdup_printf("* LIST (\\Unmarked) \"%s\" \"INBOX\"", @@ -110,7 +111,7 @@ { if (strcasecmp(info->name, "INBOX") != 0) { /* non-INBOX always has prefix */ - } else if (!ctx->ns->inbox) { + } else if ((ctx->ns->flags & NAMESPACE_FLAG_INBOX) == 0) { /* INBOX from non-INBOX namespace. */ if (*ctx->ns->prefix == '\0') { /* no namespace prefix, we can't list this */ @@ -172,7 +173,7 @@ continue; } if (strcasecmp(name, "INBOX") == 0) { - if (!ctx->ns->inbox) + if ((ctx->ns->flags & NAMESPACE_FLAG_INBOX) == 0) continue; name = "INBOX"; @@ -303,7 +304,8 @@ { struct imap_match_glob *inbox_glob; - if (*ctx->ns->prefix != '\0' && !ctx->ns->inbox) + if (*ctx->ns->prefix != '\0' && + (ctx->ns->flags & NAMESPACE_FLAG_INBOX) == 0) return IMAP_MATCH_NO; /* if the original reference and mask combined produces something @@ -391,14 +393,15 @@ /* hidden and non-listable namespaces should still be seen without wildcards. */ - match = (!ns->list_prefix && + match = ((ns->flags & NAMESPACE_FLAG_LIST) == 0 && list_mask_has_wildcards(cur_mask)) ? IMAP_MATCH_NO : imap_match(ctx->glob, cur_ns_prefix); if (match < 0) return; len = strlen(ns->prefix); - if (match == IMAP_MATCH_YES && ctx->ns->list_prefix && + if (match == IMAP_MATCH_YES && + (ctx->ns->flags & NAMESPACE_FLAG_LIST) != 0 && (ctx->list_flags & MAILBOX_LIST_ITER_SUBSCRIBED) == 0 && (!ctx->match_inbox || strncmp(ns->prefix, "INBOX", len-1) != 0)) { diff -r ec09ad1d017f -r 45735dd11f17 src/imap/cmd-namespace.c --- a/src/imap/cmd-namespace.c Wed Jun 27 17:00:32 2007 +0300 +++ b/src/imap/cmd-namespace.c Wed Jun 27 19:10:50 2007 +0300 @@ -12,7 +12,8 @@ bool found = FALSE; while (ns != NULL) { - if (ns->type == type && !ns->hidden) { + if (ns->type == type && + (ns->flags & NAMESPACE_FLAG_HIDDEN) == 0) { if (!found) { str_append_c(str, '('); found = TRUE; diff -r ec09ad1d017f -r 45735dd11f17 src/lib-storage/list/mailbox-list-fs-iter.c --- a/src/lib-storage/list/mailbox-list-fs-iter.c Wed Jun 27 17:00:32 2007 +0300 +++ b/src/lib-storage/list/mailbox-list-fs-iter.c Wed Jun 27 19:10:50 2007 +0300 @@ -264,7 +264,8 @@ /* make sure we give only one correct INBOX */ real_path = t_strconcat(ctx->dir->real_path, "/", fname, NULL); - if (ctx->ctx.list->ns->inbox && strcasecmp(list_path, "INBOX") == 0) { + if ((ctx->ctx.list->ns->flags & NAMESPACE_FLAG_INBOX) != 0 && + strcasecmp(list_path, "INBOX") == 0) { if (ctx->inbox_listed) { /* already listed the INBOX */ return 0; @@ -424,7 +425,8 @@ list_dir_context_free(dir); } - if (!ctx->inbox_found && ctx->ctx.list->ns->inbox && + if (!ctx->inbox_found && + (ctx->ctx.list->ns->flags & NAMESPACE_FLAG_INBOX) != 0 && ctx->glob != NULL && imap_match(ctx->glob, "INBOX") > 0) { /* show inbox */ ctx->inbox_listed = TRUE; diff -r ec09ad1d017f -r 45735dd11f17 src/lib-storage/list/mailbox-list-maildir-iter.c --- a/src/lib-storage/list/mailbox-list-maildir-iter.c Wed Jun 27 17:00:32 2007 +0300 +++ b/src/lib-storage/list/mailbox-list-maildir-iter.c Wed Jun 27 19:10:50 2007 +0300 @@ -160,7 +160,7 @@ return -1; } - if (ctx->ctx.list->ns->inbox && + if ((ctx->ctx.list->ns->flags & NAMESPACE_FLAG_INBOX) != 0 && (ctx->ctx.flags & MAILBOX_LIST_ITER_SUBSCRIBED) == 0) { /* make sure INBOX is there */ node = mailbox_tree_get(ctx->tree_ctx, "INBOX", &created); diff -r ec09ad1d017f -r 45735dd11f17 src/lib-storage/mail-namespace.c --- a/src/lib-storage/mail-namespace.c Wed Jun 27 17:00:32 2007 +0300 +++ b/src/lib-storage/mail-namespace.c Wed Jun 27 19:10:50 2007 +0300 @@ -30,20 +30,20 @@ enum file_lock_method lock_method) { struct mail_namespace *ns; - const char *sep, *type, *prefix; + const char *sep, *type, *prefix; ns = p_new(pool, struct mail_namespace, 1); sep = getenv(t_strdup_printf("NAMESPACE_%u_SEP", num)); type = getenv(t_strdup_printf("NAMESPACE_%u_TYPE", num)); prefix = getenv(t_strdup_printf("NAMESPACE_%u_PREFIX", num)); - ns->inbox = getenv(t_strdup_printf("NAMESPACE_%u_INBOX", num)) != NULL; - ns->hidden = getenv(t_strdup_printf("NAMESPACE_%u_HIDDEN", - num)) != NULL; - ns->list_prefix = !ns->hidden && *prefix != '\0' && - getenv(t_strdup_printf("NAMESPACE_%u_LIST", num)) != NULL; - ns->subscriptions = getenv(t_strdup_printf("NAMESPACE_%u_SUBSCRIPTIONS", - num)) != NULL; + if (getenv(t_strdup_printf("NAMESPACE_%u_INBOX", num)) != NULL) + ns->flags |= NAMESPACE_FLAG_INBOX; + if (getenv(t_strdup_printf("NAMESPACE_%u_HIDDEN", num)) != NULL) + ns->flags |= NAMESPACE_FLAG_HIDDEN; + if ((ns->flags & NAMESPACE_FLAG_HIDDEN) == 0 && *prefix != '\0' && + getenv(t_strdup_printf("NAMESPACE_%u_LIST", num)) != NULL) + ns->flags |= NAMESPACE_FLAG_LIST; if (type == NULL || *type == '\0' || strncmp(type, "private", 7) == 0) ns->type = NAMESPACE_PRIVATE; @@ -61,12 +61,11 @@ if ((flags & MAIL_STORAGE_FLAG_DEBUG) != 0) { i_info("Namespace: type=%s, prefix=%s, sep=%s, " - "inbox=%s, hidden=%s, list=%s, subscriptions=%s", + "inbox=%s, hidden=%s, list=%s", type == NULL ? "" : type, prefix, sep == NULL ? "" : sep, - ns->inbox ? "yes" : "no", - ns->hidden ? "yes" : "no", - ns->list ? "yes" : "no", - ns->subscriptions ? "yes" : "no"); + (ns->flags & NAMESPACE_FLAG_INBOX) ? "yes" : "no", + (ns->flags & NAMESPACE_FLAG_HIDDEN) ? "yes" : "no", + (ns->flags & NAMESPACE_FLAG_LIST) ? "yes" : "no"); } ns->prefix = p_strdup(pool, prefix); @@ -89,7 +88,7 @@ char list_sep = '\0'; for (ns = namespaces; ns != NULL; ns = ns->next) { - if (ns->inbox) { + if ((ns->flags & NAMESPACE_FLAG_INBOX) != 0) { if (inbox_ns != NULL) { i_error("namespace configuration error: " "There can be only one namespace with " @@ -102,14 +101,14 @@ private_ns = ns; private_ns_count++; } - if (ns->list_prefix && + if ((ns->flags & NAMESPACE_FLAG_LIST) != 0 && ns->prefix[strlen(ns->prefix)-1] != ns->sep) { i_error("namespace configuration error: " "list=yes requires prefix=%s " "to end with separator", ns->prefix); return FALSE; } - if (ns->list_prefix) { + if ((ns->flags & NAMESPACE_FLAG_LIST) != 0) { if (list_sep == '\0') list_sep = ns->sep; else if (list_sep != ns->sep) { @@ -125,7 +124,7 @@ if (private_ns_count == 1) { /* just one private namespace. we'll assume it's the INBOX namespace. */ - private_ns->inbox = TRUE; + private_ns->flags |= NAMESPACE_FLAG_INBOX; } else { i_error("namespace configuration error: " "inbox=yes namespace missing"); @@ -209,8 +208,7 @@ ns = p_new(pool, struct mail_namespace, 1); ns->type = NAMESPACE_PRIVATE; - ns->inbox = TRUE; - ns->subscriptions = TRUE; + ns->flags = NAMESPACE_FLAG_INBOX | NAMESPACE_FLAG_LIST; ns->prefix = ""; if (mail_storage_create(ns, NULL, mail, user, flags, lock_method) < 0) { @@ -239,7 +237,7 @@ ns = p_new(pool, struct mail_namespace, 1); ns->prefix = ""; - ns->inbox = TRUE; + ns->flags = NAMESPACE_FLAG_INBOX | NAMESPACE_FLAG_LIST; return ns; } @@ -272,7 +270,7 @@ char mail_namespace_get_root_sep(struct mail_namespace *namespaces) { - while (!namespaces->list_prefix) + while ((namespaces->flags & NAMESPACE_FLAG_LIST) == 0) namespaces = namespaces->next; return namespaces->sep; } @@ -282,7 +280,7 @@ bool show_hidden) { #define CHECK_VISIBILITY(ns, show_hidden) \ - ((!(ns)->hidden) || (show_hidden)) + (((ns)->flags & NAMESPACE_FLAG_HIDDEN) == 0 || (show_hidden)) struct mail_namespace *ns = namespaces; const char *box = *mailbox; struct mail_namespace *best = NULL; @@ -294,7 +292,8 @@ /* find the INBOX namespace */ *mailbox = "INBOX"; while (ns != NULL) { - if (ns->inbox && CHECK_VISIBILITY(ns, show_hidden)) + if ((ns->flags & NAMESPACE_FLAG_INBOX) != 0 && + CHECK_VISIBILITY(ns, show_hidden)) return ns; if (*ns->prefix == '\0') best = ns; diff -r ec09ad1d017f -r 45735dd11f17 src/lib-storage/mail-namespace.h --- a/src/lib-storage/mail-namespace.h Wed Jun 27 17:00:32 2007 +0300 +++ b/src/lib-storage/mail-namespace.h Wed Jun 27 19:10:50 2007 +0300 @@ -7,17 +7,26 @@ NAMESPACE_PUBLIC }; +enum namespace_flags { + /* Namespace contains the INBOX mailbox (there can be only one) */ + NAMESPACE_FLAG_INBOX = 0x01, + /* Namespace is visible only by explicitly using its full prefix */ + NAMESPACE_FLAG_HIDDEN = 0x02, + /* Namespace is visible with LIST */ + NAMESPACE_FLAG_LIST = 0x04 +}; + struct mail_namespace { /* Namespaces are sorted by their prefix length, "" comes first */ struct mail_namespace *next; enum namespace_type type; char sep, real_sep, sep_str[3]; + enum namespace_flags flags; const char *prefix; size_t prefix_len; - bool inbox, hidden, list_prefix, subscriptions; struct mailbox_list *list; /* FIXME: we should support multiple storages in one namespace */ struct mail_storage *storage;