mail-storage.h revision 2fce6f365c7871e4f2914750130421d6b257d963
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainentypedef enum {
8887bf3757d51d73887dd20b1db3334d867d3817Timo Sirainentypedef enum {
ef5fb27361cc5e15766e85e28355750ff04b13c9Timo Sirainentypedef enum {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainentypedef enum {
db5164c9a1129af0cfb11fc18d88da361a8011fbTimo Sirainentypedef struct _MailFetchBodyData MailFetchBodyData;
db5164c9a1129af0cfb11fc18d88da361a8011fbTimo Sirainentypedef void (*MailboxFunc)(MailStorage *storage, const char *name,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainentypedef void (*MailExpungeFunc)(Mailbox *mailbox, unsigned int seq,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainentypedef void (*MailFlagUpdateFunc)(Mailbox *mailbox, unsigned int seq,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* All methods returning int return either TRUE or FALSE. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Create new instance */
811f2e26d9782d9cb99fdf82e18ffa0a77564fe2Timo Sirainen MailStorage *(*create)(const char *data, const char *user);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Free this instance */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Returns TRUE if this storage would accept the given data
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen as a valid parameter to create(). */
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,
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 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);
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 /* 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);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen /* Exactly like find_mailboxes(), but list only subscribed mailboxes. */
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen int (*find_subscribed)(MailStorage *storage, const char *mask,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen /* Returns mailbox name status */
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen int (*get_mailbox_name_status)(MailStorage *storage, const char *name,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen /* Returns the error message of last occured error. */
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen const char *(*get_last_error)(MailStorage *storage);
b9c44feadade0481b957f2978640afb3317bd1dfTimo Sirainen/* private: */
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen char *user; /* name of user accessing the storage */
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen /* Close the box */
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen /* Gets the mailbox status information. */
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen int (*get_status)(Mailbox *box, MailboxStatusItems items,
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.
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 /* Expunge all mails with \Deleted flag. */
807b48fe1f6a57b01ed2cc20247d5b5e3facc562Timo Sirainen /* Update mail flags. func may be NULL. */
807b48fe1f6a57b01ed2cc20247d5b5e3facc562Timo Sirainen int (*update_flags)(Mailbox *box, const char *messageset, int uidset,
7761758f43d6150be4b07f4c54457ce662f78c4cTimo Sirainen /* Copy mails to another mailbox */
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,
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 /* 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);
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. */
1f43c8ac132c153c224c4fffe34b2c3075d87ef7Timo Sirainen/* private: */
b9c44feadade0481b957f2978640afb3317bd1dfTimo Sirainen unsigned int recent;
b9c44feadade0481b957f2978640afb3317bd1dfTimo Sirainen unsigned int unseen;
020a39a395d2adb768e0179631b37bc78ecd9471Timo Sirainen unsigned int uidnext;
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen /* may be allocated from temp pool */
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen const char *custom_flags[MAIL_CUSTOM_FLAGS_COUNT];
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 */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* register all mail storages */
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/* 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 SirainenMailStorage *mail_storage_create_default(const char *user);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo SirainenMailStorage *mail_storage_create_with_data(const char *data, const char *user);
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 Sirainenvoid mail_storage_set_critical(MailStorage *storage, const char *fmt, ...)
df4018ae2f0a95be602f724ca70df7e0e3bd6a7dTimo Sirainenvoid mail_storage_set_internal_error(MailStorage *storage);
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenconst char *mail_storage_get_last_error(MailStorage *storage);