kmail

kmfolderindex.h

Go to the documentation of this file.
00001 /* -*- mode: C++; c-file-style: "gnu" -*-
00002     This file is part of KMail, the KDE mail client.
00003     Copyright (c) 2000 Don Sanders <sanders@kde.org>
00004 
00005     KMail is free software; you can redistribute it and/or modify it
00006     under the terms of the GNU General Public License, version 2, as
00007     published by the Free Software Foundation.
00008 
00009     KMail is distributed in the hope that it will be useful, but
00010     WITHOUT ANY WARRANTY; without even the implied warranty of
00011     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012     General Public License for more details.
00013 
00014     You should have received a copy of the GNU General Public License
00015     along with this program; if not, write to the Free Software
00016     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00017 */
00018 // Virtual base class for mail folder with .*.index style index
00019 
00020 #ifndef kmfolderindex_h
00021 #define kmfolderindex_h
00022 
00023 #include "folderstorage.h"
00024 #include "kmmsglist.h"
00025 
00037 class KMFolderIndex: public FolderStorage
00038 {
00039   Q_OBJECT
00040   //TODO:Have to get rid of this friend declaration and add necessary pure
00041   //virtuals to kmfolder.h so that KMMsgBase::parent() can be a plain KMFolder
00042   //rather than a KMFolderIndex. Need this for database indices.
00043   friend class ::KMMsgBase;
00044 public:
00045 
00049   enum IndexStatus { IndexOk,
00050                      IndexMissing,
00051                      IndexTooOld
00052   };
00053 
00057   KMFolderIndex(KMFolder* folder, const char* name=0);
00058   virtual ~KMFolderIndex();
00059   virtual int count(bool cache = false) const;
00060 
00061   virtual KMMsgBase* takeIndexEntry( int idx ) { return mMsgList.take( idx ); }
00062   virtual KMMsgInfo* setIndexEntry( int idx, KMMessage *msg );
00063   virtual void clearIndex(bool autoDelete=true, bool syncDict = false);
00064   virtual void truncateIndex();
00065 
00066   virtual const KMMsgBase* getMsgBase(int idx) const { return mMsgList[idx]; }
00067   virtual KMMsgBase* getMsgBase(int idx) { return mMsgList[idx]; }
00068 
00069   virtual int find(const KMMsgBase* msg) const { return mMsgList.find((KMMsgBase*)msg); }
00070   int find( const KMMessage * msg ) const { return FolderStorage::find( msg ); }
00071 
00073   int serialIndexId() const { return mIndexId; }
00074 
00075   uchar *indexStreamBasePtr() { return mIndexStreamPtr; }
00076 
00077   bool indexSwapByteOrder() { return mIndexSwapByteOrder; }
00078   int  indexSizeOfLong() { return mIndexSizeOfLong; }
00079 
00080   virtual QString indexLocation() const;
00081   virtual int writeIndex( bool createEmptyIndex = false );
00082 
00083   void recreateIndex();
00084 
00085 public slots:
00087   virtual int updateIndex();
00088 
00089 protected:
00090   bool readIndex();
00091 
00093   bool readIndexHeader(int *gv=0);
00094 
00098   virtual int createIndexFromContents() = 0;
00099 
00100   bool updateIndexStreamPtr(bool just_close=FALSE);
00101 
00108   virtual IndexStatus indexStatus() = 0;
00109 
00114   virtual void fillMessageDict();
00115 
00117   FILE* mIndexStream;
00119   KMMsgList mMsgList;
00120 
00122   off_t mHeaderOffset;
00123 
00124   uchar *mIndexStreamPtr;
00125   int mIndexStreamPtrLength, mIndexId;
00126   bool mIndexSwapByteOrder; // Index file was written with swapped byte order
00127   int mIndexSizeOfLong; // Index file was written with longs of this size
00128 };
00129 
00130 #endif /*kmfolderindex_h*/