#ifndef INDEX_H
#define INDEX_H
#include <config.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <syslog.h>
#include <errno.h>
#include <ctype.h>
#include "annotate.h"
#include "mailbox.h"
#define INDEC_OFFSET(msgno) (index_base+start_offset+(((msgno)-1)*record_size))
#define UID(msgno) ntohl(*((bit32 *)(INDEC_OFFSET(msgno)+OFFSET_UID)))
#define INTERNALDATE(msgno) ntohl(*((bit32 *)(INDEC_OFFSET(msgno)+OFFSET_INTERNALDATE)))
#define SENTDATE(msgno) ntohl(*((bit32 *)(INDEC_OFFSET(msgno)+OFFSET_SENTDATE)))
#define SIZE(msgno) ntohl(*((bit32 *)(INDEC_OFFSET(msgno)+OFFSET_SIZE)))
#define HEADER_SIZE(msgno) ntohl(*((bit32 *)(INDEC_OFFSET(msgno)+OFFSET_HEADER_SIZE)))
#define CONTENT_OFFSET(msgno) ntohl(*((bit32 *)(INDEC_OFFSET(msgno)+OFFSET_CONTENT_OFFSET)))
#define CACHE_OFFSET(msgno) ntohl(*((bit32 *)(INDEC_OFFSET(msgno)+OFFSET_CACHE_OFFSET)))
#define LAST_UPDATED(msgno) ((time_t)ntohl(*((bit32 *)(INDEC_OFFSET(msgno)+OFFSET_LAST_UPDATED))))
#define SYSTEM_FLAGS(msgno) ntohl(*((bit32 *)(INDEC_OFFSET(msgno)+OFFSET_SYSTEM_FLAGS)))
#define USER_FLAGS(msgno,i) ntohl(*((bit32 *)(INDEC_OFFSET(msgno)+OFFSET_USER_FLAGS+((i)*4))))
#define CONTENT_LINES(msgno) ntohl(*((bit32 *)(INDEC_OFFSET(msgno)+OFFSET_CONTENT_LINES)))
#define CACHE_VERSION(msgno) ntohl(*((bit32 *)(INDEC_OFFSET(msgno)+OFFSET_CACHE_VERSION)))
#ifdef HAVE_LONG_LONG_INT
#define MODSEQ(msgno) ntohll(*((bit64 *)(INDEC_OFFSET(msgno)+OFFSET_MODSEQ_64)))
#else
#define MODSEQ(msgno) ntohl(*((bit32 *)(INDEC_OFFSET(msgno)+OFFSET_MODSEQ)))
#endif
#define CACHE_ITEM_BIT32(ptr) (ntohl(*((bit32 *)(ptr))))
#define CACHE_ITEM_LEN(ptr) CACHE_ITEM_BIT32(ptr)
#define CACHE_ITEM_NEXT(ptr) ((ptr)+4+((3+CACHE_ITEM_LEN(ptr))&~3))
#define CACHE_ITEM_SIZE_SKIP sizeof(bit32)
#define VECTOR_SIZE(vector) (sizeof(vector)/sizeof(vector[0]))
enum {
ENV_DATE = 0,
ENV_SUBJECT,
ENV_FROM,
ENV_SENDER,
ENV_REPLYTO,
ENV_TO,
ENV_CC,
ENV_BCC,
ENV_INREPLYTO,
ENV_MSGID
};
#define NUMENVTOKENS (10)
#define LOAD_IDS 256
struct copyargs {
struct copymsg *copymsg;
int nummsg;
int msgalloc;
};
struct mapfile {
const char *base;
unsigned long size;
};
typedef struct msgdata {
unsigned msgno;
char *msgid;
char **ref;
int nref;
time_t date;
char *cc;
char *from;
char *to;
char *xsubj;
unsigned xsubj_hash;
int is_refwd;
char **annot;
int nannot;
struct msgdata *next;
} MsgData;
typedef struct thread {
MsgData *msgdata;
struct thread *parent;
struct thread *child;
struct thread *next;
} Thread;
struct rootset {
Thread *root;
unsigned nroot;
};
struct thread_algorithm {
char *alg_name;
void (*threader)(unsigned *msgno_list, int nmsg, int usinguid);
};
struct nntp_overview {
unsigned long uid;
char *subj;
char *from;
char *date;
char *msgid;
char *ref;
unsigned long bytes;
unsigned long lines;
};
extern void index_operatemailbox(struct mailbox *mailbox);
extern int index_finduid(unsigned uid);
extern int index_getuid(unsigned msgno);
extern int index_urlfetch(struct mailbox *mailbox, unsigned msgno,
const char *section,
unsigned long start_octet, unsigned long octet_count,
struct protstream *pout, unsigned long *size);
extern char *index_get_msgid(struct mailbox *mailbox, unsigned msgno);
extern struct nntp_overview *index_overview(struct mailbox *mailbox,
unsigned msgno);
extern char *index_getheader(struct mailbox *mailbox, unsigned msgno,
char *hdr);
extern unsigned long index_getsize(struct mailbox *mailbox, unsigned msgno);
extern unsigned long index_getlines(struct mailbox *mailbox, unsigned msgno);
extern int index_copy_remote(struct mailbox *mailbox, char *sequence,
int usinguid, struct protstream *pout);
#endif