mail-storage.h revision 2fce6f365c7871e4f2914750130421d6b257d963
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#ifndef __MAIL_STORAGE_H
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#define __MAIL_STORAGE_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
80c1d98d3638b71e57a39cafa88b9122bf8169c6Timo Sirainen#include "imap-util.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "imap-parser.h"
94a8cb0ee1d85569ad1a2acacd92d3ce22f8a1cbTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainentypedef enum {
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen MAILBOX_NOSELECT = 0x01,
50031a6b36a6051512bd18f39e4bbabe54acf565Timo Sirainen MAILBOX_CHILDREN = 0x02,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen MAILBOX_NOCHILDREN = 0x04,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen MAILBOX_NOINFERIORS = 0x08,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen MAILBOX_MARKED = 0x10,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen MAILBOX_UNMARKED = 0x20,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen MAILBOX_READONLY = 0x40
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen} MailboxFlags;
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen
8887bf3757d51d73887dd20b1db3334d867d3817Timo Sirainentypedef enum {
8887bf3757d51d73887dd20b1db3334d867d3817Timo Sirainen STATUS_MESSAGES = 0x01,
369a1084c500a9df7448ffa9409ce32e42060bc2Timo Sirainen STATUS_RECENT = 0x02,
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen STATUS_UIDNEXT = 0x04,
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen STATUS_UIDVALIDITY = 0x08,
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen STATUS_UNSEEN = 0x10,
c53e8ee216904ffe6de4f6518d9f9f5107b7610eTimo Sirainen STATUS_FIRST_UNSEEN_SEQ = 0x20,
589a9c6e8ee22071c14171c04bfc6bfe17121871Timo Sirainen STATUS_CUSTOM_FLAGS = 0x40
589a9c6e8ee22071c14171c04bfc6bfe17121871Timo Sirainen} MailboxStatusItems;
ef5fb27361cc5e15766e85e28355750ff04b13c9Timo Sirainen
ef5fb27361cc5e15766e85e28355750ff04b13c9Timo Sirainentypedef enum {
ef5fb27361cc5e15766e85e28355750ff04b13c9Timo Sirainen MAILBOX_NAME_EXISTS,
ef5fb27361cc5e15766e85e28355750ff04b13c9Timo Sirainen MAILBOX_NAME_VALID,
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen MAILBOX_NAME_INVALID
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen} MailboxNameStatus;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainentypedef enum {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen MODIFY_ADD,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen MODIFY_REMOVE,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen MODIFY_REPLACE
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen} ModifyType;
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen
6ec7cf71ccd0eed1f9cc1b0bda8960796b04160bTimo Sirainentypedef struct _MailStorage MailStorage;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainentypedef struct _Mailbox Mailbox;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainentypedef struct _MailboxStatus MailboxStatus;
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainentypedef struct _MailFetchData MailFetchData;
db5164c9a1129af0cfb11fc18d88da361a8011fbTimo Sirainentypedef struct _MailFetchBodyData MailFetchBodyData;
db5164c9a1129af0cfb11fc18d88da361a8011fbTimo Sirainentypedef struct _MailSearchArg MailSearchArg;
db5164c9a1129af0cfb11fc18d88da361a8011fbTimo Sirainen
db5164c9a1129af0cfb11fc18d88da361a8011fbTimo Sirainentypedef void (*MailboxFunc)(MailStorage *storage, const char *name,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen MailboxFlags flags, void *context);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainentypedef void (*MailExpungeFunc)(Mailbox *mailbox, unsigned int seq,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int uid, void *context);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainentypedef void (*MailFlagUpdateFunc)(Mailbox *mailbox, unsigned int seq,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int uid, MailFlags flags,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *custom_flags[],
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen void *context);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* All methods returning int return either TRUE or FALSE. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct _MailStorage {
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen char *name;
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen char hierarchy_sep;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Create new instance */
811f2e26d9782d9cb99fdf82e18ffa0a77564fe2Timo Sirainen MailStorage *(*create)(const char *data, const char *user);
811f2e26d9782d9cb99fdf82e18ffa0a77564fe2Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Free this instance */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen void (*free)(MailStorage *storage);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Returns TRUE if this storage would accept the given data
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen as a valid parameter to create(). */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*autodetect)(const char *data);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Open a mailbox. If readonly is TRUE, mailbox must not be
1d3f7c1278168d5b1cbfa9a2cc9929a0909056b4Timo Sirainen modified in any way even when it's asked. If fast is TRUE,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen any extra time consuming operations shouldn't be performed
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (eg. when opening mailbox just for STATUS). */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen Mailbox *(*open_mailbox)(MailStorage *storage, const char *name,
1d3f7c1278168d5b1cbfa9a2cc9929a0909056b4Timo Sirainen int readonly, int fast);
1d3f7c1278168d5b1cbfa9a2cc9929a0909056b4Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* name is allowed to contain multiple new hierarchy levels */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*create_mailbox)(MailStorage *storage, const char *name);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*delete_mailbox)(MailStorage *storage, const char *name);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* If the name has inferior hierarchical names, then the inferior
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen hierarchical names MUST also be renamed (ie. foo -> bar renames
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen also foo/bar -> bar/bar).
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen If oldname is case-insensitively "INBOX", the mails are moved
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen into new folder but the INBOX folder must not be deleted. */
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen int (*rename_mailbox)(MailStorage *storage, const char *oldname,
2a734f36105e33ab452d057df6bc7a2b7d9f96f0Timo Sirainen const char *newname);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen /* Execute specified function for all mailboxes matching given
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen mask. The mask is in RFC2060 LIST format. */
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen int (*find_mailboxes)(MailStorage *storage, const char *mask,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen MailboxFunc func, void *context);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Subscribe/unsubscribe mailbox. There should be no error when
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen subscribing to already subscribed mailbox. Subscribing to
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen unexisting mailboxes is optional. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*set_subscribed)(MailStorage *storage, const char *name, int set);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen /* Exactly like find_mailboxes(), but list only subscribed mailboxes. */
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen int (*find_subscribed)(MailStorage *storage, const char *mask,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen MailboxFunc func, void *context);
84ed9f8f3d0e5ed47607ef417618e49e4f865557Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen /* Returns mailbox name status */
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen int (*get_mailbox_name_status)(MailStorage *storage, const char *name,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen MailboxNameStatus *status);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen /* Returns the error message of last occured error. */
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen const char *(*get_last_error)(MailStorage *storage);
b9c44feadade0481b957f2978640afb3317bd1dfTimo Sirainen
b9c44feadade0481b957f2978640afb3317bd1dfTimo Sirainen/* private: */
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen char *dir; /* root directory */
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen char *user; /* name of user accessing the storage */
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen char *error;
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen};
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainenstruct _Mailbox {
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen char *name;
807b48fe1f6a57b01ed2cc20247d5b5e3facc562Timo Sirainen
807b48fe1f6a57b01ed2cc20247d5b5e3facc562Timo Sirainen MailStorage *storage;
807b48fe1f6a57b01ed2cc20247d5b5e3facc562Timo Sirainen
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen /* Close the box */
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen void (*close)(Mailbox *box);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen /* Gets the mailbox status information. */
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen int (*get_status)(Mailbox *box, MailboxStatusItems items,
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen MailboxStatus *status);
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen /* Synchronize the mailbox by reading all expunges and flag changes.
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen If new mail has been added to mailbox, messages contains the total
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen number of messages in mailbox, otherwise 0. functions may be NULL.
6bc98d3898c475ba7615ba2b016e5142c8b2c09fTimo Sirainen
2d39dc1a453546892109b35c0d9770369011a13dTimo Sirainen If expunge is TRUE, deleted mails are expunged as well. Difference
2d39dc1a453546892109b35c0d9770369011a13dTimo Sirainen to expunge() function is that expunge_func is also called. */
2d39dc1a453546892109b35c0d9770369011a13dTimo Sirainen int (*sync)(Mailbox *box, unsigned int *messages, int expunge,
2d39dc1a453546892109b35c0d9770369011a13dTimo Sirainen MailExpungeFunc expunge_func, MailFlagUpdateFunc flag_func,
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen void *context);
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen /* Expunge all mails with \Deleted flag. */
d6a1fa1d65c6d1996937802c2482c0f14dd821a7Timo Sirainen int (*expunge)(Mailbox *box);
d6a1fa1d65c6d1996937802c2482c0f14dd821a7Timo Sirainen
807b48fe1f6a57b01ed2cc20247d5b5e3facc562Timo Sirainen /* Update mail flags. func may be NULL. */
807b48fe1f6a57b01ed2cc20247d5b5e3facc562Timo Sirainen int (*update_flags)(Mailbox *box, const char *messageset, int uidset,
3f91e60401495a4046c73992fabaa5e77200a451Timo Sirainen MailFlags flags, const char *custom_flags[],
3f91e60401495a4046c73992fabaa5e77200a451Timo Sirainen ModifyType modify_type,
3f91e60401495a4046c73992fabaa5e77200a451Timo Sirainen MailFlagUpdateFunc func, void *context,
2d39dc1a453546892109b35c0d9770369011a13dTimo Sirainen int *all_found);
2d39dc1a453546892109b35c0d9770369011a13dTimo Sirainen
7761758f43d6150be4b07f4c54457ce662f78c4cTimo Sirainen /* Copy mails to another mailbox */
6bc98d3898c475ba7615ba2b016e5142c8b2c09fTimo Sirainen int (*copy)(Mailbox *box, Mailbox *destbox,
62f4a199b5c9a0862f486cbf18e195cc621bbe25Timo Sirainen const char *messageset, int uidset);
62f4a199b5c9a0862f486cbf18e195cc621bbe25Timo Sirainen
62f4a199b5c9a0862f486cbf18e195cc621bbe25Timo Sirainen /* Fetch wanted mail data. The results are written into outbuf
62f4a199b5c9a0862f486cbf18e195cc621bbe25Timo Sirainen in RFC2060 FETCH format. */
62f4a199b5c9a0862f486cbf18e195cc621bbe25Timo Sirainen int (*fetch)(Mailbox *box, MailFetchData *fetch_data,
6bc98d3898c475ba7615ba2b016e5142c8b2c09fTimo Sirainen IOBuffer *outbuf, int *all_found);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Search wanted mail data. args contains the search criteria.
659fe5d24825b160cae512538088020d97a60239Timo Sirainen results are written into outbuf in RFC2060 SEARCH format. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*search)(Mailbox *box, MailSearchArg *args,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen IOBuffer *outbuf, int uid_result);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Save a new mail into mailbox. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*save)(Mailbox *box, MailFlags flags, const char *custom_flags[],
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen time_t internal_date, IOBuffer *data, uoff_t data_size);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen /* Returns TRUE if mailbox is now in inconsistent state, meaning that
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen the message IDs etc. may have changed - only way to recover this
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen would be to fully close the mailbox and reopen it. With IMAP
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen connection this would mean a forced disconnection since we can't
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen do forced CLOSE. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*is_inconsistency_error)(Mailbox *box);
1f43c8ac132c153c224c4fffe34b2c3075d87ef7Timo Sirainen
1f43c8ac132c153c224c4fffe34b2c3075d87ef7Timo Sirainen/* private: */
1f43c8ac132c153c224c4fffe34b2c3075d87ef7Timo Sirainen unsigned int readonly:1;
1f43c8ac132c153c224c4fffe34b2c3075d87ef7Timo Sirainen unsigned int inconsistent:1;
1f43c8ac132c153c224c4fffe34b2c3075d87ef7Timo Sirainen};
020a39a395d2adb768e0179631b37bc78ecd9471Timo Sirainen
020a39a395d2adb768e0179631b37bc78ecd9471Timo Sirainenstruct _MailboxStatus {
1f43c8ac132c153c224c4fffe34b2c3075d87ef7Timo Sirainen unsigned int messages;
b9c44feadade0481b957f2978640afb3317bd1dfTimo Sirainen unsigned int recent;
b9c44feadade0481b957f2978640afb3317bd1dfTimo Sirainen unsigned int unseen;
b9c44feadade0481b957f2978640afb3317bd1dfTimo Sirainen
020a39a395d2adb768e0179631b37bc78ecd9471Timo Sirainen unsigned int uidvalidity;
020a39a395d2adb768e0179631b37bc78ecd9471Timo Sirainen unsigned int uidnext;
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen unsigned int first_unseen_seq;
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen unsigned int diskspace_full:1;
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen /* may be allocated from temp pool */
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen const char *custom_flags[MAIL_CUSTOM_FLAGS_COUNT];
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen};
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainenstruct _MailFetchData {
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen const char *messageset;
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen unsigned int uidset:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen unsigned int body:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int bodystructure:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int envelope:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int flags:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int internaldate:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int rfc822:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int rfc822_header:1;
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen unsigned int rfc822_size:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int rfc822_text:1;
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen unsigned int uid:1;
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen MailFetchBodyData *body_sections;
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen};
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen
e156adefc1260d31a145df2f5e9b3c82050d4163Timo Sirainenstruct _MailFetchBodyData {
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen MailFetchBodyData *next;
41e6eb07b411ea58352ba9d2cc8cf340325d49f3Timo Sirainen
41e6eb07b411ea58352ba9d2cc8cf340325d49f3Timo Sirainen const char *section; /* NOTE: always uppercased */
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen uoff_t skip, max_size; /* if you don't want max_size,
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen set it to (uoff_t)-1 */
41e6eb07b411ea58352ba9d2cc8cf340325d49f3Timo Sirainen unsigned int skip_set:1;
41e6eb07b411ea58352ba9d2cc8cf340325d49f3Timo Sirainen unsigned int peek:1;
41e6eb07b411ea58352ba9d2cc8cf340325d49f3Timo Sirainen};
41e6eb07b411ea58352ba9d2cc8cf340325d49f3Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* register all mail storages */
4d4d585520538a752e9f0a4a1c019a2918f52e56Timo Sirainenvoid mail_storage_register_all(void);
4d4d585520538a752e9f0a4a1c019a2918f52e56Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Register mail storage class with given name - all methods that are NULL
15cc66ca72982a43e3bfa58f307adc57e9caa52dTimo Sirainen are set to default methods */
15cc66ca72982a43e3bfa58f307adc57e9caa52dTimo Sirainenvoid mail_storage_class_register(MailStorage *storage_class);
a045c3aba2610c6ed0bf1c346df1c6d8f7b9fbfdTimo Sirainenvoid mail_storage_class_unregister(MailStorage *storage_class);
a045c3aba2610c6ed0bf1c346df1c6d8f7b9fbfdTimo Sirainen
a045c3aba2610c6ed0bf1c346df1c6d8f7b9fbfdTimo Sirainen/* Create a new instance of registered mail storage class with given
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen storage-specific data. If data is NULL, it tries to use defaults.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen May return NULL if anything fails. */
d30da25fb6be1f1c667d93767c9194000194b618Timo SirainenMailStorage *mail_storage_create(const char *name, const char *data,
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainen const char *user);
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainenvoid mail_storage_destroy(MailStorage *storage);
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainen
d30da25fb6be1f1c667d93767c9194000194b618Timo SirainenMailStorage *mail_storage_create_default(const char *user);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo SirainenMailStorage *mail_storage_create_with_data(const char *data, const char *user);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen/* Set error message in storage. Critical errors are logged with i_error(),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen but user sees only "internal error" message. */
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenvoid mail_storage_clear_error(MailStorage *storage);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_storage_set_error(MailStorage *storage, const char *fmt, ...)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen __attr_format__(2, 3);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_storage_set_critical(MailStorage *storage, const char *fmt, ...)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen __attr_format__(2, 3);
df4018ae2f0a95be602f724ca70df7e0e3bd6a7dTimo Sirainenvoid mail_storage_set_internal_error(MailStorage *storage);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenconst char *mail_storage_get_last_error(MailStorage *storage);
ec77cd41241208345efd51c1fcce9030be30aa9bTimo Sirainenint mail_storage_is_inconsistency_error(Mailbox *box);
ec77cd41241208345efd51c1fcce9030be30aa9bTimo Sirainen
ec77cd41241208345efd51c1fcce9030be30aa9bTimo Sirainen#endif
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen