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