Make searching with subfolders working in IMAP folders.

svn path=/trunk/kdenetwork/kmail/; revision=131289
wilder-work
Michael Haeckel 25 years ago
parent 527a276574
commit 134f016b05
  1. 3
      kmacctexppop.cpp
  2. 11
      kmacctimap.cpp
  3. 44
      kmfldsearch.cpp
  4. 4
      kmfldsearch.h
  5. 16
      kmfolderimap.cpp
  6. 10
      kmfolderimap.h
  7. 6
      kmfoldertree.cpp

@ -840,7 +840,8 @@ void KMAcctExpPop::slotData( KIO::Job* job, const QByteArray &data)
}
KMBroadcastStatus::instance()->setStatusMsg( msg );
KMBroadcastStatus::instance()->setStatusProgressPercent(
numBytesRead * 100 / numBytesToRead );
(numBytesToRead == 0) ? 50 // We never know what the server tells us
: (numBytesRead * 100 / numBytesToRead) );
}
return;
}

@ -106,7 +106,11 @@ void KMAcctImap::pseudoAssign(KMAccount* account)
killAllJobs();
if (mSlave) KIO::Scheduler::disconnectSlave(mSlave);
mSlave = NULL;
if (mFolder) mFolder->setImapState(KMFolderImap::imapNoInformation);
if (mFolder)
{
mFolder->setContentState(KMFolderImap::imapNoInformation);
mFolder->setSubfolderState(KMFolderImap::imapNoInformation);
}
assert(account->type() == "imap");
KMAcctImap *acct = static_cast<KMAcctImap*>(account);
setName(acct->name());
@ -428,7 +432,8 @@ void KMAcctImap::killAllJobs()
if ((*it).parent)
{
KMFolderImap *fld = (*it).parent;
fld->setImapState(KMFolderImap::imapFinished);
fld->setContentState(KMFolderImap::imapNoInformation);
fld->setSubfolderState(KMFolderImap::imapNoInformation);
fld->sendFolderComplete(FALSE);
fld->quiet(FALSE);
}
@ -499,7 +504,7 @@ void KMAcctImap::processNewMail(bool interactive)
if (folder && !folder->noContent())
{
KMFolderImap *imapFolder = static_cast<KMFolderImap*>(folder);
if (imapFolder->getImapState() != KMFolderImap::imapInProgress)
if (imapFolder->getContentState() != KMFolderImap::imapInProgress)
{
if (imapFolder->isSelected())
imapFolder->getFolder();

@ -255,10 +255,12 @@ void KMFldSearch::slotFolderComplete(KMFolderImap *folder, bool success)
{
disconnect(folder, SIGNAL(folderComplete(KMFolderImap*, bool)),
this, SLOT(slotFolderComplete(KMFolderImap*, bool)));
mFetchingInProgress--;
if (success)
{
searchInFolder(folder);
searchInFolder(folder, mChkSubFolders->isChecked(), FALSE);
if (mFetchingInProgress == 0) searchDone();
}
else
{
@ -270,8 +272,26 @@ void KMFldSearch::slotFolderComplete(KMFolderImap *folder, bool success)
//-----------------------------------------------------------------------------
void KMFldSearch::searchInFolder(QGuardedPtr<KMFolder> aFld, bool recursive)
void KMFldSearch::searchInFolder(QGuardedPtr<KMFolder> aFld, bool recursive,
bool fetchHeaders)
{
if (fetchHeaders && aFld->protocol() == "imap")
{
KMFolder *fld = aFld;
KMFolderImap *imap_folder = static_cast<KMFolderImap*>(fld);
if (imap_folder &&
imap_folder->getContentState() == KMFolderImap::imapNoInformation)
{
mFetchingInProgress++;
imap_folder->open();
connect(imap_folder,
SIGNAL(folderComplete(KMFolderImap *, bool)),
SLOT(slotFolderComplete(KMFolderImap *, bool)));
imap_folder->getFolder();
return;
}
}
KMMessage* msg=0;
int i, num, upd;
QString str;
@ -345,8 +365,6 @@ void KMFldSearch::searchInFolder(QGuardedPtr<KMFolder> aFld, bool recursive)
updStatus();
aFld->close();
if (aFld->protocol() == "imap")
searchDone();
if (!recursive)
return;
@ -428,6 +446,7 @@ void KMFldSearch::slotSearch()
mStopped = false;
mNumMatches = 0;
mSearching = true;
mFetchingInProgress = 0;
mBtnSearch->setEnabled(false);
mBtnStop->setEnabled(true);
@ -452,25 +471,10 @@ void KMFldSearch::slotSearch()
return;
}
if (folder->protocol() == "imap")
{
KMFolderImap *imap_folder = static_cast<KMFolderImap*>(folder);
if (imap_folder &&
imap_folder->getImapState()== KMFolderImap::imapNoInformation)
{
imap_folder->open();
connect(imap_folder,
SIGNAL(folderComplete(KMFolderImap *, bool)),
SLOT(slotFolderComplete(KMFolderImap *, bool)));
imap_folder->getFolder();
return;
}
}
searchInFolder(folder, mChkSubFolders->isChecked());
}
searchDone();
if (!mFetchingInProgress) searchDone();
}
//-----------------------------------------------------------------------------

@ -58,7 +58,8 @@ protected:
virtual bool searchInMessage(KMMessage*, const QCString&);
/** Search for matches in given folder. Adds matches to listbox mLbxMatches. */
virtual void searchInFolder(QGuardedPtr<KMFolder>, bool recursive = true);
virtual void searchInFolder(QGuardedPtr<KMFolder>, bool recursive = true,
bool fetchHeaders = true);
/** Search for matches in all folders. Calls searchInFolder() for every
folder. */
@ -84,6 +85,7 @@ protected:
bool mSearching;
bool mStopped;
bool mCloseRequested;
int mFetchingInProgress;
int mNumRules;
int mNumMatches;
int mCount;

@ -38,7 +38,8 @@
KMFolderImap::KMFolderImap(KMFolderDir* aParent, const QString& aName)
: KMFolderImapInherited(aParent, aName)
{
mImapState = imapNoInformation;
mContentState = imapNoInformation;
mSubfolderState = imapNoInformation;
mAccount = NULL;
mIsSelected = FALSE;
mLastUid = 0;
@ -351,7 +352,7 @@ void KMFolderImap::listDirectory(KMFolderTreeItem * fti, bool secondStep)
{
kdDebug(5006) << "KMFolderImap::listDirectory " << label() << ", "
<< secondStep << endl;
mImapState = imapInProgress;
mSubfolderState = imapInProgress;
KMAcctImap::jobData jd;
jd.parent = this;
jd.total = 1; jd.done = 0;
@ -392,7 +393,7 @@ void KMFolderImap::slotListResult(KIO::Job * job)
job->showErrorDialog();
if (job->error() == KIO::ERR_SLAVE_DIED) mAccount->slaveDied();
}
mImapState = imapFinished;
mSubfolderState = imapFinished;
bool it_inboxOnly = (*it).inboxOnly;
mAccount->mapJobData.remove(it);
if (!job->error())
@ -601,10 +602,11 @@ void KMFolderImap::getFolder()
mGuessedUnreadMsgs = -1;
if (mNoContent)
{
mContentState = imapFinished;
emit folderComplete(this, true);
return;
}
mImapState = imapInProgress;
mContentState = imapInProgress;
checkValidity();
}
@ -706,7 +708,7 @@ void KMFolderImap::slotListFolderResult(KIO::Job * job)
if (jd.total == 0)
{
quiet(FALSE);
mImapState = imapFinished;
mContentState = imapFinished;
emit folderComplete(this, TRUE);
mAccount->mapJobData.remove(it);
mAccount->displayProgress();
@ -833,9 +835,9 @@ void KMFolderImap::slotGetMessagesResult(KIO::Job * job)
{
job->showErrorDialog();
if (job->error() == KIO::ERR_SLAVE_DIED) mAccount->slaveDied();
mImapState = imapNoInformation;
mContentState = imapNoInformation;
emit folderComplete(this, FALSE);
} else mImapState = imapFinished;
} else mContentState = imapFinished;
quiet(FALSE);
mAccount->mapJobData.remove(it);
mAccount->displayProgress();

@ -78,8 +78,12 @@ class KMFolderImap : public KMFolderMbox
public:
enum imapState { imapNoInformation=0, imapInProgress=1, imapFinished=2 };
virtual imapState getImapState() { return mImapState; }
virtual void setImapState(imapState state) { mImapState = state; }
virtual imapState getContentState() { return mContentState; }
virtual void setContentState(imapState state) { mContentState = state; }
virtual imapState getSubfolderState() { return mSubfolderState; }
virtual void setSubfolderState(imapState state) { mSubfolderState = state; }
/** Usually a parent is given. But in some cases there is no
fitting parent object available. Then the name of the folder
@ -311,7 +315,7 @@ protected slots:
protected:
QString mImapPath;
ulong mLastUid;
imapState mImapState;
imapState mContentState, mSubfolderState;
QStringList mSubfolderNames, mSubfolderPaths, mSubfolderMimeTypes;
bool mHasInbox;
bool mIsSelected;

@ -724,7 +724,7 @@ void KMFolderTree::doFolderSelected( QListViewItem* qlvi )
{
KMFolderImap *imap_folder = static_cast<KMFolderImap*>(fti->folder);
imap_folder->setSelected(TRUE);
if (imap_folder->getImapState() != KMFolderImap::imapInProgress)
if (imap_folder->getContentState() != KMFolderImap::imapInProgress)
imap_folder->getFolder();
}
if (folder && (folder->countUnread() > 0) ) {
@ -1236,7 +1236,7 @@ void KMFolderTree::slotFolderExpanded( QListViewItem * item )
&& fti->folder->protocol() == "imap")
{
KMFolderImap *folder = static_cast<KMFolderImap*>(fti->folder);
if (folder->getImapState() == KMFolderImap::imapNoInformation)
if (folder->getSubfolderState() == KMFolderImap::imapNoInformation)
folder->listDirectory( fti );
}
}
@ -1250,7 +1250,7 @@ void KMFolderTree::slotFolderCollapsed( QListViewItem * item )
&& fti->folder->protocol() == "imap")
{
KMFolderImap *folder = static_cast<KMFolderImap*>(fti->folder);
folder->setImapState(KMFolderImap::imapNoInformation);
folder->setSubfolderState(KMFolderImap::imapNoInformation);
}
}

Loading…
Cancel
Save