/*
mairix - message index builder and finder for maildir folders.
**********************************************************************
* Copyright (C) Richard P. Curnow 2002-2004
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
**********************************************************************
*/
#ifndef READER_H
#define READER_H
/* MX, then a high byte, then the version no. */
#define HEADER_MAGIC0 'M'
#define HEADER_MAGIC1 'X'
#define HEADER_MAGIC2 0xA5
#define HEADER_MAGIC3 0x03
/*{{{ Constants for file data positions */
#define UI_ENDIAN 1
#define UI_N_MSGS 2
/* Offset to byte-per-message table encoding message types */
#define UI_MSG_TYPE_AND_FLAGS 3
/* Header positions containing offsets to the per-message tables. */
/* Character data:
* for maildir/MH : the path of the box.
* for mbox : index of mbox containing the message */
#define UI_MSG_CDATA 4
/* For maildir/MH : mtime of file containing message */
#define UI_MSG_MTIME 5
/* For mbox msgs : the offset into the file */
#define UI_MSG_OFFSET 5
/* For all formats : message size */
#define UI_MSG_SIZE 6
/* For mbox msgs : offset into file */
#define UI_MSG_START 6
/* These are common to Maildir,MH,mbox messages */
#define UI_MSG_DATE 7
#define UI_MSG_TID 8
/* Header positions for mbox (file-level) information */
/* Number of mboxes */
#define UI_MBOX_N 9
#define UI_MBOX_PATHS 10
#define UI_MBOX_ENTRIES 11
/* mtime of mboxes */
#define UI_MBOX_MTIME 12
/* Size in bytes */
#define UI_MBOX_SIZE 13
/* Base of checksums for messages in each mbox */
#define UI_MBOX_CKSUM 14
#define UI_HASH_KEY 15
/* Header positions for token tables */
#define UI_TO_BASE 16
#define UI_CC_BASE 19
#define UI_FROM_BASE 22
#define UI_SUBJECT_BASE 25
#define UI_BODY_BASE 28
#define UI_ATTACHMENT_NAME_BASE 31
#define UI_MSGID_BASE 34
/* Larger than the last table offset. */
#define UI_HEADER_LEN 40
#define UC_HEADER_LEN ((UI_HEADER_LEN) << 2)
#define UI_N_OFFSET 0
#define UI_TOK_OFFSET 1
#define UI_ENC_OFFSET 2
#define UI_TO_N (UI_TO_BASE + UI_N_OFFSET)
#define UI_TO_TOK (UI_TO_BASE + UI_TOK_OFFSET)
#define UI_TO_ENC (UI_TO_BASE + UI_ENC_OFFSET)
#define UI_CC_N (UI_CC_BASE + UI_N_OFFSET)
#define UI_CC_TOK (UI_CC_BASE + UI_TOK_OFFSET)
#define UI_CC_ENC (UI_CC_BASE + UI_ENC_OFFSET)
#define UI_FROM_N (UI_FROM_BASE + UI_N_OFFSET)
#define UI_FROM_TOK (UI_FROM_BASE + UI_TOK_OFFSET)
#define UI_FROM_ENC (UI_FROM_BASE + UI_ENC_OFFSET)
#define UI_SUBJECT_N (UI_SUBJECT_BASE + UI_N_OFFSET)
#define UI_SUBJECT_TOK (UI_SUBJECT_BASE + UI_TOK_OFFSET)
#define UI_SUBJECT_ENC (UI_SUBJECT_BASE + UI_ENC_OFFSET)
#define UI_BODY_N (UI_BODY_BASE + UI_N_OFFSET)
#define UI_BODY_TOK (UI_BODY_BASE + UI_TOK_OFFSET)
#define UI_BODY_ENC (UI_BODY_BASE + UI_ENC_OFFSET)
#define UI_ATTACHMENT_NAME_N (UI_ATTACHMENT_NAME_BASE + UI_N_OFFSET)
#define UI_ATTACHMENT_NAME_TOK (UI_ATTACHMENT_NAME_BASE + UI_TOK_OFFSET)
#define UI_ATTACHMENT_NAME_ENC (UI_ATTACHMENT_NAME_BASE + UI_ENC_OFFSET)
#define UI_MSGID_N (UI_MSGID_BASE + UI_N_OFFSET)
#define UI_MSGID_TOK (UI_MSGID_BASE + UI_TOK_OFFSET)
#define UI_MSGID_ENC0 (UI_MSGID_BASE + UI_ENC_OFFSET)
#define UI_MSGID_ENC1 (UI_MSGID_ENC0 + 1)
/*}}}*/
/*{{{ Literals used for encoding messages types in database file */
#define DB_MSG_DEAD 0
/* maildir/MH : one file per message */
#define DB_MSG_FILE 1
/* mbox : multiple files per message */
#define DB_MSG_MBOX 2
/*}}}*/
#define FLAG_SEEN (1<<3)
#define FLAG_REPLIED (1<<4)
#define FLAG_FLAGGED (1<<5)
struct toktable_db {/*{{{*/
unsigned int n; /* number of entries in this table */
unsigned int *tok_offsets; /* offset to table of token offsets */
unsigned int *enc_offsets; /* offset to table of encoding offsets */
};
/*}}}*/
struct toktable2_db {/*{{{*/
unsigned int n; /* number of entries in this table */
unsigned int *tok_offsets; /* offset to table of token offsets */
unsigned int *enc0_offsets; /* offset to table of encoding offsets */
unsigned int *enc1_offsets; /* offset to table of encoding offsets */
};
/*}}}*/
struct read_db {/*{{{*/
/* Raw file parameters, needed later for munmap */
char *data;
int len;
/* Pathname information */
int n_msgs;
unsigned char *msg_type_and_flags;
unsigned int *path_offsets; /* or (mbox index, msg index) */
unsigned int *mtime_table; /* or offset into mbox */
unsigned int *size_table; /* either file size or span inside mbox */
unsigned int *date_table;
unsigned int *tid_table;
int n_mboxen;
unsigned int *mbox_paths_table;
unsigned int *mbox_entries_table; /* table of number of messages per mbox */
unsigned int *mbox_mtime_table;
unsigned int *mbox_size_table;
unsigned int *mbox_checksum_table;
unsigned int hash_key;
struct toktable_db to;
struct toktable_db cc;
struct toktable_db from;
struct toktable_db subject;
struct toktable_db body;
struct toktable_db attachment_name;
struct toktable2_db msg_ids;
};
/*}}}*/
struct read_db *open_db(char *filename);
void close_db(struct read_db *x);
static inline int rd_msg_type(struct read_db *db, int i) {
return db->msg_type_and_flags[i] & 0x7;
}
/* Common to search and db reader. */
int read_increment(unsigned char **encpos);
#endif /* READER_H */
syntax highlighted by Code2HTML, v. 0.9.1