diff --git a/kmacctexppop.cpp b/kmacctexppop.cpp index e87b3ae3b..7aae6d71b 100644 --- a/kmacctexppop.cpp +++ b/kmacctexppop.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; } diff --git a/kmacctimap.cpp b/kmacctimap.cpp index f30eb43d5..4ee1d9ab9 100644 --- a/kmacctimap.cpp +++ b/kmacctimap.cpp @@ -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(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(folder); - if (imapFolder->getImapState() != KMFolderImap::imapInProgress) + if (imapFolder->getContentState() != KMFolderImap::imapInProgress) { if (imapFolder->isSelected()) imapFolder->getFolder(); diff --git a/kmfldsearch.cpp b/kmfldsearch.cpp index 4c055913e..ab43bdfb7 100644 --- a/kmfldsearch.cpp +++ b/kmfldsearch.cpp @@ -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 aFld, bool recursive) +void KMFldSearch::searchInFolder(QGuardedPtr aFld, bool recursive, + bool fetchHeaders) { + if (fetchHeaders && aFld->protocol() == "imap") + { + KMFolder *fld = aFld; + KMFolderImap *imap_folder = static_cast(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 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(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(); } //----------------------------------------------------------------------------- diff --git a/kmfldsearch.h b/kmfldsearch.h index d947d1813..09c870f16 100644 --- a/kmfldsearch.h +++ b/kmfldsearch.h @@ -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, bool recursive = true); + virtual void searchInFolder(QGuardedPtr, 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; diff --git a/kmfolderimap.cpp b/kmfolderimap.cpp index adc203218..f2b59440c 100644 --- a/kmfolderimap.cpp +++ b/kmfolderimap.cpp @@ -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(); diff --git a/kmfolderimap.h b/kmfolderimap.h index 64c1ff28d..2b84cadb8 100644 --- a/kmfolderimap.h +++ b/kmfolderimap.h @@ -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; diff --git a/kmfoldertree.cpp b/kmfoldertree.cpp index 73595b228..98e7aadd1 100644 --- a/kmfoldertree.cpp +++ b/kmfoldertree.cpp @@ -724,7 +724,7 @@ void KMFolderTree::doFolderSelected( QListViewItem* qlvi ) { KMFolderImap *imap_folder = static_cast(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(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(fti->folder); - folder->setImapState(KMFolderImap::imapNoInformation); + folder->setSubfolderState(KMFolderImap::imapNoInformation); } }