diff --git a/actionscheduler.cpp b/actionscheduler.cpp index 07ad5359d..2600c7d87 100644 --- a/actionscheduler.cpp +++ b/actionscheduler.cpp @@ -569,6 +569,7 @@ void ActionScheduler::filterMessage() (!mAccount || (mAccount && (*mFilterIt).applyOnAccount(mAccountId)))) || ((mSet & KMFilterMgr::Explicit) && (*mFilterIt).applyOnExplicit())) { + // filter is applicable if ( FilterLog::instance()->isLogging() ) { QString logText( i18n( "Evaluating filter rules: " ) ); diff --git a/kmacctimap.cpp b/kmacctimap.cpp index 97c0b27bf..239b5b7f9 100644 --- a/kmacctimap.cpp +++ b/kmacctimap.cpp @@ -398,11 +398,13 @@ void KMAcctImap::postProcessNewMail( KMFolder * folder ) QValueListIterator filterIt = mFilterSerNums.begin(); QValueList inTransit; - if (ActionScheduler::isEnabled()) { + if (ActionScheduler::isEnabled() || + kmkernel->filterMgr()->atLeastOneOnlineImapFolderTarget()) { KMFilterMgr::FilterSet set = KMFilterMgr::Inbound; QValueList filters = kmkernel->filterMgr()->filters(); if (!mScheduler) { mScheduler = new KMail::ActionScheduler( set, filters ); + mScheduler->setAccountId( id() ); connect( mScheduler, SIGNAL(filtered(Q_UINT32)), this, SLOT(slotFiltered(Q_UINT32)) ); } else { mScheduler->setFilterList( filters ); @@ -440,7 +442,8 @@ void KMAcctImap::postProcessNewMail( KMFolder * folder ) continue; } - if (ActionScheduler::isEnabled()) { + if (ActionScheduler::isEnabled() || + kmkernel->filterMgr()->atLeastOneOnlineImapFolderTarget()) { mScheduler->execFilters( msg ); } else { if (msg->transferInProgress()) { diff --git a/kmfilteraction.cpp b/kmfilteraction.cpp index 4cf918b32..554e1e321 100644 --- a/kmfilteraction.cpp +++ b/kmfilteraction.cpp @@ -279,8 +279,6 @@ QWidget* KMFilterActionWithFolder::createParamWidget( QWidget* parent ) const { FolderRequester *req = new FolderRequester( parent, kmkernel->getKMMainWidget()->folderTree() ); - if (!ActionScheduler::isEnabled()) - req->setShowImapFolders( false ); setParamWidgetValue( req ); return req; } @@ -1328,7 +1326,18 @@ KMFilterAction::ReturnCode KMFilterActionMove::process(KMMessage* msg) const if ( !mFolder ) return ErrorButGoOn; - MessageProperty::setFilterFolder( msg, mFolder ); + ActionScheduler *handler = MessageProperty::filterHandler( msg ); + if (handler) { + MessageProperty::setFilterFolder( msg, mFolder ); + } else { + // The old filtering system does not support online imap targets. + // Skip online imap targets when using the old system. + KMFolder *check; + check = kmkernel->imapFolderMgr()->findIdString( argsAsString() ); + if (mFolder && (check != mFolder)) { + MessageProperty::setFilterFolder( msg, mFolder ); + } + } return GoOn; } diff --git a/kmfilterdlg.cpp b/kmfilterdlg.cpp index 42a352ce5..929cf76b7 100644 --- a/kmfilterdlg.cpp +++ b/kmfilterdlg.cpp @@ -721,6 +721,14 @@ void KMFilterListBox::slotApplyFilterChanges() // block attemts to use filters (currently a no-op) fm->beginUpdate(); fm->setFilters( newFilters ); + if (fm->atLeastOneOnlineImapFolderTarget()) { + QString str = i18n("At least one filter targets a folder on an online " + "IMAP account. Such filters will only be applied " + "when manually filtering and when filtering " + "incoming online IMAP mail."); + KMessageBox::information( this, str, QString::null, + "filterDlgOnlineImapCheck" ); + } // allow usage of the filters again. fm->endUpdate(); fm->writeConfig(); diff --git a/kmfiltermgr.cpp b/kmfiltermgr.cpp index c146303f0..b0fb26f69 100644 --- a/kmfiltermgr.cpp +++ b/kmfiltermgr.cpp @@ -15,6 +15,7 @@ using KMail::FilterLog; #include "kmfolderindex.h" #include "messageproperty.h" using KMail::MessageProperty; +#include "kmfoldermgr.h" // other KDE headers #include @@ -34,6 +35,8 @@ KMFilterMgr::KMFilterMgr( bool popFilter ) : mEditDialog( 0 ), bPopFilter( popFilter ), mShowLater( false ), + mDirtyBufferedFolderTarget( true ), + mBufferedFolderTarget( true ), mRefCount( 0 ) { if (bPopFilter) @@ -53,6 +56,7 @@ KMFilterMgr::~KMFilterMgr() void KMFilterMgr::clear() { + mDirtyBufferedFolderTarget = true; for ( QValueListIterator it = mFilters.begin() ; it != mFilters.end() ; ++it ) { delete *it; @@ -300,6 +304,33 @@ bool KMFilterMgr::atLeastOneIncomingFilterAppliesTo( unsigned int accountID ) co return false; } +bool KMFilterMgr::atLeastOneOnlineImapFolderTarget() +{ + if (!mDirtyBufferedFolderTarget) + return mBufferedFolderTarget; + + mDirtyBufferedFolderTarget = false; + + QValueListConstIterator it = mFilters.constBegin(); + for ( ; it != mFilters.constEnd() ; ++it ) { + KMFilter *filter = *it; + QPtrListIterator jt( *filter->actions() ); + for ( jt.toFirst() ; jt.current() ; ++jt ) { + KMFilterActionWithFolder *f = dynamic_cast(*jt); + if (!f) + continue; + QString name = f->argsAsString(); + KMFolder *folder = kmkernel->imapFolderMgr()->findIdString( name ); + if (folder) { + mBufferedFolderTarget = true; + return true; + } + } + } + mBufferedFolderTarget = false; + return false; +} + //----------------------------------------------------------------------------- void KMFilterMgr::ref(void) { @@ -388,6 +419,7 @@ const QString KMFilterMgr::createUniqueName( const QString & name ) void KMFilterMgr::appendFilters( const QValueList &filters, bool replaceIfNameExists ) { + mDirtyBufferedFolderTarget = true; beginUpdate(); if ( replaceIfNameExists ) { QValueListConstIterator it1 = filters.constBegin(); @@ -420,6 +452,7 @@ void KMFilterMgr::slotFolderRemoved( KMFolder * aFolder ) //----------------------------------------------------------------------------- bool KMFilterMgr::folderRemoved(KMFolder* aFolder, KMFolder* aNewFolder) { + mDirtyBufferedFolderTarget = true; bool rem = false; QValueListConstIterator it = mFilters.constBegin(); for ( ; it != mFilters.constEnd() ; ++it ) diff --git a/kmfiltermgr.h b/kmfiltermgr.h index 9a708e8a4..81e5236d5 100644 --- a/kmfiltermgr.h +++ b/kmfiltermgr.h @@ -76,6 +76,10 @@ public: * for example; * */ bool atLeastOneIncomingFilterAppliesTo( unsigned int accountID ) const; + /** Returns whether at least one filter targets a folder on an + * online IMAP account. + * */ + bool atLeastOneOnlineImapFolderTarget(); /** Check for existing filters with the &p name and extend the "name" to "name (i)" until no match is found for i=1..n */ @@ -177,6 +181,9 @@ private: QValueList mFilters; bool bPopFilter; bool mShowLater; + bool mDirtyBufferedFolderTarget; + bool mBufferedFolderTarget; + int mRefCount; }; diff --git a/kmheaders.cpp b/kmheaders.cpp index b88cb0ad6..68e0650d4 100644 --- a/kmheaders.cpp +++ b/kmheaders.cpp @@ -1314,7 +1314,9 @@ void KMHeaders::setFolderInfoStatus () //----------------------------------------------------------------------------- void KMHeaders::applyFiltersOnMsg() { - if (ActionScheduler::isEnabled()) { // uses action scheduler + if (ActionScheduler::isEnabled() || + kmkernel->filterMgr()->atLeastOneOnlineImapFolderTarget()) { + // uses action scheduler KMFilterMgr::FilterSet set = KMFilterMgr::Explicit; QValueList filters = kmkernel->filterMgr()->filters(); ActionScheduler *scheduler = new ActionScheduler( set, filters, this );