}
static int
-index_storage_get_dict(struct mailbox *box, enum mail_attribute_type type,
+index_storage_get_dict(struct mailbox *box, enum mail_attribute_type type_flags,
struct dict **dict_r, const char **mailbox_prefix_r)
{
+ enum mail_attribute_type type = type_flags & MAIL_ATTRIBUTE_TYPE_MASK;
struct mail_storage *storage = box->storage;
struct mail_namespace *ns;
struct mailbox_metadata metadata;
}
static const char *
-key_get_prefixed(enum mail_attribute_type type, const char *mailbox_prefix,
+key_get_prefixed(enum mail_attribute_type type_flags, const char *mailbox_prefix,
const char *key)
{
+ enum mail_attribute_type type = type_flags & MAIL_ATTRIBUTE_TYPE_MASK;
+
switch (type) {
case MAIL_ATTRIBUTE_TYPE_PRIVATE:
return t_strconcat(DICT_PATH_PRIVATE, mailbox_prefix, "/",
static int
index_storage_attribute_get_dict_trans(struct mailbox_transaction_context *t,
- enum mail_attribute_type type,
+ enum mail_attribute_type type_flags,
struct dict_transaction_context **dtrans_r,
const char **mailbox_prefix_r)
{
+ enum mail_attribute_type type = type_flags & MAIL_ATTRIBUTE_TYPE_MASK;
struct dict_transaction_context **dtransp = NULL;
struct dict *dict;
struct mailbox_metadata metadata;
return 0;
}
- if (index_storage_get_dict(t->box, type, &dict, mailbox_prefix_r) < 0)
+ if (index_storage_get_dict(t->box, type_flags, &dict, mailbox_prefix_r) < 0)
return -1;
*dtransp = *dtrans_r = dict_transaction_begin(dict);
return 0;
}
int index_storage_attribute_set(struct mailbox_transaction_context *t,
- enum mail_attribute_type type, const char *key,
+ enum mail_attribute_type type_flags,
+ const char *key,
const struct mail_attribute_value *value)
{
+ enum mail_attribute_type type = type_flags & MAIL_ATTRIBUTE_TYPE_MASK;
struct dict_transaction_context *dtrans;
const char *mailbox_prefix;
bool pvt = type == MAIL_ATTRIBUTE_TYPE_PRIVATE;
time_t ts = value->last_change != 0 ? value->last_change : ioloop_time;
int ret = 0;
- if (index_storage_attribute_get_dict_trans(t, type, &dtrans,
+ if (index_storage_attribute_get_dict_trans(t, type_flags, &dtrans,
&mailbox_prefix) < 0)
return -1;
T_BEGIN {
const char *prefixed_key =
- key_get_prefixed(type, mailbox_prefix, key);
+ key_get_prefixed(type_flags, mailbox_prefix, key);
const char *value_str;
if (mailbox_attribute_value_to_string(t->box->storage, value,
}
int index_storage_attribute_get(struct mailbox *box,
- enum mail_attribute_type type, const char *key,
+ enum mail_attribute_type type_flags,
+ const char *key,
struct mail_attribute_value *value_r)
{
struct dict *dict;
i_zero(value_r);
- if (index_storage_get_dict(box, type, &dict, &mailbox_prefix) < 0)
+ if (index_storage_get_dict(box, type_flags, &dict, &mailbox_prefix) < 0)
return -1;
ret = dict_lookup(dict, pool_datastack_create(),
- key_get_prefixed(type, mailbox_prefix, key),
+ key_get_prefixed(type_flags, mailbox_prefix, key),
&value_r->value, &error);
if (ret < 0) {
mailbox_set_critical(box,
struct mailbox_attribute_iter *
index_storage_attribute_iter_init(struct mailbox *box,
- enum mail_attribute_type type,
+ enum mail_attribute_type type_flags,
const char *prefix)
{
struct index_storage_attribute_iter *iter;
iter = i_new(struct index_storage_attribute_iter, 1);
iter->iter.box = box;
- if (index_storage_get_dict(box, type, &dict, &mailbox_prefix) < 0) {
+ if (index_storage_get_dict(box, type_flags, &dict, &mailbox_prefix) < 0) {
if (mailbox_get_last_mail_error(box) == MAIL_ERROR_NOTPOSSIBLE)
iter->dict_disabled = TRUE;
} else {
- iter->prefix = i_strdup(key_get_prefixed(type, mailbox_prefix,
+ iter->prefix = i_strdup(key_get_prefixed(type_flags, mailbox_prefix,
prefix));
iter->prefix_len = strlen(iter->prefix);
iter->diter = dict_iterate_init(dict, iter->prefix,
struct mailbox_metadata *metadata_r);
int index_storage_attribute_set(struct mailbox_transaction_context *t,
- enum mail_attribute_type type, const char *key,
+ enum mail_attribute_type type_flags,
+ const char *key,
const struct mail_attribute_value *value);
int index_storage_attribute_get(struct mailbox *box,
- enum mail_attribute_type type, const char *key,
+ enum mail_attribute_type type_flags,
+ const char *key,
struct mail_attribute_value *value_r);
struct mailbox_attribute_iter *
index_storage_attribute_iter_init(struct mailbox *box,
- enum mail_attribute_type type,
+ enum mail_attribute_type type_flags,
const char *prefix);
const char *
index_storage_attribute_iter_next(struct mailbox_attribute_iter *iter);
int (*set_subscribed)(struct mailbox *box, bool set);
int (*attribute_set)(struct mailbox_transaction_context *t,
- enum mail_attribute_type type, const char *key,
+ enum mail_attribute_type type_flags,
+ const char *key,
const struct mail_attribute_value *value);
int (*attribute_get)(struct mailbox *box,
- enum mail_attribute_type type, const char *key,
+ enum mail_attribute_type type_flags,
+ const char *key,
struct mail_attribute_value *value_r);
struct mailbox_attribute_iter *
(*attribute_iter_init)(struct mailbox *box,
- enum mail_attribute_type type,
+ enum mail_attribute_type type_flags,
const char *prefix);
const char *(*attribute_iter_next)(struct mailbox_attribute_iter *iter);
int (*attribute_iter_deinit)(struct mailbox_attribute_iter *iter);
}
static const struct mailbox_attribute_internal *
-mailbox_internal_attribute_get(enum mail_attribute_type type,
+mailbox_internal_attribute_get(enum mail_attribute_type type_flags,
const char *key)
{
const struct mailbox_attribute_internal *iattr;
unsigned int insert_idx;
i_zero(&dreg);
- dreg.type = type;
+ dreg.type = type_flags & MAIL_ATTRIBUTE_TYPE_MASK;
dreg.key = key;
if (array_bsearch_insert_pos(&mailbox_internal_attributes,
}
static void
-mailbox_internal_attributes_get(enum mail_attribute_type type,
+mailbox_internal_attributes_get(enum mail_attribute_type type_flags,
const char *prefix, bool have_dict, ARRAY_TYPE(const_string) *attrs)
{
const struct mailbox_attribute_internal *regs;
}
i_zero(&dreg);
- dreg.type = type;
+ dreg.type = type_flags & MAIL_ATTRIBUTE_TYPE_MASK;
dreg.key = bare_prefix;
(void)array_bsearch_insert_pos(&mailbox_internal_attributes,
for (; i < count; i++) {
const char *key = regs[i].key;
- if (regs[i].type != type)
+ if (regs[i].type != dreg.type)
return;
if (plen > 0) {
if (strncmp(key, bare_prefix, plen) != 0)
static int
mailbox_attribute_set_common(struct mailbox_transaction_context *t,
- enum mail_attribute_type type, const char *key,
+ enum mail_attribute_type type_flags,
+ const char *key,
const struct mail_attribute_value *value)
{
+ enum mail_attribute_type type =
+ type_flags & MAIL_ATTRIBUTE_TYPE_MASK;
const struct mailbox_attribute_internal *iattr;
int ret;
- iattr = mailbox_internal_attribute_get(type, key);
+ iattr = mailbox_internal_attribute_get(type_flags, key);
/* allow internal server attribute only for inbox */
if (iattr != NULL && !t->box->inbox_any &&
}
}
- ret = t->box->v.attribute_set(t, type, key, value);
+ ret = t->box->v.attribute_set(t, type_flags, key, value);
return ret;
}
int mailbox_attribute_set(struct mailbox_transaction_context *t,
- enum mail_attribute_type type, const char *key,
+ enum mail_attribute_type type_flags, const char *key,
const struct mail_attribute_value *value)
{
- return mailbox_attribute_set_common(t, type, key, value);
+ return mailbox_attribute_set_common(t, type_flags, key, value);
}
int mailbox_attribute_unset(struct mailbox_transaction_context *t,
- enum mail_attribute_type type, const char *key)
+ enum mail_attribute_type type_flags, const char *key)
{
struct mail_attribute_value value;
i_zero(&value);
- return mailbox_attribute_set_common(t, type, key, &value);
+ return mailbox_attribute_set_common(t, type_flags, key, &value);
}
int mailbox_attribute_value_to_string(struct mail_storage *storage,
static int
mailbox_attribute_get_common(struct mailbox *box,
- enum mail_attribute_type type, const char *key,
+ enum mail_attribute_type type_flags,
+ const char *key,
struct mail_attribute_value *value_r)
{
const struct mailbox_attribute_internal *iattr;
int ret;
- iattr = mailbox_internal_attribute_get(type, key);
+ iattr = mailbox_internal_attribute_get(type_flags, key);
/* allow internal server attributes only for the inbox */
if (iattr != NULL && !box->inbox_user &&
}
}
- ret = box->v.attribute_get(box, type, key, value_r);
+ ret = box->v.attribute_get(box, type_flags, key, value_r);
if (ret != 0)
return ret;
}
int mailbox_attribute_get(struct mailbox *box,
- enum mail_attribute_type type, const char *key,
+ enum mail_attribute_type type_flags, const char *key,
struct mail_attribute_value *value_r)
{
int ret;
i_zero(value_r);
- if ((ret = mailbox_attribute_get_common(box, type, key,
+ if ((ret = mailbox_attribute_get_common(box, type_flags, key,
value_r)) <= 0)
return ret;
i_assert(value_r->value != NULL);
}
int mailbox_attribute_get_stream(struct mailbox *box,
- enum mail_attribute_type type, const char *key,
+ enum mail_attribute_type type_flags,
+ const char *key,
struct mail_attribute_value *value_r)
{
int ret;
i_zero(value_r);
value_r->flags |= MAIL_ATTRIBUTE_VALUE_FLAG_INT_STREAMS;
- if ((ret = mailbox_attribute_get_common(box, type, key,
+ if ((ret = mailbox_attribute_get_common(box, type_flags, key,
value_r)) <= 0)
return ret;
i_assert(value_r->value != NULL || value_r->value_stream != NULL);
struct mailbox_attribute_iter *
mailbox_attribute_iter_init(struct mailbox *box,
- enum mail_attribute_type type, const char *prefix)
+ enum mail_attribute_type type_flags,
+ const char *prefix)
{
struct mailbox_attribute_internal_iter *intiter;
struct mailbox_attribute_iter *iter;
const char *const *attr;
bool have_dict;
- iter = box->v.attribute_iter_init(box, type, prefix);
+ iter = box->v.attribute_iter_init(box, type_flags, prefix);
i_assert(iter->box != NULL);
box->attribute_iter_count++;
/* check which internal attributes may apply */
t_array_init(&extra_attrs, 4);
have_dict = box->storage->set->mail_attribute_dict[0] != '\0';
- mailbox_internal_attributes_get(type, prefix, have_dict, &extra_attrs);
+ mailbox_internal_attributes_get(type_flags, prefix,
+ have_dict, &extra_attrs);
/* any extra internal attributes to add? */
if (array_count(&extra_attrs) == 0) {
MAIL_ATTRIBUTE_TYPE_PRIVATE,
MAIL_ATTRIBUTE_TYPE_SHARED
};
+#define MAIL_ATTRIBUTE_TYPE_MASK 0x0f
+
enum mail_attribute_value_flags {
MAIL_ATTRIBUTE_VALUE_FLAG_READONLY = 0x01,
MAIL_ATTRIBUTE_VALUE_FLAG_INT_STREAMS = 0x02
IMAP METADATA, so for Dovecot-specific keys use
MAILBOX_ATTRIBUTE_PREFIX_DOVECOT. */
int mailbox_attribute_set(struct mailbox_transaction_context *t,
- enum mail_attribute_type type, const char *key,
+ enum mail_attribute_type type_flags, const char *key,
const struct mail_attribute_value *value);
/* Delete mailbox attribute key. This is just a wrapper to
mailbox_attribute_set() with value->value=NULL. */
int mailbox_attribute_unset(struct mailbox_transaction_context *t,
- enum mail_attribute_type type, const char *key);
+ enum mail_attribute_type type_flags, const char *key);
/* Returns value for mailbox attribute key. Returns 1 if value was returned,
0 if value wasn't found (set to NULL), -1 if error */
int mailbox_attribute_get(struct mailbox *box,
- enum mail_attribute_type type, const char *key,
+ enum mail_attribute_type type_flags, const char *key,
struct mail_attribute_value *value_r);
/* Same as mailbox_attribute_get(), but the returned value may be either an
input stream or a string. */
int mailbox_attribute_get_stream(struct mailbox *box,
- enum mail_attribute_type type, const char *key,
+ enum mail_attribute_type type_flags,
+ const char *key,
struct mail_attribute_value *value_r);
/* Iterate through mailbox attributes of the given type. The prefix can be used
to restrict what attributes are returned. */
struct mailbox_attribute_iter *
-mailbox_attribute_iter_init(struct mailbox *box, enum mail_attribute_type type,
+mailbox_attribute_iter_init(struct mailbox *box,
+ enum mail_attribute_type type_flags,
const char *prefix);
/* Returns the attribute key or NULL if there are no more attributes. */
const char *mailbox_attribute_iter_next(struct mailbox_attribute_iter *iter);