kmail
kmfoldersearch.h00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef kmfoldersearch_h
00021 #define kmfoldersearch_h
00022
00023 #include <tqguardedptr.h>
00024 #include <tqvaluelist.h>
00025 #include <tqvaluevector.h>
00026 #include <tqvaluestack.h>
00027 #include <tqmap.h>
00028 #include "kmfolder.h"
00029 #include "folderstorage.h"
00030
00040 typedef TQValueList<TQ_UINT32> SerNumList;
00041 class KMSearchPattern;
00042 class KMFolderImap;
00043 class KMFolderSearchJob;
00044 class KMIndexSearchTarget;
00045 class TQTimer;
00046
00047 namespace KMail {
00048 class AttachmentStrategy;
00049 }
00050 using KMail::AttachmentStrategy;
00051
00052 class KMSearch: public TQObject
00053 {
00054 Q_OBJECT
00055
00056
00057 public:
00058 KMSearch(TQObject * parent = 0, const char * name = 0);
00059 ~KMSearch();
00060
00061 bool write(TQString location) const;
00062 bool read(TQString location);
00063 bool recursive() const { return mRecursive; }
00064 void setRecursive(bool recursive) { if (running()) stop(); mRecursive = recursive; }
00065 KMFolder* root() const { return mRoot; }
00066 void setRoot(KMFolder *folder) { if (running()) stop(); mRoot = folder; }
00067 bool inScope(KMFolder* folder) const;
00068
00069 void setSearchPattern(KMSearchPattern *searchPattern);
00070 KMSearchPattern* searchPattern() const { return mSearchPattern; }
00071 void start();
00072 bool running() const { return mRunning; }
00073 void stop();
00074 int foundCount() const { return mFoundCount; }
00075 int searchCount() const { return mSearchCount; }
00076 TQString currentFolder() const { return mLastFolder; }
00077
00078 public slots:
00079 void indexFinished();
00080
00081 signals:
00082 void found(TQ_UINT32 serNum);
00083 void finished(bool success);
00084
00085 protected slots:
00086 void slotProcessNextBatch();
00087 void slotSearchFolderResult( KMFolder*, TQValueList<TQ_UINT32>,
00088 const KMSearchPattern*, bool );
00089
00090 protected:
00091 friend class ::KMIndexSearchTarget;
00092 void setRunning(bool b) { mRunning = b; }
00093 void setFoundCount(int f) { mFoundCount = f; }
00094 void setCurrentFolder(const TQString &f) { mLastFolder = f; }
00095
00096 private:
00097 int mRemainingFolders;
00098 bool mRecursive, mRunning, mIdle, mRunByIndex;
00099 TQGuardedPtr<KMFolder> mRoot;
00100 KMSearchPattern* mSearchPattern;
00101 TQValueList<TQGuardedPtr<KMFolder> > mFolders, mOpenedFolders;
00102 TQValueList<TQGuardedPtr<KMFolderImap> > mIncompleteFolders;
00103 SerNumList mSerNums;
00104 TQString mLastFolder;
00105 int mFoundCount;
00106 int mSearchCount;
00107 TQTimer *mProcessNextBatchTimer;
00108 };
00109
00110 class KMFolderSearch: public FolderStorage
00111 {
00112 Q_OBJECT
00113
00114 friend class ::KMFolderSearchJob;
00115 public:
00116 KMFolderSearch(KMFolder* folder, const char* name=0);
00117 virtual ~KMFolderSearch();
00118
00120 virtual KMFolderType folderType() const { return KMFolderTypeSearch; }
00121
00122
00123 void setSearch(KMSearch *search);
00124
00125 const KMSearch* search() const;
00126
00127 void stopSearch() { if (mSearch) mSearch->stop(); }
00128
00129 virtual KMMessage* getMsg(int idx);
00130 virtual void ignoreJobsForMessage( KMMessage* );
00131
00132 virtual void tryReleasingFolder(KMFolder* folder);
00133
00135 virtual bool isMoveable() const { return false; }
00136
00137 protected slots:
00138
00139 bool readSearch();
00140
00141 void executeSearch();
00142
00143 void searchFinished(bool success);
00144
00145 void examineAddedMessage(KMFolder *folder, TQ_UINT32 serNum);
00146
00147 void examineRemovedMessage(KMFolder *folder, TQ_UINT32 serNum);
00148
00149 void examineChangedMessage(KMFolder *folder, TQ_UINT32 serNum, int delta);
00150
00151 void examineInvalidatedFolder(KMFolder *folder);
00152
00153 void examineRemovedFolder(KMFolder *folder);
00154
00155 void propagateHeaderChanged(KMFolder *folder, int idx);
00156
00157 public slots:
00158
00159
00160 void addSerNum(TQ_UINT32 serNum);
00161
00162
00163 void removeSerNum(TQ_UINT32 serNum);
00164
00166 virtual int updateIndex();
00167
00168
00169 void slotSearchExamineMsgDone( KMFolder*, TQ_UINT32 serNum,
00170 const KMSearchPattern*, bool );
00171
00172 public:
00173
00174 virtual int addMsg(KMMessage* msg, int* index_return = 0);
00175 virtual int open(const char *owner);
00176 virtual int canAccess();
00177 virtual void sync();
00178 virtual void reallyDoClose(const char* owner);
00179 virtual int create();
00180 virtual int compact( bool );
00181 virtual bool isReadOnly() const;
00182 virtual const KMMsgBase* getMsgBase(int idx) const;
00183 virtual KMMsgBase* getMsgBase(int idx);
00184 virtual int find(const KMMsgBase* msg) const;
00185 virtual TQString indexLocation() const;
00186 virtual int writeIndex( bool createEmptyIndex = false );
00187 DwString getDwString(int idx);
00188 TQ_UINT32 serNum(int idx) { return mSerNums[idx]; }
00189
00190 protected:
00191 virtual FolderJob* doCreateJob(KMMessage *msg, FolderJob::JobType jt,
00192 KMFolder *folder, TQString partSpecifier,
00193 const AttachmentStrategy *as ) const;
00194 virtual FolderJob* doCreateJob(TQPtrList<KMMessage>& msgList, const TQString& sets,
00195 FolderJob::JobType jt, KMFolder *folder) const;
00196 virtual KMMessage* readMsg(int idx);
00197 virtual bool readIndex();
00198 virtual int removeContents();
00199 virtual int expungeContents();
00200 virtual int count(bool cache = false) const;
00201 virtual KMMsgBase* takeIndexEntry(int idx);
00202 virtual KMMsgInfo* setIndexEntry(int idx, KMMessage *msg);
00203 virtual void clearIndex(bool autoDelete=true, bool syncDict = false);
00204 virtual void truncateIndex();
00205
00206 private:
00207 TQValueVector<TQ_UINT32> mSerNums;
00208 TQValueList<TQGuardedPtr<KMFolder> > mFolders;
00209 TQValueStack<TQ_UINT32> mUnexaminedMessages;
00210 FILE *mIdsStream;
00211 KMSearch *mSearch;
00212 bool mInvalid, mUnlinked;
00213 bool mTempOpened;
00214 TQTimer *mExecuteSearchTimer;
00215 TQMap<const KMFolder*, unsigned int>mFoldersCurrentlyBeingSearched;
00216 };
00217 #endif
00218
|