You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
6.4 KiB
192 lines
6.4 KiB
/* Dynamic search folder |
|
* |
|
* Author: Don Sanders <sanders@kde.org> |
|
* License: GPL |
|
*/ |
|
#ifndef kmfoldersearch_h |
|
#define kmfoldersearch_h |
|
|
|
#include <qguardedptr.h> |
|
#include <qvaluelist.h> |
|
#include <qvaluevector.h> |
|
#include <qvaluestack.h> |
|
#include "kmfolder.h" |
|
#include "folderstorage.h" |
|
|
|
/** A search folder is a folder that shows the result of evaluating a |
|
search expression. This folder is dynamically updated as the |
|
search expression is applied to new mail (from a pop or imap server |
|
or from a local account). |
|
|
|
The index for a search folder consists of a cache of serial |
|
numbers of all messages that currently match the search. |
|
**/ |
|
|
|
typedef QValueList<Q_UINT32> SerNumList; |
|
class KMSearchPattern; |
|
class KMFolderImap; |
|
class QTimer; |
|
|
|
namespace KMail { |
|
class AttachmentStrategy; |
|
} |
|
using KMail::AttachmentStrategy; |
|
|
|
class KMSearch: public QObject |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMSearch(QObject * parent = 0, const char * name = 0); |
|
~KMSearch(); |
|
|
|
bool write(QString location) const; |
|
bool read(QString location); |
|
bool recursive() const { return mRecursive; } |
|
void setRecursive(bool recursive) { if (running()) stop(); mRecursive = recursive; } |
|
KMFolder* root() const { return mRoot; } |
|
void setRoot(KMFolder *folder) { if (running()) stop(); mRoot = folder; } |
|
bool inScope(KMFolder* folder) const; |
|
//Takes ownership of @searchPattern |
|
void setSearchPattern(KMSearchPattern *searchPattern); |
|
KMSearchPattern* searchPattern() const { return mSearchPattern; } |
|
void start(); |
|
bool running() const { return mRunning; } |
|
void stop(); |
|
int foundCount() const { return mFoundCount; } |
|
int searchedCount() const { return mSearchedCount; } |
|
QString currentFolder() const { return mLastFolder; } |
|
|
|
signals: |
|
void found(Q_UINT32 serNum); |
|
void finished(bool success); |
|
|
|
protected slots: |
|
void slotProcessNextBatch(); |
|
void slotFolderComplete(KMFolderImap *folder, bool success); |
|
|
|
protected: |
|
friend class KMIndexSearchTarget; |
|
void setRunning(bool b) { mRunning = b; } |
|
void setFoundCount(int f) { mFoundCount = f; } |
|
void setSearchedCount(int f) { mSearchedCount = f; } |
|
void setCurrentFolder(const QString &f) { mLastFolder = f; } |
|
|
|
private: |
|
int mRemainingMessages; |
|
int mRemainingFolders; |
|
bool mRecursive, mRunning, mIdle, mRunByIndex; |
|
QGuardedPtr<KMFolder> mRoot; |
|
KMSearchPattern* mSearchPattern; |
|
QValueList<QGuardedPtr<KMFolder> > mFolders, mOpenedFolders; |
|
QValueList<QGuardedPtr<KMFolderImap> > mIncompleteFolders; |
|
SerNumList mSerNums; |
|
QString mLastFolder; |
|
int mSearchedCount, mFoundCount; |
|
QTimer *mProcessNextBatchTimer; |
|
}; |
|
|
|
class KMFolderSearch: public FolderStorage |
|
{ |
|
Q_OBJECT |
|
friend class KMFolderSearchJob; |
|
public: |
|
KMFolderSearch(KMFolder* folder, const char* name=0); |
|
virtual ~KMFolderSearch(); |
|
|
|
/** Returns the type of this folder */ |
|
virtual KMFolderType folderType() const { return KMFolderTypeSearch; } |
|
|
|
// Sets and runs the search used by the folder |
|
void setSearch(KMSearch *search); |
|
// Returns the current search used by the folder |
|
const KMSearch* search() const; |
|
// Stops the current search |
|
void stopSearch() { if (mSearch) mSearch->stop(); } |
|
|
|
virtual KMMessage* getMsg(int idx); |
|
virtual void ignoreJobsForMessage( KMMessage* ); |
|
|
|
virtual void tryReleasingFolder(KMFolder* folder); |
|
|
|
protected slots: |
|
// Reads search definition for this folder and creates a KMSearch |
|
bool readSearch(); |
|
// Runs the current search again |
|
void executeSearch(); |
|
// Called when the search is finished |
|
void searchFinished(bool success); |
|
// Look at a new message and if it matches search() add it to the cache |
|
void examineAddedMessage(KMFolder *folder, Q_UINT32 serNum); |
|
// Look at all new messages in a completed (imap) folder |
|
void examineCompletedFolder(KMFolderImap *folder, bool success); |
|
// Look at a removed message and remove it from the cache |
|
void examineRemovedMessage(KMFolder *folder, Q_UINT32 serNum); |
|
// Look at a message whose status has changed |
|
void examineChangedMessage(KMFolder *folder, Q_UINT32 serNum, int delta); |
|
// The serial numbers for a folder have been invalidated, deal with it |
|
void examineInvalidatedFolder(KMFolder *folder); |
|
// A folder has been deleted, deal with it |
|
void examineRemovedFolder(KMFolder *folder); |
|
// Propagate the msgHeaderChanged signal |
|
void propagateHeaderChanged(KMFolder *folder, int idx); |
|
|
|
public slots: |
|
// Appends the serial number to the cached list of messages that match |
|
// the search for this folder |
|
void addSerNum(Q_UINT32 serNum); |
|
// Removes the serial number from the cached list of messages that match |
|
// the search for this folder |
|
void removeSerNum(Q_UINT32 serNum); |
|
|
|
/** Incrementally update the index if possible else call writeIndex */ |
|
virtual int updateIndex(); |
|
|
|
public: |
|
//See base class for documentation |
|
virtual QCString& getMsgString(int idx, QCString& mDest); |
|
virtual int addMsg(KMMessage* msg, int* index_return = 0); |
|
virtual int open(); |
|
virtual int canAccess(); |
|
virtual void sync(); |
|
virtual void close(bool force=FALSE); |
|
virtual int create(bool imap = FALSE); |
|
virtual int compact( bool ); |
|
virtual bool isReadOnly() const; |
|
virtual const KMMsgBase* getMsgBase(int idx) const; |
|
virtual KMMsgBase* getMsgBase(int idx); |
|
virtual int find(const KMMsgBase* msg) const; |
|
virtual QString indexLocation() const; |
|
virtual int writeIndex( bool createEmptyIndex = false ); |
|
DwString getDwString(int idx); |
|
Q_UINT32 serNum(int idx) { return mSerNums[idx]; } |
|
|
|
protected: |
|
virtual FolderJob* doCreateJob(KMMessage *msg, FolderJob::JobType jt, |
|
KMFolder *folder, QString partSpecifier, |
|
const AttachmentStrategy *as ) const; |
|
virtual FolderJob* doCreateJob(QPtrList<KMMessage>& msgList, const QString& sets, |
|
FolderJob::JobType jt, KMFolder *folder) const; |
|
virtual KMMessage* readMsg(int idx); |
|
virtual bool readIndex(); |
|
virtual int removeContents(); |
|
virtual int expungeContents(); |
|
virtual int count(bool cache = false) const; |
|
virtual KMMsgBase* takeIndexEntry(int idx); |
|
virtual KMMsgInfo* setIndexEntry(int idx, KMMessage *msg); |
|
virtual void clearIndex(bool autoDelete=true, bool syncDict = false); |
|
virtual void fillDictFromIndex(KMMsgDict*); |
|
virtual void truncateIndex(); |
|
|
|
private: |
|
QValueVector<Q_UINT32> mSerNums; |
|
QValueList<QGuardedPtr<KMFolder> > mFolders; |
|
QValueStack<Q_UINT32> mUnexaminedMessages; |
|
FILE *mIdsStream; |
|
KMSearch *mSearch; |
|
bool mInvalid, mUnlinked; |
|
bool mTempOpened; |
|
QTimer *mExecuteSearchTimer; |
|
}; |
|
#endif /*kmfoldersearch_h*/ |
|
|
|
|