mail-namespace.h revision 7327394e30c1020b9a2a49c72a7e3d0f7803e680
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen#ifndef MAIL_NAMESPACE_H
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen#define MAIL_NAMESPACE_H
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen#include "mail-user.h"
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainenenum namespace_type {
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen NAMESPACE_PRIVATE,
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen NAMESPACE_SHARED,
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen NAMESPACE_PUBLIC
d22390f33eedbd2413debabc0662dde5241b1aa6Timo Sirainen};
d22390f33eedbd2413debabc0662dde5241b1aa6Timo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainenenum namespace_flags {
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen /* Namespace contains the INBOX mailbox (there can be only one) */
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen NAMESPACE_FLAG_INBOX = 0x01,
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen /* Namespace is visible only by explicitly using its full prefix */
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen NAMESPACE_FLAG_HIDDEN = 0x02,
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen /* Namespace prefix is visible with LIST */
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen NAMESPACE_FLAG_LIST_PREFIX = 0x04,
4edf90751f075cc6ab3d6f53fc78b656efa80922Timo Sirainen /* Namespace prefix isn't visible with LIST, but child mailboxes are */
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen NAMESPACE_FLAG_LIST_CHILDREN = 0x08,
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen /* Namespace uses its own subscriptions. */
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen NAMESPACE_FLAG_SUBSCRIPTIONS = 0x10,
72e9e7ad158101d46860b42c4080e894485c78c3Timo Sirainen
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen /* Namespace is created for internal use only. */
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen NAMESPACE_FLAG_INTERNAL = 0x1000,
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen /* Namespace was created automatically (for shared mailboxes) */
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen NAMESPACE_FLAG_AUTOCREATED = 0x2000,
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen /* Namespace has at least some usable mailboxes. Autocreated namespaces
72e9e7ad158101d46860b42c4080e894485c78c3Timo Sirainen that don't have usable mailboxes may be removed automatically. */
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen NAMESPACE_FLAG_USABLE = 0x4000
4823da41d112ff9f5e8f088b0e60d1636e01ff92Timo Sirainen};
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen
afa6ac39d1d6df246d4e7352288c2a0388276a24Timo Sirainenstruct mail_namespace {
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen /* Namespaces are sorted by their prefix length, "" comes first */
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen struct mail_namespace *next;
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen enum namespace_type type;
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen char sep, real_sep, sep_str[3];
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen enum namespace_flags flags;
72e9e7ad158101d46860b42c4080e894485c78c3Timo Sirainen
4823da41d112ff9f5e8f088b0e60d1636e01ff92Timo Sirainen char *prefix;
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen size_t prefix_len;
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen /* If non-NULL, this points to a namespace with identical mail location
4823da41d112ff9f5e8f088b0e60d1636e01ff92Timo Sirainen and it should be considered as the primary way to access the
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen mailboxes. This allows for example FTS plugin to avoid duplicating
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen indexes for same mailboxes when they're accessed via different
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen namespaces. */
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen struct mail_namespace *alias_for;
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen /* alias_for->alias_chain_next starts each chain. The chain goes
4823da41d112ff9f5e8f088b0e60d1636e01ff92Timo Sirainen through all namespaces that have the same alias_for. */
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen struct mail_namespace *alias_chain_next;
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen struct mail_user *user, *owner;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen struct mailbox_list *list;
4edf90751f075cc6ab3d6f53fc78b656efa80922Timo Sirainen /* FIXME: we should support multiple storages in one namespace */
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen struct mail_storage *storage;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen/* Called after namespaces has been created */
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenextern void (*hook_mail_namespaces_created)(struct mail_namespace *namespaces);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainenint mail_namespaces_init(struct mail_user *user);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_namespace *mail_namespaces_init_empty(struct mail_user *user);
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen/* Deinitialize all namespaces. mail_user_deinit() calls this automatically
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen for user's namespaces. */
4edf90751f075cc6ab3d6f53fc78b656efa80922Timo Sirainenvoid mail_namespaces_deinit(struct mail_namespace **namespaces);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen/* Destroy a single namespace and remove it from user's namespaces list. */
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainenvoid mail_namespace_destroy(struct mail_namespace *ns);
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen/* Update hierarchy separators in given name to real_sep characters. */
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainenconst char *mail_namespace_fix_sep(struct mail_namespace *ns, const char *name);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen/* Write virtual mailbox name to dest and return it. Separators are changed to
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen virtual ones and namespace prefix is inserted except for INBOX. */
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenconst char *mail_namespace_get_vname(struct mail_namespace *ns, string_t *dest,
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen const char *name);
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen/* Returns the hierarchy separator for mailboxes that are listed at root. */
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenchar mail_namespace_get_root_sep(const struct mail_namespace *namespaces)
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen ATTR_PURE;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen/* Returns namespace based on the mailbox name's prefix. Updates mailbox to
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen be a valid name inside the namespace (prefix is skipped, hierarchy separator
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen is changed to real_sep). If no namespaces were found, returns NULL. */
1171f0abf442638bac1827bb24a0b6b8eb682a82Timo Sirainenstruct mail_namespace *
4edf90751f075cc6ab3d6f53fc78b656efa80922Timo Sirainenmail_namespace_find(struct mail_namespace *namespaces, const char **mailbox);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Like above, but ignore hidden namespaces. */
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainenstruct mail_namespace *
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainenmail_namespace_find_visible(struct mail_namespace *namespaces,
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen const char **mailbox);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Like above, but find only from namespaces with subscriptions flag set. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_namespace *
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainenmail_namespace_find_subscribable(struct mail_namespace *namespaces,
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen const char **mailbox);
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen/* Like above, but find only from namespaces with subscriptions flag not set. */
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainenstruct mail_namespace *
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenmail_namespace_find_unsubscribable(struct mail_namespace *namespaces,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char **mailbox);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen/* Returns the INBOX namespace */
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenstruct mail_namespace *
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenmail_namespace_find_inbox(struct mail_namespace *namespaces);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen/* Returns TRUE if the given namespace matches the mailbox's prefix.
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen Updates mailbox name to be a valid name inside the namespace. */
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenbool mail_namespace_update_name(const struct mail_namespace *ns,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen const char **mailbox);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen/* Find a namespace with given prefix. */
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenstruct mail_namespace *
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenmail_namespace_find_prefix(struct mail_namespace *namespaces,
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen const char *prefix);
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen/* Like _find_prefix(), but ignore trailing separator */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_namespace *
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainenmail_namespace_find_prefix_nosep(struct mail_namespace *namespaces,
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen const char *prefix);
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen/* Called internally by mail_storage_create(). */
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainenvoid mail_namespace_init_storage(struct mail_namespace *ns);
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen#endif
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen