diff options
Diffstat (limited to 'kmail/kmfolderindex.h')
-rw-r--r-- | kmail/kmfolderindex.h | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/kmail/kmfolderindex.h b/kmail/kmfolderindex.h new file mode 100644 index 000000000..bb294b233 --- /dev/null +++ b/kmail/kmfolderindex.h @@ -0,0 +1,130 @@ +/* -*- 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, + 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 QString indexLocation() const; + virtual int writeIndex( bool createEmptyIndex = false ); + + void recreateIndex(); + +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); + + /** 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; + + /** 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 +}; + +#endif /*kmfolderindex_h*/ |