#ifndef QUOTA_PRIVATE_H
#define QUOTA_PRIVATE_H
#include "mail-storage-private.h"
#include "mail-namespace.h"
#include "quota.h"
/* Modules should use do "my_id = quota_module_id++" and
use quota_module_contexts[id] for their own purposes. */
extern unsigned int quota_module_id;
struct quota {
};
struct quota_settings {
const char **error_r);
const char *quota_exceeded_msg;
};
struct quota_rule {
const char *mailbox_mask;
/* relative to default_rule */
/* Don't include this mailbox in quota */
};
struct quota_warning_rule {
const char *command;
};
struct quota_backend_vfuncs {
const char **error_r);
struct quota_rule *rule,
/* called once for each namespace */
struct mail_namespace *ns);
/* Backends return success as QUOTA_GET_RESULT_LIMITED, and returning
QUOTA_GET_RESULT_UNLIMITED is prohibited by quota_get_resource(),
which is the only caller of this vfunc. */
const char *name,
const char **error_r);
struct quota_transaction_context *ctx,
const char **error_r);
};
struct quota_backend {
/* quota backends equal if backend1.name == backend2.name */
const char *name;
struct quota_backend_vfuncs v;
};
struct quota_root_settings {
/* Unique quota root name. */
const char *name;
/* Name in settings, e.g. "quota", "quota2", .. */
const char *set_name;
const char *args;
const char *limit_set;
/* If user is under quota before saving a mail, allow the last mail to
bring the user over quota by this many bytes. */
/* Limits in default_rule override backend's quota limits */
/* TRUE if any of the warning_rules have reverse==TRUE */
};
struct quota_root {
/* this quota root applies only to this namespace. it may also be
a public namespace without an owner. */
/* this is set in quota init(), because namespaces aren't known yet.
when accessing shared users the ns_prefix may be non-NULL but
ns=NULL, so when checking if quota root applies only to a specific
namespace use the ns_prefix!=NULL check. */
const char *ns_prefix;
/* initially the same as set->default_rule.*_limit, but some backends
may change these by reading the limits elsewhere (e.g. Maildir++,
FS quota) */
/* Module-specific contexts. See quota_module_id. */
/* don't enforce quota when saving */
/* quota is automatically updated. update() should be called but the
bytes won't be changed. count is still changed, because it's cheap
to do and it's internally used to figure out whether there have
been some changes and that quota_warnings should be checked. */
/* If user has unlimited quota, disable quota tracking */
/* Set while quota is being recalculated to avoid recursion. */
/* Quota root is hidden (to e.g. IMAP GETQUOTAROOT) */
/* Did we already check quota_over_flag correctness? */
};
struct quota_transaction_context {
(set once, not updated by bytes_used/count_used).
if last_mail_max_extra_bytes>0, the bytes_ceil is initially
increased by that much, while bytes_ceil2 contains the real ceiling.
after the first allocation is done, bytes_ceil is set to
bytes_ceil2. */
only once and not updated by bytes_used/count_used. (Either *_ceil
or *_over is always zero.) */
/* TRUE if all roots have auto_updating=TRUE */
/* Quota doesn't need to be updated within this transaction. */
};
/* Register storage to all user's quota roots. */
const char **error_r);
struct mail_namespace *ns);
struct quota_rule *
/* Returns 1 if values were returned successfully, 0 if we're recursing into
the same function, -1 if error. */
bool quota_warning_match(const struct quota_warning_rule *w,
const char **reason_r);
enum quota_get_result *error_result_r,
const char **error_r);
#endif