211 lines
7.5 KiB
Text
211 lines
7.5 KiB
Text
Index: kmcommands.cpp
|
|
===================================================================
|
|
--- kmail/kmcommands.cpp (Revision 487211)
|
|
+++ kmail/kmcommands.cpp (Arbeitskopie)
|
|
@@ -1496,30 +1496,30 @@
|
|
|
|
void KMMetaFilterActionCommand::start()
|
|
{
|
|
-#if 0 // use action scheduler
|
|
- KMFilterMgr::FilterSet set = KMFilterMgr::All;
|
|
- QPtrList<KMFilter> filters;
|
|
- filters.append( mFilter );
|
|
- ActionScheduler *scheduler = new ActionScheduler( set, filters, mHeaders );
|
|
- scheduler->setAlwaysMatch( true );
|
|
- scheduler->setAutoDestruct( true );
|
|
+ if (ActionScheduler::isEnabled() ) {
|
|
+ // use action scheduler
|
|
+ KMFilterMgr::FilterSet set = KMFilterMgr::All;
|
|
+ QValueList<KMFilter*> filters;
|
|
+ filters.append( mFilter );
|
|
+ ActionScheduler *scheduler = new ActionScheduler( set, filters, mHeaders );
|
|
+ scheduler->setAlwaysMatch( true );
|
|
+ scheduler->setAutoDestruct( true );
|
|
|
|
- int contentX, contentY;
|
|
- HeaderItem *nextItem = mHeaders->prepareMove( &contentX, &contentY );
|
|
- QPtrList<KMMsgBase> msgList = *mHeaders->selectedMsgs(true);
|
|
- mHeaders->finalizeMove( nextItem, contentX, contentY );
|
|
+ int contentX, contentY;
|
|
+ HeaderItem *nextItem = mHeaders->prepareMove( &contentX, &contentY );
|
|
+ QPtrList<KMMsgBase> msgList = *mHeaders->selectedMsgs(true);
|
|
+ mHeaders->finalizeMove( nextItem, contentX, contentY );
|
|
|
|
-
|
|
- for (KMMsgBase *msg = msgList.first(); msg; msg = msgList.next())
|
|
- scheduler->execFilters( msg );
|
|
-#else
|
|
- KMCommand *filterCommand = new KMFilterActionCommand( mMainWidget,
|
|
- *mHeaders->selectedMsgs(), mFilter);
|
|
- filterCommand->start();
|
|
- int contentX, contentY;
|
|
- HeaderItem *item = mHeaders->prepareMove( &contentX, &contentY );
|
|
- mHeaders->finalizeMove( item, contentX, contentY );
|
|
-#endif
|
|
+ for (KMMsgBase *msg = msgList.first(); msg; msg = msgList.next())
|
|
+ scheduler->execFilters( msg );
|
|
+ } else {
|
|
+ KMCommand *filterCommand = new KMFilterActionCommand( mMainWidget,
|
|
+ *mHeaders->selectedMsgs(), mFilter);
|
|
+ filterCommand->start();
|
|
+ int contentX, contentY;
|
|
+ HeaderItem *item = mHeaders->prepareMove( &contentX, &contentY );
|
|
+ mHeaders->finalizeMove( item, contentX, contentY );
|
|
+ }
|
|
}
|
|
|
|
FolderShortcutCommand::FolderShortcutCommand( KMMainWidget *mainwidget,
|
|
Index: kmkernel.cpp
|
|
===================================================================
|
|
--- kmail/kmkernel.cpp (Revision 487211)
|
|
+++ kmail/kmkernel.cpp (Arbeitskopie)
|
|
@@ -1432,11 +1432,11 @@
|
|
the_msgIndex = 0;
|
|
#endif
|
|
|
|
-#if 0
|
|
+//#if 0
|
|
the_weaver = new KPIM::ThreadWeaver::Weaver( this );
|
|
the_weaverLogger = new KPIM::ThreadWeaver::WeaverThreadLogger(this);
|
|
the_weaverLogger->attach (the_weaver);
|
|
-#endif
|
|
+//#endif
|
|
|
|
connect( the_folderMgr, SIGNAL( folderRemoved(KMFolder*) ),
|
|
this, SIGNAL( folderRemoved(KMFolder*) ) );
|
|
Index: kmfilteraction.cpp
|
|
===================================================================
|
|
--- kmail/kmfilteraction.cpp (Revision 487211)
|
|
+++ kmail/kmfilteraction.cpp (Arbeitskopie)
|
|
@@ -1617,6 +1617,9 @@
|
|
FILE *p;
|
|
QByteArray ba;
|
|
|
|
+ // backup the serial number in case the header gets lost
|
|
+ QString origSerNum = mMsg->headerField( "X-KMail-Filtered" );
|
|
+
|
|
p = popen(QFile::encodeName(mCmd), "r");
|
|
int len =100;
|
|
char buffer[100];
|
|
@@ -1630,7 +1633,20 @@
|
|
pclose(p);
|
|
if ( !ba.isEmpty() ) {
|
|
KPIM::ThreadWeaver::debug (1, "PipeJob::run: %s", QString(ba).latin1() );
|
|
+ KMFolder *filterFolder = mMsg->parent();
|
|
+ ActionScheduler *handler = MessageProperty::filterHandler( mMsg->getMsgSerNum() );
|
|
+
|
|
mMsg->fromByteArray( ba );
|
|
+ if ( !origSerNum.isEmpty() )
|
|
+ mMsg->setHeaderField( "X-KMail-Filtered", origSerNum );
|
|
+ if ( filterFolder && handler ) {
|
|
+ bool oldStatus = handler->ignoreChanges( true );
|
|
+ filterFolder->take( filterFolder->find( mMsg ) );
|
|
+ filterFolder->addMsg( mMsg );
|
|
+ handler->ignoreChanges( oldStatus );
|
|
+ } else {
|
|
+ kdDebug(5006) << "Warning: Cannot refresh the message from the external filter." << endl;
|
|
+ }
|
|
}
|
|
|
|
KPIM::ThreadWeaver::debug (1, "PipeJob::run: done.\n" );
|
|
Index: actionscheduler.h
|
|
===================================================================
|
|
--- kmail/actionscheduler.h (Revision 487211)
|
|
+++ kmail/actionscheduler.h (Arbeitskopie)
|
|
@@ -77,10 +77,10 @@
|
|
of messages left to process is empty */
|
|
void setFilterList( QValueList<KMFilter*> filters );
|
|
|
|
- /* Set the id of the account associated with this scheduler */
|
|
+ /** Set the id of the account associated with this scheduler */
|
|
void setAccountId( uint id ) { mAccountId = id; mAccount = true; }
|
|
|
|
- /* Clear the id of the account associated with this scheduler */
|
|
+ /** Clear the id of the account associated with this scheduler */
|
|
void clearAccountId() { mAccountId = 0; mAccount = false; }
|
|
|
|
/** Queue a message for filtering */
|
|
@@ -88,9 +88,16 @@
|
|
void execFilters(const QPtrList<KMMsgBase> msgList);
|
|
void execFilters(KMMsgBase* msgBase);
|
|
void execFilters(Q_UINT32 serNum);
|
|
+
|
|
static QString debug();
|
|
static bool isEnabled();
|
|
|
|
+ /** Allow or deny manipulations on the message to be filtered.
|
|
+ This is needed when using pipe-through filters, because the
|
|
+ changes made by the filter have to be written back.
|
|
+ The old value before applying the new value is returned. */
|
|
+ bool ignoreChanges( bool ignore );
|
|
+
|
|
signals:
|
|
/** Emitted when filtering is completed */
|
|
void result(ReturnCode);
|
|
Index: actionscheduler.cpp
|
|
===================================================================
|
|
--- kmail/actionscheduler.cpp (Revision 487211)
|
|
+++ kmail/actionscheduler.cpp (Arbeitskopie)
|
|
@@ -570,7 +570,7 @@
|
|
(!mAccount ||
|
|
(mAccount && (*mFilterIt).applyOnAccount(mAccountId)))) ||
|
|
((mSet & KMFilterMgr::Explicit) && (*mFilterIt).applyOnExplicit())) {
|
|
-
|
|
+
|
|
// filter is applicable
|
|
if ( FilterLog::instance()->isLogging() ) {
|
|
QString logText( i18n( "<b>Evaluating filter rules:</b> " ) );
|
|
@@ -646,8 +646,11 @@
|
|
if (!orgMsg || !orgMsg->parent()) {
|
|
// Original message is gone, no point filtering it anymore
|
|
mSrcFolder->removeMsg( mSrcFolder->find( msg ) );
|
|
+ kdDebug(5006) << "The original serial number is missing. "
|
|
+ << "Cannot complete the filtering." << endl;
|
|
mExecutingLock = false;
|
|
processMessageTimer->start( 0, true );
|
|
+ return;
|
|
} else {
|
|
if (!folder) // no filter folder specified leave in current place
|
|
folder = orgMsg->parent();
|
|
@@ -659,7 +662,7 @@
|
|
mSrcFolder->addMsg( msg );
|
|
mIgnore = false;
|
|
|
|
- if (msg && kmkernel->folderIsTrash( folder ))
|
|
+ if (msg && folder && kmkernel->folderIsTrash( folder ))
|
|
KMFilterAction::sendMDN( msg, KMime::MDN::Deleted );
|
|
|
|
timeOutTime = QTime::currentTime();
|
|
@@ -722,8 +725,6 @@
|
|
|
|
void ActionScheduler::copyMessageFinished( KMCommand *command )
|
|
{
|
|
- // FIXME remove the debug output
|
|
- kdDebug(5006) << "##### ActionScheduler::copyMessageFinished( KMCommand *command )" << endl;
|
|
if ( command->result() != KMCommand::OK )
|
|
actionMessage( KMFilterAction::ErrorButGoOn );
|
|
else
|
|
@@ -803,4 +804,11 @@
|
|
return sEnabled;
|
|
}
|
|
|
|
+bool ActionScheduler::ignoreChanges( bool ignore )
|
|
+{
|
|
+ bool oldValue = mIgnore;
|
|
+ mIgnore = ignore;
|
|
+ return oldValue;
|
|
+}
|
|
+
|
|
#include "actionscheduler.moc"
|
|
Index: kmversion.h
|
|
===================================================================
|
|
--- kmail/kmversion.h (Revision 487211)
|
|
+++ kmail/kmversion.h (Arbeitskopie)
|
|
@@ -3,6 +3,6 @@
|
|
#ifndef kmversion_h
|
|
#define kmversion_h
|
|
|
|
-#define KMAIL_VERSION "1.9"
|
|
+#define KMAIL_VERSION "1.9.1"
|
|
|
|
#endif /*kmversion_h*/
|