kmmsgindex.h
00001
00002
00003
00004
00005
00006
00007 #ifndef kmmsgindex_h
00008 #define kmmsgindex_h
00009
00010 #include "kmfolder.h"
00011
00012 #include <qmap.h>
00013 #include <qobject.h>
00014 #include <qstring.h>
00015 #include <qintdict.h>
00016 #include <qdatetime.h>
00017 #include <qvaluelist.h>
00018 #include <qvaluestack.h>
00019 #include <qguardedptr.h>
00020
00021 class KMMsgIndexRef;
00022 class KMIndexSearchTarget;
00023 class KMSearchPattern;
00024 class KMSearchRule;
00025 class KMSearch;
00026
00027 class KMMsgIndex : public QObject
00028 {
00029 Q_OBJECT
00030 enum { INDEX_IDLE, INDEX_RESTORE, INDEX_CREATE } mIndexState;
00031 QValueList<QGuardedPtr<KMFolder> > mOpenedFolders;
00032
00033
00034 struct {
00035 int fd;
00036 Q_INT32 count, used, indexed, removed;
00037 KMMsgIndexRef *ref;
00038 QString loc;
00039 } mTermIndex;
00040 struct {
00041 int fd;
00042 QString loc;
00043 QMap<QCString, int> body;
00044 struct {
00045 int next_hnum;
00046 QMap<QCString, Q_UINT16> header_lookup;
00047 QMap<Q_UINT16, QMap<QCString, int> > headers;
00048 } h;
00049 } mTermTOC;
00050 struct {
00051 int fd;
00052 QString loc;
00053 QIntDict<void> known;
00054 } mTermProcessed;
00055
00056
00057 struct {
00058 int timer_id;
00059 QValueStack<Q_UINT32> serNums;
00060 QValueStack<QGuardedPtr<KMFolder> > folders;
00061
00062 } create;
00063 struct {
00064 int timer_id;
00065 bool reading_processed, restart_index;
00066 } restore;
00067 int delay_cnt;
00068 QTime mLastSearch;
00069 QIntDict<KMIndexSearchTarget> mActiveSearches;
00070
00071 public:
00072 KMMsgIndex(QObject *parent=NULL, const char *name=NULL);
00073 ~KMMsgIndex() { reset(); }
00074
00075 void init();
00076 void remove();
00077
00078 bool canHandleQuery(KMSearchRule *);
00079 bool canHandleQuery(KMSearchPattern *);
00080 QValueList<Q_UINT32> query(KMSearchRule *, bool full_phrase_search=TRUE);
00081 QValueList<Q_UINT32> query(KMSearchPattern *, bool full_phras_search=TRUE);
00082
00083
00084 bool startQuery(KMSearch *);
00085 bool stopQuery(KMSearch *);
00086 bool stopQuery(int id) { return mActiveSearches.remove(id); }
00087
00088
00089 void cleanUp();
00090
00091 private:
00092
00093 bool recreateIndex();
00094 void readIndex();
00095 void syncIndex();
00096
00097 void flush();
00098 void reset(bool =TRUE);
00099
00100 bool createState(bool =TRUE);
00101 bool restoreState(bool =TRUE);
00102
00103 int addBucket(int, Q_UINT32);
00104 QValueList<Q_UINT32> find(QString, bool, KMSearchRule *, bool =FALSE,
00105 Q_UINT16 =0);
00106 void values(int, int, QValueList<Q_UINT32> &);
00107 void values(int, int, QIntDict<void> &);
00108
00109 int processMsg(Q_UINT32);
00110 bool addHeaderTerm(Q_UINT16, const char *, uchar, Q_UINT32);
00111 bool addBodyTerm(const char *, uchar, Q_UINT32);
00112 int allocTermChunk(int);
00113
00114 bool isTimeForClean();
00115 bool isKillTerm(const char *, uchar);
00116 bool isKillHeader(const char *, uchar);
00117
00118 protected:
00119 void timerEvent(QTimerEvent *);
00120
00121 private slots:
00122 void slotAddMsg(KMFolder *, Q_UINT32);
00123 void slotRemoveMsg(KMFolder *, Q_UINT32);
00124 };
00125
00126 class KMIndexSearchTarget : public QObject
00127 {
00128 Q_OBJECT
00129 int mId;
00130 bool mVerifyResult;
00131 QValueList<QGuardedPtr<KMFolder> > mOpenedFolders;
00132 QValueStack<Q_UINT32> mSearchResult;
00133 QGuardedPtr<KMSearch> mSearch;
00134 public:
00135 KMIndexSearchTarget(KMSearch *);
00136 ~KMIndexSearchTarget();
00137
00138 void stop(bool stop_search=TRUE) {
00139 if(stop_search && mSearch)
00140 emit proxyFinished(true);
00141 mSearch = NULL;
00142 }
00143 KMSearch *search() const { return mSearch; }
00144 int id() const { return mId; }
00145
00146 protected:
00147 void timerEvent(QTimerEvent *);
00148
00149 signals:
00150 void proxyFound(Q_UINT32);
00151 void proxyFinished(bool);
00152 };
00153
00154 #endif
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
This file is part of the documentation for kmail Library Version 3.2.2.