struct mail_storage mdbox_storage = {
.name = MDBOX_STORAGE_NAME,
.class_flags = MAIL_STORAGE_CLASS_FLAG_UNIQUE_ROOT |
- MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUIDS,
+ MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUIDS |
+ MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_SAVE_GUIDS,
.v = {
mdbox_get_setting_parser_info,
struct mail_storage sdbox_storage = {
.name = SDBOX_STORAGE_NAME,
.class_flags = MAIL_STORAGE_CLASS_FLAG_FILE_PER_MSG |
- MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUIDS,
+ MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUIDS |
+ MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_SAVE_GUIDS,
.v = {
NULL,
struct mail_storage maildir_storage = {
.name = MAILDIR_STORAGE_NAME,
.class_flags = MAIL_STORAGE_CLASS_FLAG_FILE_PER_MSG |
- MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUIDS,
+ MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUIDS |
+ MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_SAVE_GUIDS,
.v = {
maildir_get_setting_parser_info,
/* Storage uses one file per message */
MAIL_STORAGE_CLASS_FLAG_FILE_PER_MSG = 0x20,
/* Messages have GUIDs (always set mailbox_status.have_guids=TRUE) */
- MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUIDS = 0x40
+ MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUIDS = 0x40,
+ /* mailbox_save_set_guid() works (always set
+ mailbox_status.have_save_guids=TRUE) */
+ MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_SAVE_GUIDS = 0x80
};
struct mail_binary_cache {
memset(status_r, 0, sizeof(*status_r));
if ((box->storage->class_flags & MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUIDS) != 0)
status_r->have_guids = TRUE;
+ if ((box->storage->class_flags & MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_SAVE_GUIDS) != 0)
+ status_r->have_save_guids = TRUE;
}
int mailbox_get_status(struct mailbox *box,
mailbox_get_status_set_defaults(box, status_r);
if (mailbox_verify_existing_name(box) < 0)
return -1;
- return box->v.get_status(box, items, status_r);
+ if (box->v.get_status(box, items, status_r) < 0)
+ return -1;
+ i_assert(status_r->have_guids || !status_r->have_save_guids);
+ return 0;
}
void mailbox_get_open_status(struct mailbox *box,
/* Messages have GUIDs (always set) */
unsigned int have_guids:1;
+ /* mailbox_save_set_guid() works (always set) */
+ unsigned int have_save_guids:1;
};
struct mailbox_cache_field {
mailbox_get_open_status(bbox->box, 0, &status);
if (!status.have_guids)
mbox->have_guids = FALSE;
+ if (!status.have_save_guids)
+ mbox->have_save_guids = FALSE;
return 1;
}
int ret;
mbox->have_guids = TRUE;
+ mbox->have_save_guids = TRUE;
bboxes = array_get(&mbox->backend_boxes, &count);
for (i = 0; i < count; ) {
}
if (mbox->have_guids)
status_r->have_guids = TRUE;
+ if (mbox->have_save_guids)
+ status_r->have_save_guids = TRUE;
return 0;
}
unsigned int sync_initialized:1;
unsigned int inconsistent:1;
unsigned int have_guids:1;
+ unsigned int have_save_guids:1;
};
extern MODULE_CONTEXT_DEFINE(virtual_storage_module,