/* GNU Mailutils -- a suite of utilities for electronic mail Copyright (C) 2019-2021 Free Software Foundation, Inc. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with GNU Mailutils. If not, see . */ #ifndef _MAILUTILS_SYS_MBOX2_H #define _MAILUTILS_SYS_MBOX2_H # include # include struct mu_mboxrd_message { /* Offsets in the mailbox */ mu_off_t message_start; /* Start of message */ size_t from_length; /* Length of the From_ line */ int env_sender_len; /* Length of the sender email in the From_ line */ mu_off_t body_start; /* Start of body */ mu_off_t message_end; /* Offset of the last byte of the message */ /* Additional info */ unsigned long uid; /* IMAP-style uid. */ char date[MU_DATETIME_FROM_LENGTH+1]; /* Envelope date in normalized form */ unsigned body_lines_scanned:1; /* True if body_lines is initialized */ unsigned body_from_escaped:1; /* True if body is from-escaped (valid if body_lines_scanned is true) */ unsigned uid_modified:1;/* UID|uidvalidity|uidnext has been modified */ unsigned mark:1; int attr_flags; /* Packed "Status:" attribute flags */ /* The following two are set only if body_lines_scanned is true */ size_t body_size; /* Number of octets in message body (after >From unescape) */ size_t body_lines; /* Number of lines in message body */ mu_message_t message; /* Pointer to the message object if any */ /* Backlink to the mailbox */ struct mu_mboxrd_mailbox *mbox; /* Mailbox */ size_t num; /* Number of this message in the mailbox (0-based) */ }; struct mu_mboxrd_mailbox { char *name; /* Disk file name */ mu_mailbox_t mailbox; /* Associated mailbox */ int stream_flags; /* Flags used to create the mailbox stream */ mu_off_t size; /* Size of the mailbox. */ unsigned long uidvalidity; /* Uidvalidity value */ unsigned long uidnext; /* Expected next UID value */ unsigned uidvalidity_scanned:1; /* True if uidvalidity is initialized */ unsigned uidvalidity_changed:1; /* True if uidvalidity or uidnext has changed */ size_t x_imapbase_off; /* Offset of the X-IMAPbase header */ size_t x_imapbase_len; /* Length if the header without trailing \n */ struct mu_mboxrd_message **mesg; /* Array of messages */ size_t mesg_count; /* Number of messages in mesgv */ size_t mesg_max; /* Actual capacity of mesg */ }; int mu_mboxrd_mailbox_init (mu_mailbox_t mailbox); void mu_mboxrd_message_free (struct mu_mboxrd_message *dmsg); int mu_mboxrd_message_get (struct mu_mboxrd_message *dmsg, mu_message_t *mptr); int mu_mboxrd_message_attr_load (struct mu_mboxrd_message *dmsg); int mu_mboxrd_mailbox_uid_setup (struct mu_mboxrd_mailbox *dmp); int mu_mboxrd_message_reconstruct (mu_stream_t dest, struct mu_mboxrd_message *dmsg, struct mu_mboxrd_message *ref, char const *x_imapbase); #endif