#ifndef MAILBOX_LIST_H
#define MAILBOX_LIST_H
#include "mail-types.h"
#include "mail-error.h"
#ifdef PATH_MAX
# define MAILBOX_LIST_NAME_MAX_LENGTH PATH_MAX
#else
# define MAILBOX_LIST_NAME_MAX_LENGTH 4096
#endif
enum namespace_type;
struct mail_namespace;
struct mail_storage;
struct mailbox_list;
struct mailbox_list_iterate_context;
enum mailbox_list_properties {
MAILBOX_LIST_PROP_NO_MAILDIR_NAME = 0x01,
MAILBOX_LIST_PROP_NO_ALT_DIR = 0x02,
MAILBOX_LIST_PROP_NO_NOSELECT = 0x04,
MAILBOX_LIST_PROP_NO_ROOT = 0x08
};
enum mailbox_list_flags {
MAILBOX_LIST_FLAG_MAILBOX_FILES = 0x01
};
enum mailbox_info_flags {
MAILBOX_NOSELECT = 0x001,
MAILBOX_NONEXISTENT = 0x002,
MAILBOX_CHILDREN = 0x004,
MAILBOX_NOCHILDREN = 0x008,
MAILBOX_NOINFERIORS = 0x010,
MAILBOX_MARKED = 0x020,
MAILBOX_UNMARKED = 0x040,
MAILBOX_SUBSCRIBED = 0x080,
MAILBOX_CHILD_SUBSCRIBED = 0x100,
MAILBOX_SELECT = 0x20000000,
MAILBOX_MATCHED = 0x40000000
};
enum mailbox_name_status {
MAILBOX_NAME_EXISTS_MAILBOX,
MAILBOX_NAME_EXISTS_DIR,
MAILBOX_NAME_VALID,
MAILBOX_NAME_INVALID,
MAILBOX_NAME_NOINFERIORS
};
enum mailbox_list_iter_flags {
MAILBOX_LIST_ITER_RAW_LIST = 0x000001,
MAILBOX_LIST_ITER_SHOW_EXISTING_PARENT = 0x000002,
MAILBOX_LIST_ITER_NO_AUTO_INBOX = 0x000004,
MAILBOX_LIST_ITER_SKIP_ALIASES = 0x000008,
MAILBOX_LIST_ITER_STAR_WITHIN_NS = 0x000010,
MAILBOX_LIST_ITER_SELECT_SUBSCRIBED = 0x000100,
MAILBOX_LIST_ITER_SELECT_RECURSIVEMATCH = 0x000200,
MAILBOX_LIST_ITER_RETURN_NO_FLAGS = 0x001000,
MAILBOX_LIST_ITER_RETURN_SUBSCRIBED = 0x002000,
MAILBOX_LIST_ITER_RETURN_CHILDREN = 0x004000
};
enum mailbox_list_path_type {
MAILBOX_LIST_PATH_TYPE_DIR,
MAILBOX_LIST_PATH_TYPE_ALT_DIR,
MAILBOX_LIST_PATH_TYPE_MAILBOX,
MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX,
MAILBOX_LIST_PATH_TYPE_CONTROL,
MAILBOX_LIST_PATH_TYPE_INDEX
};
enum mailbox_list_file_type {
MAILBOX_LIST_FILE_TYPE_UNKNOWN = 0,
MAILBOX_LIST_FILE_TYPE_FILE,
MAILBOX_LIST_FILE_TYPE_DIR,
MAILBOX_LIST_FILE_TYPE_SYMLINK,
MAILBOX_LIST_FILE_TYPE_OTHER
};
struct mailbox_list_settings {
const char *layout;
const char *root_dir;
const char *index_dir;
const char *control_dir;
const char *alt_dir;
const char *inbox_path;
const char *subscription_fname;
const char *maildir_name;
const char *mailbox_dir_name;
};
struct mailbox_info {
const char *name;
enum mailbox_info_flags flags;
struct mail_namespace *ns;
};
void mailbox_list_register_all(void);
void mailbox_list_register(const struct mailbox_list *list);
void mailbox_list_unregister(const struct mailbox_list *list);
const struct mailbox_list *
mailbox_list_find_class(const char *driver);
int mailbox_list_create(const char *driver, struct mail_namespace *ns,
const struct mailbox_list_settings *set,
enum mailbox_list_flags flags, const char **error_r);
void mailbox_list_destroy(struct mailbox_list **list);
const char *
mailbox_list_get_driver_name(const struct mailbox_list *list) ATTR_PURE;
enum mailbox_list_flags
mailbox_list_get_flags(const struct mailbox_list *list) ATTR_PURE;
struct mail_namespace *
mailbox_list_get_namespace(const struct mailbox_list *list) ATTR_PURE;
struct mail_user *
mailbox_list_get_user(const struct mailbox_list *list) ATTR_PURE;
int mailbox_list_get_storage(struct mailbox_list **list, const char **name,
struct mail_storage **storage_r);
void mailbox_list_get_closest_storage(struct mailbox_list *list,
struct mail_storage **storage);
void mailbox_list_get_permissions(struct mailbox_list *list,
const char *name,
mode_t *mode_r, gid_t *gid_r,
const char **gid_origin_r);
void mailbox_list_get_dir_permissions(struct mailbox_list *list,
const char *name,
mode_t *mode_r, gid_t *gid_r,
const char **gid_origin_r);
int mailbox_list_create_parent_dir(struct mailbox_list *list,
const char *mailbox, const char *path);
bool mailbox_list_is_valid_pattern(struct mailbox_list *list,
const char *pattern);
bool mailbox_list_is_valid_existing_name(struct mailbox_list *list,
const char *name);
bool mailbox_list_is_valid_create_name(struct mailbox_list *list,
const char *name);
const char *mailbox_list_get_path(struct mailbox_list *list, const char *name,
enum mailbox_list_path_type type);
int mailbox_list_get_mailbox_name_status(struct mailbox_list *list,
const char *name,
enum mailbox_name_status *status);
struct mailbox_log *mailbox_list_get_changelog(struct mailbox_list *list);
void mailbox_list_set_changelog_timestamp(struct mailbox_list *list,
time_t stamp);
const char *mailbox_list_get_temp_prefix(struct mailbox_list *list);
const char *mailbox_list_get_global_temp_prefix(struct mailbox_list *list);
const char *mailbox_list_join_refpattern(struct mailbox_list *list,
const char *ref, const char *pattern);
struct mailbox_list_iterate_context *
mailbox_list_iter_init(struct mailbox_list *list, const char *pattern,
enum mailbox_list_iter_flags flags);
struct mailbox_list_iterate_context *
mailbox_list_iter_init_multiple(struct mailbox_list *list,
const char *const *patterns,
enum mailbox_list_iter_flags flags);
struct mailbox_list_iterate_context *
mailbox_list_iter_init_namespaces(struct mail_namespace *namespaces,
const char *const *patterns,
enum namespace_type type_mask,
enum mailbox_list_iter_flags flags);
const struct mailbox_info *
mailbox_list_iter_next(struct mailbox_list_iterate_context *ctx);
int mailbox_list_iter_deinit(struct mailbox_list_iterate_context **ctx);
int mailbox_list_mailbox(struct mailbox_list *list, const char *name,
enum mailbox_info_flags *flags_r);
int mailbox_list_set_subscribed(struct mailbox_list *list,
const char *name, bool set);
int mailbox_list_create_dir(struct mailbox_list *list, const char *name);
int mailbox_list_delete_dir(struct mailbox_list *list, const char *name);
const char *mailbox_list_get_last_error(struct mailbox_list *list,
enum mail_error *error_r);
#endif