00001
00002
00003
00004
00005
00006
#ifndef kmfoldersearch_h
00007
#define kmfoldersearch_h
00008
00009
#include <qguardedptr.h>
00010
#include <qvaluelist.h>
00011
#include <qvaluevector.h>
00012
#include <qvaluestack.h>
00013
#include "kmfolder.h"
00014
00024
typedef QValueList<Q_UINT32> SerNumList;
00025
class KMSearchPattern;
00026
class KMFolderImap;
00027
class QTimer;
00028
00029
namespace KMail {
00030
class AttachmentStrategy;
00031 }
00032
using KMail::AttachmentStrategy;
00033
00034
class KMSearch:
public QObject
00035 {
00036 Q_OBJECT
00037
00038
public:
00039 KMSearch(QObject * parent = 0,
const char * name = 0);
00040 ~KMSearch();
00041
00042
bool write(QString location)
const;
00043
bool read(QString location);
00044
bool recursive()
const {
return mRecursive; }
00045
void setRecursive(
bool recursive) {
if (running()) stop(); mRecursive = recursive; }
00046
KMFolder* root()
const {
return mRoot; }
00047
void setRoot(
KMFolder *folder) {
if (running()) stop(); mRoot = folder; }
00048
bool inScope(
KMFolder* folder)
const;
00049
00050
void setSearchPattern(
KMSearchPattern *searchPattern);
00051
KMSearchPattern* searchPattern()
const {
return mSearchPattern; }
00052
void start();
00053
bool running()
const {
return mRunning; }
00054
void stop();
00055
int foundCount()
const {
return mFoundCount; }
00056
int searchedCount()
const {
return mSearchedCount; }
00057 QString currentFolder()
const {
return mLastFolder; }
00058
00059 signals:
00060
void found(Q_UINT32 serNum);
00061
void finished(
bool success);
00062
00063
protected slots:
00064
void slotProcessNextBatch();
00065
void slotFolderComplete(KMFolderImap *folder,
bool success);
00066
00067
protected:
00068
friend class KMIndexSearchTarget;
00069
void setRunning(
bool b) { mRunning = b; }
00070
void setFoundCount(
int f) { mFoundCount = f; }
00071
void setSearchedCount(
int f) { mSearchedCount = f; }
00072
void setCurrentFolder(
const QString &f) { mLastFolder = f; }
00073
00074
private:
00075
int mRemainingMessages;
00076
int mRemainingFolders;
00077
bool mRecursive, mRunning, mIdle, mRunByIndex;
00078 QGuardedPtr<KMFolder> mRoot;
00079
KMSearchPattern* mSearchPattern;
00080 QValueList<QGuardedPtr<KMFolder> > mFolders, mOpenedFolders;
00081 QValueList<QGuardedPtr<KMFolderImap> > mIncompleteFolders;
00082 SerNumList mSerNums;
00083 QString mLastFolder;
00084
int mSearchedCount, mFoundCount;
00085 QTimer *mProcessNextBatchTimer;
00086 };
00087
00088
class KMFolderSearch:
public KMFolder
00089 {
00090 Q_OBJECT
00091
friend class KMFolderSearchJob;
00092
public:
00093 KMFolderSearch(
KMFolderDir* parent=0,
const QString& name=QString::null);
00094
virtual ~KMFolderSearch();
00095
00097
virtual KMFolderType
folderType()
const {
return KMFolderTypeSearch; }
00098
00099
00100
void setSearch(KMSearch *search);
00101
00102
const KMSearch* search() const;
00103
00104
void stopSearch() {
if (mSearch) mSearch->stop(); }
00105
00106
virtual KMMessage* getMsg(
int idx);
00107
virtual void ignoreJobsForMessage( KMMessage* );
00108
00109
protected slots:
00110
00111
bool readSearch();
00112
00113
void executeSearch();
00114
00115
void searchFinished(
bool success);
00116
00117
void examineAddedMessage(
KMFolder *folder, Q_UINT32 serNum);
00118
00119
void examineCompletedFolder(KMFolderImap *folder,
bool success);
00120
00121
void examineRemovedMessage(
KMFolder *folder, Q_UINT32 serNum);
00122
00123
void examineChangedMessage(
KMFolder *folder, Q_UINT32 serNum,
int delta);
00124
00125
void examineInvalidatedFolder(
KMFolder *folder);
00126
00127
void examineRemovedFolder(
KMFolder *folder);
00128
00129
void propagateHeaderChanged(
KMFolder *folder,
int idx);
00130
00131
public slots:
00132
00133
00134
void addSerNum(Q_UINT32 serNum);
00135
00136
00137
void removeSerNum(Q_UINT32 serNum);
00138
00140
virtual int updateIndex();
00141
00142
public:
00143
00144
virtual QCString& getMsgString(
int idx, QCString& mDest);
00145
virtual int addMsg(KMMessage* msg,
int* index_return = 0);
00146
virtual int open();
00147
virtual int canAccess();
00148
virtual void sync();
00149
virtual void close(
bool force=FALSE);
00150
virtual int create(
bool imap = FALSE);
00151
virtual int compact();
00152
virtual bool isReadOnly() const;
00153 virtual QCString protocol()
const {
return "search"; }
00154
virtual const KMMsgBase* getMsgBase(
int idx)
const;
00155
virtual KMMsgBase* getMsgBase(
int idx);
00156
virtual int find(
const KMMsgBase* msg)
const;
00157
virtual QString
indexLocation() const;
00158 virtual
int writeIndex(
bool createEmptyIndex = false );
00159 DwString getDwString(
int idx);
00160 Q_UINT32 serNum(
int idx) {
return mSerNums[idx]; }
00161
00162
protected:
00163
virtual FolderJob* doCreateJob(KMMessage *msg, FolderJob::JobType jt,
00164
KMFolder *folder, QString partSpecifier,
00165
const AttachmentStrategy *as )
const;
00166
virtual FolderJob* doCreateJob(QPtrList<KMMessage>& msgList,
const QString& sets,
00167 FolderJob::JobType jt,
KMFolder *folder)
const;
00168
virtual KMMessage* readMsg(
int idx);
00169
virtual bool readIndex();
00170
virtual int removeContents();
00171
virtual int expungeContents();
00172
virtual int count(
bool cache =
false)
const;
00173
virtual KMMsgBase* takeIndexEntry(
int idx);
00174
virtual KMMsgInfo* setIndexEntry(
int idx, KMMessage *msg);
00175
virtual void clearIndex(
bool autoDelete=
true,
bool syncDict =
false);
00176
virtual void fillDictFromIndex(KMMsgDict*);
00177
virtual void truncateIndex();
00178
00179
private:
00180 QValueVector<Q_UINT32> mSerNums;
00181 QValueList<QGuardedPtr<KMFolder> > mFolders;
00182 QValueStack<Q_UINT32> mUnexaminedMessages;
00183 FILE *mIdsStream;
00184 KMSearch *mSearch;
00185
bool mInvalid, mUnlinked;
00186
bool mTempOpened;
00187 QTimer *mExecuteSearchTimer;
00188 };
00189
#endif
00190