1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
/* -*- mode: C++; c-file-style: "gnu" -*-
This file is part of KMail, the KDE mail client.
Copyright (c) 2000 Don Sanders <sanders@kde.org>
KMail is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License, version 2, as
published by the Free Software Foundation.
KMail 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
// Virtual base class for mail folder with .*.index style index
#ifndef kmfolderindex_h
#define kmfolderindex_h
#include "folderstorage.h"
#include "kmmsglist.h"
/**
* @short A FolderStorage with an index for faster access to often used
* message properties..
*
* This class represents a message store which has an index for providing fast
* access to often used message properties, namely those displayed in the list
* of messages (KMHeaders).
*
* @author Don Sanders <sanders@kde.org>
*/
class KMFolderIndex: public FolderStorage
{
Q_OBJECT
//TODO:Have to get rid of this friend declaration and add necessary pure
//virtuals to kmfolder.h so that KMMsgBase::parent() can be a plain KMFolder
//rather than a KMFolderIndex. Need this for database indices.
friend class ::KMMsgBase;
public:
/** This enum indicates the status of the index file. It's returned by
indexStatus().
*/
enum IndexStatus { IndexOk,
IndexMissing,
IndexCorrupt,
IndexTooOld
};
/** Usually a parent is given. But in some cases there is no
fitting parent object available. Then the name of the folder
is used as the absolute path to the folder file. */
KMFolderIndex(KMFolder* folder, const char* name=0);
virtual ~KMFolderIndex();
virtual int count(bool cache = false) const;
virtual KMMsgBase* takeIndexEntry( int idx ) { return mMsgList.take( idx ); }
virtual KMMsgInfo* setIndexEntry( int idx, KMMessage *msg );
virtual void clearIndex(bool autoDelete=true, bool syncDict = false);
virtual void truncateIndex();
virtual const KMMsgBase* getMsgBase(int idx) const { return mMsgList[idx]; }
virtual KMMsgBase* getMsgBase(int idx) { return mMsgList[idx]; }
virtual int find(const KMMsgBase* msg) const { return mMsgList.find((KMMsgBase*)msg); }
int find( const KMMessage * msg ) const { return FolderStorage::find( msg ); }
/** Registered unique serial number for the index file */
int serialIndexId() const { return mIndexId; }
uchar *indexStreamBasePtr() { return mIndexStreamPtr; }
bool indexSwapByteOrder() { return mIndexSwapByteOrder; }
int indexSizeOfLong() { return mIndexSizeOfLong; }
virtual TQString indexLocation() const;
virtual int writeIndex( bool createEmptyIndex = false );
void recreateIndex( bool readIndexAfterwards = true );
void silentlyRecreateIndex();
/** Tests whether the contents of this folder is newer than the index.
Should return IndexTooOld if the index is older than the contents.
Should return IndexMissing if there is contents but no index.
Should return IndexOk if the folder doesn't exist anymore "physically"
or if the index is not older than the contents.
*/
virtual IndexStatus indexStatus() = 0;
public slots:
/** Incrementally update the index if possible else call writeIndex */
virtual int updateIndex();
protected:
bool readIndex();
/** Read index header. Called from within readIndex(). */
bool readIndexHeader(int *gv=0);
/** Create index file from messages file and fill the message-info list
mMsgList. Returns 0 on success and an errno value (see fopen) on
failure. */
virtual int createIndexFromContents() = 0;
bool updateIndexStreamPtr(bool just_close=FALSE);
/** Inserts messages into the message dictionary by iterating over the
* message list. The messages will get new serial numbers. This is only
* used on newly appeared folders, where there is no .ids file yet, or
* when that has been invalidated. */
virtual void fillMessageDict();
/** table of contents file */
FILE* mIndexStream;
/** list of index entries or messages */
KMMsgList mMsgList;
/** offset of header of index file */
off_t mHeaderOffset;
uchar *mIndexStreamPtr;
int mIndexStreamPtrLength, mIndexId;
bool mIndexSwapByteOrder; // Index file was written with swapped byte order
int mIndexSizeOfLong; // Index file was written with longs of this size
private:
void updateInvitationAndAddressFieldsFromContents();
};
#endif /*kmfolderindex_h*/
|