2
2
#include "filteractionwidget.h"
3
3
#include "filteraction.h"
5
#include "filtermanager.h"
6
5
#include "folderrequester.h"
6
#include "filteractionmissingcollectiondialog.h"
7
7
#include "mailutil.h"
8
8
#include "mailkernel.h"
9
9
#include "mdnadvicedialog.h"
10
#include "messageproperty.h"
11
10
#include "minimumcombobox.h"
12
11
#include "regexplineedit.h"
55
54
#include <assert.h>
56
55
#include <string.h>
58
using MailCommon::MessageProperty;
59
57
using MailCommon::RegExpLineEdit;
60
58
using MessageComposer::MessageFactory;
62
60
using namespace MailCommon;
62
ItemContext::ItemContext( const Akonadi::Item &item )
63
: mItem( item ), mNeedsPayloadStore( false ), mNeedsFlagStore( false )
67
Akonadi::Item& ItemContext::item()
72
void ItemContext::setMoveTargetCollection( const Akonadi::Collection &collection )
74
mMoveTargetCollection = collection;
77
Akonadi::Collection ItemContext::moveTargetCollection() const
79
return mMoveTargetCollection;
82
void ItemContext::setNeedsPayloadStore()
84
mNeedsPayloadStore = true;
87
bool ItemContext::needsPayloadStore() const
89
return mNeedsPayloadStore;
92
void ItemContext::setNeedsFlagStore()
94
mNeedsFlagStore = true;
97
bool ItemContext::needsFlagStore() const
99
return mNeedsFlagStore;
64
103
FilterAction::FilterAction( const char *name, const QString &label, QObject *parent )
65
104
: QObject( parent ), mName( name ), mLabel( label )
100
139
return new QWidget( parent );
103
void FilterAction::applyParamWidgetValue( QWidget* )
107
void FilterAction::setParamWidgetValue( QWidget* ) const
111
void FilterAction::clearParamWidget( QWidget* ) const
142
void FilterAction::applyParamWidgetValue( QWidget * )
146
void FilterAction::setParamWidgetValue( QWidget * ) const
150
void FilterAction::clearParamWidget( QWidget * ) const
154
void FilterAction::argsFromStringInteractive( const QString &argsStr, const QString & filterName )
156
Q_UNUSED( filterName );
157
argsFromString(argsStr);
160
QString FilterAction::argsAsStringReal() const
162
return argsAsString();
115
165
bool FilterAction::folderRemoved( const Akonadi::Collection&, const Akonadi::Collection& )
218
268
lineEdit->setClearButtonShown( true );
219
269
lineEdit->setText( mParameter );
221
connect( lineEdit, SIGNAL( textChanged( QString ) ), this, SIGNAL( filterActionModified() ) );
271
connect( lineEdit, SIGNAL(textChanged(QString)), this, SIGNAL(filterActionModified()) );
271
321
comboBox->addItems( mParameterList );
272
322
setParamWidgetValue( comboBox );
274
connect( comboBox, SIGNAL( currentIndexChanged( int ) ),
275
this, SIGNAL( filterActionModified() ) );
324
connect( comboBox, SIGNAL(currentIndexChanged(int)),
325
this, SIGNAL(filterActionModified()) );
327
377
requester->setShowOutbox( false );
328
378
setParamWidgetValue( requester );
330
connect( requester, SIGNAL( folderChanged( Akonadi::Collection )),
331
this, SIGNAL( filterActionModified()) );
380
connect( requester, SIGNAL(folderChanged(Akonadi::Collection)),
381
this, SIGNAL(filterActionModified()) );
333
383
return requester;
336
386
void FilterActionWithFolder::applyParamWidgetValue( QWidget *paramWidget )
338
mFolder = static_cast<FolderRequester*>( paramWidget )->folderCollection();
339
mFolderName = static_cast<FolderRequester*>( paramWidget )->folderId();
388
mFolder = static_cast<FolderRequester*>( paramWidget )->collection();
342
391
void FilterActionWithFolder::setParamWidgetValue( QWidget *paramWidget ) const
344
if ( mFolder.isValid() )
345
static_cast<FolderRequester*>( paramWidget )->setFolder( mFolder );
347
static_cast<FolderRequester*>( paramWidget )->setFolder( mFolderName );
393
static_cast<FolderRequester*>( paramWidget )->setCollection( mFolder );
350
396
void FilterActionWithFolder::clearParamWidget( QWidget *paramWidget ) const
352
static_cast<FolderRequester*>( paramWidget )->setFolder( CommonKernel->draftsCollectionFolder() );
398
static_cast<FolderRequester*>( paramWidget )->setCollection( CommonKernel->draftsCollectionFolder() );
401
void FilterActionWithFolder::argsFromStringInteractive( const QString &argsStr , const QString& name)
403
argsFromString( argsStr );
404
if ( !mFolder.isValid() ) {
405
bool exactPath = false;
406
Akonadi::Collection::List lst = FilterActionMissingCollectionDialog::potentialCorrectFolders( argsStr, exactPath );
407
if ( lst.count() == 1 && exactPath )
408
mFolder = lst.at( 0 );
410
FilterActionMissingCollectionDialog *dlg = new FilterActionMissingCollectionDialog( lst, name );
412
mFolder = dlg->selectedCollection();
418
QString FilterActionWithFolder::argsAsStringReal() const
420
if ( KernelIf->collectionModel() )
421
return MailCommon::Util::fullCollectionPath( mFolder );
422
return FilterActionWithFolder::argsAsString();
355
425
void FilterActionWithFolder::argsFromString( const QString &argsStr )
413
476
MessageCore::EmailAddressRequester *requester = new MessageCore::EmailAddressRequester( parent );
414
477
requester->setText( mParameter );
416
connect( requester, SIGNAL( textChanged() ), this, SIGNAL( filterActionModified() ) );
479
connect( requester, SIGNAL(textChanged()), this, SIGNAL(filterActionModified()) );
418
481
return requester;
502
565
// and use QString::arg to substitute filenames for the %n's.
503
566
int lastSeen = -2;
504
567
QString tempFileName;
505
for ( QList<int>::Iterator it = argList.begin() ; it != argList.end() ; ++it ) {
568
QList<int>::ConstIterator end( argList.constEnd() );
569
for ( QList<int>::ConstIterator it = argList.constBegin() ; it != end ; ++it ) {
506
570
// setup temp files with check for duplicate %n's
507
571
if ( (*it) != lastSeen ) {
508
572
KTemporaryFile *tempFile = new KTemporaryFile();
583
FilterAction::ReturnCode FilterActionWithCommand::genericProcess( const Akonadi::Item &item, bool withOutput ) const
647
FilterAction::ReturnCode FilterActionWithCommand::genericProcess( ItemContext &context, bool withOutput ) const
585
const KMime::Message::Ptr aMsg = item.payload<KMime::Message::Ptr>();
649
const KMime::Message::Ptr aMsg = context.item().payload<KMime::Message::Ptr>();
586
650
Q_ASSERT( aMsg );
588
652
if ( mParameter.isEmpty() )
600
664
atmList.append( inFile );
602
666
QString commandLine = substituteCommandLineArgsFor( aMsg, atmList );
603
substituteCommandLineArgsForItem( item, commandLine );
667
substituteCommandLineArgsForItem( context.item(), commandLine );
604
668
substituteMessageHeaders( aMsg, commandLine );
606
670
if ( commandLine.isEmpty() ) {
655
719
KMime::Headers::Generic *header = new KMime::Headers::Generic( "X-UID", aMsg.get(), uid, "utf-8" );
656
720
aMsg->setHeader( header );
658
new Akonadi::ItemModifyJob( item, FilterIf->filterManager() ); //TODO: check for errors
722
context.setNeedsPayloadStore();
660
724
qDeleteAll( atmList );
701
FilterAction::ReturnCode FilterActionSendReceipt::process( const Akonadi::Item &item ) const
765
FilterAction::ReturnCode FilterActionSendReceipt::process( ItemContext &context ) const
703
const KMime::Message::Ptr msg = item.payload<KMime::Message::Ptr>();
767
const KMime::Message::Ptr msg = context.item().payload<KMime::Message::Ptr>();
705
MessageFactory factory( msg, item.id() );
706
factory.setFolderIdentity( Util::folderIdentity( item ) );
769
MessageFactory factory( msg, context.item().id() );
770
factory.setFolderIdentity( Util::folderIdentity( context.item() ) );
707
771
factory.setIdentityManager( KernelIf->identityManager() );
709
773
const KMime::Message::Ptr receipt = factory.createDeliveryReceipt();
744
FilterAction::ReturnCode FilterActionTransport::process( const Akonadi::Item &item ) const
808
FilterAction::ReturnCode FilterActionTransport::process( ItemContext &context ) const
746
810
if ( mParameter.isEmpty() )
747
811
return ErrorButGoOn;
749
const KMime::Message::Ptr msg = item.payload<KMime::Message::Ptr>();
813
const KMime::Message::Ptr msg = context.item().payload<KMime::Message::Ptr>();
750
814
KMime::Headers::Generic *header = new KMime::Headers::Generic( "X-KMail-Transport", msg.get(), mParameter, "utf-8" );
751
815
msg->setHeader( header );
754
new Akonadi::ItemModifyJob( item, FilterIf->filterManager() );
818
context.setNeedsPayloadStore();
777
841
FilterActionReplyTo::FilterActionReplyTo( QObject *parent )
778
842
: FilterActionWithString( "set Reply-To", i18n( "Set Reply-To To" ), parent )
783
FilterAction::ReturnCode FilterActionReplyTo::process( const Akonadi::Item &item ) const
847
FilterAction::ReturnCode FilterActionReplyTo::process( ItemContext &context ) const
785
const KMime::Message::Ptr msg = item.payload<KMime::Message::Ptr>();
849
const KMime::Message::Ptr msg = context.item().payload<KMime::Message::Ptr>();
786
850
KMime::Headers::Generic *header = new KMime::Headers::Generic( "Reply-To", msg.get(), mParameter, "utf-8" );
787
851
msg->setHeader( header );
790
new Akonadi::ItemModifyJob( item, FilterIf->filterManager() );
854
context.setNeedsPayloadStore();
803
867
FilterActionIdentity( QObject *parent = 0 );
804
virtual ReturnCode process( const Akonadi::Item &item ) const;
868
virtual ReturnCode process( ItemContext &context ) const;
805
869
static FilterAction* newAction();
807
871
QWidget * createParamWidget( QWidget *parent ) const;
821
885
mParameter = KernelIf->identityManager()->defaultIdentity().uoid();
824
FilterAction::ReturnCode FilterActionIdentity::process( const Akonadi::Item &item ) const
888
FilterAction::ReturnCode FilterActionIdentity::process( ItemContext &context ) const
826
const KMime::Message::Ptr msg = item.payload<KMime::Message::Ptr>();
890
const KMime::Message::Ptr msg = context.item().payload<KMime::Message::Ptr>();
827
891
KMime::Headers::Generic *header = new KMime::Headers::Generic( "X-KMail-Identity", msg.get(), QString::number( mParameter ), "utf-8" );
828
892
msg->setHeader( header );
831
new Akonadi::ItemModifyJob( item, FilterIf->filterManager() );
895
context.setNeedsPayloadStore();
838
902
KPIMIdentities::IdentityCombo *comboBox = new KPIMIdentities::IdentityCombo( KernelIf->identityManager(), parent );
839
903
comboBox->setCurrentIdentity( mParameter );
841
connect( comboBox, SIGNAL( currentIndexChanged( int ) ), this, SIGNAL( filterActionModified() ) );
905
connect( comboBox, SIGNAL(currentIndexChanged(int)), this, SIGNAL(filterActionModified()) );
878
942
FilterActionSetStatus( QObject *parent = 0 );
879
virtual ReturnCode process( const Akonadi::Item &item ) const;
943
virtual ReturnCode process( ItemContext &context ) const;
880
944
virtual bool requiresBody() const;
882
946
static FilterAction* newAction();
929
993
mParameter = mParameterList.at( 0 );
932
FilterAction::ReturnCode FilterActionSetStatus::process( const Akonadi::Item &item ) const
996
FilterAction::ReturnCode FilterActionSetStatus::process( ItemContext &context ) const
934
998
const int index = mParameterList.indexOf( mParameter );
936
1000
return ErrorButGoOn;
938
1002
Akonadi::MessageStatus status;
939
status.setStatusFromFlags( item.flags() );
1003
status.setStatusFromFlags( context.item().flags() );
941
1005
const Akonadi::MessageStatus newStatus = stati[ index - 1 ];
942
1006
if ( newStatus == Akonadi::MessageStatus::statusUnread() )
945
1009
status.set( newStatus );
947
Akonadi::Item newItem( item.id() );
948
newItem.setRevision( item.revision() );
949
newItem.setFlags( status.statusFlags() );
950
new Akonadi::ItemModifyJob( newItem, FilterIf->filterManager() ); // TODO handle error
1011
context.item().setFlags( status.statusFlags() );
1012
context.setNeedsFlagStore();
1009
1071
FilterActionAddTag( QObject *parent = 0 );
1010
virtual ReturnCode process( const Akonadi::Item &item ) const;
1072
virtual ReturnCode process( ItemContext &context ) const;
1011
1073
virtual bool requiresBody() const;
1013
1075
static FilterAction* newAction();
1041
FilterAction::ReturnCode FilterActionAddTag::process( const Akonadi::Item &item ) const
1103
FilterAction::ReturnCode FilterActionAddTag::process( ItemContext &context ) const
1043
1105
#ifndef KDEPIM_NO_NEPOMUK
1044
1106
const int index = mParameterList.indexOf( mParameter );
1045
1107
if ( index == -1 )
1046
1108
return ErrorButGoOn;
1048
Nepomuk::Resource resource( item.url() );
1110
Nepomuk::Resource resource( context.item().url() );
1049
1111
resource.addTag( mParameter );
1095
1157
FilterActionFakeDisposition( QObject *parent = 0 );
1096
virtual ReturnCode process( const Akonadi::Item &item ) const;
1158
virtual ReturnCode process( ItemContext &context ) const;
1097
1159
static FilterAction* newAction()
1099
1161
return new FilterActionFakeDisposition;
1138
1200
mParameter = mParameterList.at( 0 );
1141
FilterAction::ReturnCode FilterActionFakeDisposition::process( const Akonadi::Item &item ) const
1203
FilterAction::ReturnCode FilterActionFakeDisposition::process( ItemContext &context ) const
1143
1205
const int index = mParameterList.indexOf( mParameter );
1144
1206
if ( index < 1 )
1145
1207
return ErrorButGoOn;
1147
1209
if ( index == 1 ) { // ignore
1148
if ( item.hasAttribute<MessageCore::MDNStateAttribute>() ) {
1149
item.attribute<MessageCore::MDNStateAttribute>()->setMDNState( MessageCore::MDNStateAttribute::MDNIgnore );
1150
Akonadi::ItemModifyJob* modifyJob = new Akonadi::ItemModifyJob( item );
1151
modifyJob->setIgnorePayload( true );
1210
if ( context.item().hasAttribute<MessageCore::MDNStateAttribute>() ) {
1211
context.item().attribute<MessageCore::MDNStateAttribute>()->setMDNState( MessageCore::MDNStateAttribute::MDNIgnore );
1212
context.setNeedsFlagStore();
1154
sendMDN( item, mdns[ index - 2 ] ); // skip first two entries: "" and "ignore"
1215
sendMDN( context.item(), mdns[ index - 2 ] ); // skip first two entries: "" and "ignore"
1200
1261
FilterActionRemoveHeader( QObject *parent = 0 );
1201
virtual ReturnCode process( const Akonadi::Item &item ) const;
1262
virtual ReturnCode process( ItemContext &context ) const;
1202
1263
virtual QWidget* createParamWidget( QWidget *parent ) const;
1203
1264
virtual void setParamWidgetValue( QWidget *paramWidget ) const;
1230
1291
comboBox->setInsertPolicy( QComboBox::InsertAtBottom );
1231
1292
setParamWidgetValue( comboBox );
1233
connect( comboBox, SIGNAL( currentIndexChanged( int ) ),
1234
this, SIGNAL( filterActionModified() ) );
1294
connect( comboBox, SIGNAL(currentIndexChanged(int)),
1295
this, SIGNAL(filterActionModified()) );
1236
1297
return comboBox;
1239
FilterAction::ReturnCode FilterActionRemoveHeader::process( const Akonadi::Item &item ) const
1300
FilterAction::ReturnCode FilterActionRemoveHeader::process( ItemContext &context ) const
1241
1302
if ( mParameter.isEmpty() )
1242
1303
return ErrorButGoOn;
1244
KMime::Message::Ptr msg = item.payload<KMime::Message::Ptr>();
1305
KMime::Message::Ptr msg = context.item().payload<KMime::Message::Ptr>();
1245
1306
while ( msg->headerByType( mParameter.toLatin1() ) )
1246
1307
msg->removeHeader( mParameter.toLatin1() );
1248
1309
msg->assemble();
1250
new Akonadi::ItemModifyJob( item, FilterIf->filterManager() );
1311
context.setNeedsPayloadStore();
1279
1340
FilterActionAddHeader( QObject *parent = 0 );
1280
virtual ReturnCode process( const Akonadi::Item &item ) const;
1341
virtual ReturnCode process( ItemContext &context ) const;
1281
1342
virtual QWidget* createParamWidget( QWidget *parent ) const;
1282
1343
virtual void setParamWidgetValue( QWidget *paramWidget ) const;
1283
1344
virtual void applyParamWidgetValue( QWidget *paramWidget );
1310
1371
mParameter = mParameterList.at( 0 );
1313
FilterAction::ReturnCode FilterActionAddHeader::process( const Akonadi::Item &item ) const
1374
FilterAction::ReturnCode FilterActionAddHeader::process( ItemContext &context ) const
1315
1376
if ( mParameter.isEmpty() )
1316
1377
return ErrorButGoOn;
1318
KMime::Message::Ptr msg = item.payload<KMime::Message::Ptr>();
1379
KMime::Message::Ptr msg = context.item().payload<KMime::Message::Ptr>();
1320
1381
KMime::Headers::Base *header = KMime::Headers::createHeader( mParameter.toLatin1() );
1321
1382
if ( !header ) {
1357
1418
setParamWidgetValue( widget );
1359
connect( comboBox, SIGNAL( currentIndexChanged( int ) ),
1360
this, SIGNAL( filterActionModified() ) );
1361
connect( lineEdit, SIGNAL( textChanged( QString ) ),
1362
this, SIGNAL( filterActionModified() ) );
1420
connect( comboBox, SIGNAL(currentIndexChanged(int)),
1421
this, SIGNAL(filterActionModified()) );
1422
connect( lineEdit, SIGNAL(textChanged(QString)),
1423
this, SIGNAL(filterActionModified()) );
1454
1515
FilterActionRewriteHeader( QObject *parent = 0 );
1455
virtual ReturnCode process( const Akonadi::Item &item ) const;
1516
virtual ReturnCode process( ItemContext &context ) const;
1456
1517
virtual QWidget* createParamWidget( QWidget *parent ) const;
1457
1518
virtual void setParamWidgetValue( QWidget *paramWidget ) const;
1458
1519
virtual void applyParamWidgetValue( QWidget *paramWidget );
1487
1548
mParameter = mParameterList.at( 0 );
1490
FilterAction::ReturnCode FilterActionRewriteHeader::process( const Akonadi::Item &item ) const
1551
FilterAction::ReturnCode FilterActionRewriteHeader::process( ItemContext &context ) const
1492
1553
if ( mParameter.isEmpty() || !mRegExp.isValid() )
1493
1554
return ErrorButGoOn;
1495
const KMime::Message::Ptr msg = item.payload<KMime::Message::Ptr>();
1556
const KMime::Message::Ptr msg = context.item().payload<KMime::Message::Ptr>();
1497
1558
KMime::Headers::Base *header = msg->headerByType( mParameter.toLatin1() );
1498
1559
QString value = header ? header->asUnicodeString(): "";
1544
1605
setParamWidgetValue( widget );
1546
connect( comboBox, SIGNAL( currentIndexChanged( int ) ),
1547
this, SIGNAL( filterActionModified() ) );
1548
connect( regExpLineEdit, SIGNAL( textChanged( QString ) ),
1549
this, SIGNAL( filterActionModified() ) );
1550
connect( lineEdit, SIGNAL( textChanged( QString ) ),
1551
this, SIGNAL( filterActionModified() ) );
1607
connect( comboBox, SIGNAL(currentIndexChanged(int)),
1608
this, SIGNAL(filterActionModified()) );
1609
connect( regExpLineEdit, SIGNAL(textChanged(QString)),
1610
this, SIGNAL(filterActionModified()) );
1611
connect( lineEdit, SIGNAL(textChanged(QString)),
1612
this, SIGNAL(filterActionModified()) );
1652
1713
FilterActionMove( QObject *parent = 0 );
1653
virtual ReturnCode process( const Akonadi::Item &item ) const;
1714
virtual ReturnCode process( ItemContext &context ) const;
1654
1715
virtual bool requiresBody() const;
1655
1716
static FilterAction* newAction();
1668
FilterAction::ReturnCode FilterActionMove::process( const Akonadi::Item &item ) const
1729
FilterAction::ReturnCode FilterActionMove::process( ItemContext &context ) const
1670
1731
if ( !mFolder.isValid() ) {
1671
const Akonadi::Collection targetFolder = CommonKernel->collectionFromId( mFolderName );
1732
const Akonadi::Collection targetFolder = CommonKernel->collectionFromId( mFolder.id() );
1672
1733
if ( !targetFolder.isValid() )
1673
1734
return ErrorButGoOn;
1675
MessageProperty::setFilterFolder( item, targetFolder );
1736
context.setMoveTargetCollection( targetFolder );
1679
MessageProperty::setFilterFolder( item, mFolder );
1739
context.setMoveTargetCollection( mFolder );
1696
1756
FilterActionCopy( QObject *parent = 0 );
1697
virtual ReturnCode process( const Akonadi::Item &item ) const;
1757
virtual ReturnCode process( ItemContext &context ) const;
1698
1758
virtual bool requiresBody() const;
1699
1759
static FilterAction* newAction();
1712
FilterAction::ReturnCode FilterActionCopy::process( const Akonadi::Item &item ) const
1772
FilterAction::ReturnCode FilterActionCopy::process( ItemContext &context ) const
1714
1774
// copy the message 1:1
1715
new Akonadi::ItemCopyJob( item, mFolder, FilterIf->filterManager() ); // TODO handle error
1775
new Akonadi::ItemCopyJob( context.item(), mFolder, 0 ); // TODO handle error
1733
1793
FilterActionForward( QObject *parent = 0 );
1734
1794
static FilterAction* newAction();
1735
virtual ReturnCode process( const Akonadi::Item &item ) const;
1795
virtual ReturnCode process( ItemContext &context ) const;
1736
1796
virtual QWidget* createParamWidget( QWidget *parent ) const;
1737
1797
virtual void applyParamWidgetValue( QWidget *paramWidget );
1738
1798
virtual void setParamWidgetValue( QWidget *paramWidget ) const;
1758
FilterAction::ReturnCode FilterActionForward::process( const Akonadi::Item &item ) const
1818
FilterAction::ReturnCode FilterActionForward::process( ItemContext &context ) const
1760
1820
if ( mParameter.isEmpty() )
1761
1821
return ErrorButGoOn;
1763
const KMime::Message::Ptr msg = item.payload<KMime::Message::Ptr>();
1823
const KMime::Message::Ptr msg = context.item().payload<KMime::Message::Ptr>();
1764
1824
// avoid endless loops when this action is used in a filter
1765
1825
// which applies to sent messages
1766
1826
if ( MessageCore::StringUtil::addressIsInAddressList( mParameter,
1769
1829
return ErrorButGoOn;
1772
MessageFactory factory( msg, item.id() );
1832
MessageFactory factory( msg, context.item().id() );
1773
1833
factory.setIdentityManager( KernelIf->identityManager() );
1774
factory.setFolderIdentity( Util::folderIdentity( item ) );
1834
factory.setFolderIdentity( Util::folderIdentity( context.item() ) );
1775
1835
factory.setTemplate( mTemplate );
1777
1837
KMime::Message::Ptr fwdMsg = factory.createForward();
1780
1840
kWarning() << "FilterAction: could not forward message (sending failed)";
1781
1841
return ErrorButGoOn; // error: couldn't send
1783
sendMDN( item, KMime::MDN::Dispatched );
1843
sendMDN( context.item(), KMime::MDN::Dispatched );
1785
1845
// (the msgSender takes ownership of the message, so don't delete it here)
1820
1880
templateCombo->setToolTip( i18n( "The template used when forwarding" ) );
1821
1881
templateCombo->setWhatsThis( i18n( "Set the forwarding template that will be used with this filter." ) );
1823
connect( templateCombo, SIGNAL( currentIndexChanged( int ) ),
1824
this, SIGNAL( filterActionModified() ) );
1825
connect( addressRequester, SIGNAL( textChanged() ),
1826
this, SIGNAL( filterActionModified() ) );
1883
connect( templateCombo, SIGNAL(currentIndexChanged(int)),
1884
this, SIGNAL(filterActionModified()) );
1885
connect( addressRequester, SIGNAL(textChanged()),
1886
this, SIGNAL(filterActionModified()) );
1828
1888
return addressAndTemplate;
1935
FilterAction::ReturnCode FilterActionRedirect::process( const Akonadi::Item &item ) const
1995
FilterAction::ReturnCode FilterActionRedirect::process( ItemContext &context ) const
1937
1997
if ( mParameter.isEmpty() )
1938
1998
return ErrorButGoOn;
1940
KMime::Message::Ptr msg = MessageCore::Util::message( item );
2000
KMime::Message::Ptr msg = MessageCore::Util::message( context.item() );
1942
MessageFactory factory( msg, item.id() );
1943
factory.setFolderIdentity( Util::folderIdentity( item ) );
2002
MessageFactory factory( msg, context.item().id() );
2003
factory.setFolderIdentity( Util::folderIdentity( context.item() ) );
1944
2004
factory.setIdentityManager( KernelIf->identityManager() );
1946
2006
KMime::Message::Ptr rmsg = factory.createRedirect( mParameter );
1948
2008
return ErrorButGoOn;
1950
sendMDN( item, KMime::MDN::Dispatched );
2010
sendMDN( context.item(), KMime::MDN::Dispatched );
1952
2012
if ( !KernelIf->msgSender()->send( rmsg, MessageSender::SendLater ) ) {
1953
2013
kDebug() << "FilterAction: could not redirect message (sending failed)";
1983
FilterAction::ReturnCode FilterActionExec::process( const Akonadi::Item &item ) const
2043
FilterAction::ReturnCode FilterActionExec::process( ItemContext &context ) const
1985
return FilterActionWithCommand::genericProcess( item, false ); // ignore output
2045
return FilterActionWithCommand::genericProcess( context, false ); // ignore output
2012
FilterAction::ReturnCode FilterActionExtFilter::process( const Akonadi::Item &item ) const
2072
FilterAction::ReturnCode FilterActionExtFilter::process( ItemContext &context ) const
2014
return FilterActionWithCommand::genericProcess( item, true ); // use output
2074
return FilterActionWithCommand::genericProcess( context, true ); // use output
2023
2083
class FilterActionExecSound : public FilterActionWithTest
2026
FilterActionExecSound( QObject *parent = 0 );
2086
FilterActionExecSound( );
2027
2087
~FilterActionExecSound();
2028
virtual ReturnCode process( const Akonadi::Item &item ) const;
2088
virtual ReturnCode process( ItemContext &context ) const;
2029
2089
virtual bool requiresBody() const;
2030
2090
static FilterAction* newAction();
2052
2112
SoundTestWidget *soundWidget = new SoundTestWidget( parent );
2053
2113
soundWidget->setUrl( mParameter );
2055
connect( soundWidget, SIGNAL( textChanged( QString ) ),
2056
this, SIGNAL( filterActionModified() ) );
2115
connect( soundWidget, SIGNAL(textChanged(QString)),
2116
this, SIGNAL(filterActionModified()) );
2058
2118
return soundWidget;
2089
2149
return label() + QLatin1String( " \"" ) + Qt::escape( argsAsString() ) + QLatin1String( "\"" );
2092
FilterActionExecSound::FilterActionExecSound( QObject *parent )
2152
FilterActionExecSound::FilterActionExecSound( )
2093
2153
: FilterActionWithTest( "play sound", i18n( "Play Sound" ) ),
2105
2165
return new FilterActionExecSound();
2108
FilterAction::ReturnCode FilterActionExecSound::process( const Akonadi::Item& ) const
2168
FilterAction::ReturnCode FilterActionExecSound::process( ItemContext& ) const
2110
2170
if ( mParameter.isEmpty() )
2111
2171
return ErrorButGoOn;
2145
2205
KUrlRequester *requester = new KUrlRequester( parent );
2146
2206
requester->setUrl( KUrl( mParameter ) );
2148
connect( requester, SIGNAL( textChanged( QString ) ), this, SIGNAL( filterActionModified() ) );
2208
connect( requester, SIGNAL(textChanged(QString)), this, SIGNAL(filterActionModified()) );
2150
2210
return requester;
2194
2254
FilterActionAddToAddressBook( QObject *parent = 0 );
2195
virtual ReturnCode process( const Akonadi::Item &item ) const;
2255
virtual ReturnCode process( ItemContext &context ) const;
2196
2256
static FilterAction* newAction();
2198
2258
virtual bool isEmpty() const { return false; }
2240
FilterAction::ReturnCode FilterActionAddToAddressBook::process( const Akonadi::Item &item ) const
2300
FilterAction::ReturnCode FilterActionAddToAddressBook::process( ItemContext &context ) const
2242
const KMime::Message::Ptr msg = item.payload<KMime::Message::Ptr>();
2302
const KMime::Message::Ptr msg = context.item().payload<KMime::Message::Ptr>();
2244
2304
QString headerLine;
2245
2305
switch ( mHeaderType ) {
2296
2356
"If it is not accessible, the filter will fallback to the default address book.</p>" ) );
2297
2357
layout->addWidget( collectionComboBox, 1, 2 );
2299
connect( categoryEdit, SIGNAL( textChanged( QString ) ),
2300
this, SIGNAL( filterActionModified() ) );
2301
connect( headerCombo, SIGNAL( currentIndexChanged( int ) ),
2302
this, SIGNAL( filterActionModified() ) );
2359
connect( categoryEdit, SIGNAL(textChanged(QString)),
2360
this, SIGNAL(filterActionModified()) );
2361
connect( headerCombo, SIGNAL(currentIndexChanged(int)),
2362
this, SIGNAL(filterActionModified()) );
2304
2364
setParamWidgetValue( widget );
2346
2406
// we use the previously 'stored' value from the 'collectionId' property
2347
2407
if ( collection.isValid() ) {
2348
2408
mCollectionId = collection.id();
2349
connect( collectionComboBox, SIGNAL( currentIndexChanged( int ) ),
2350
this, SIGNAL( filterActionModified() ) );
2409
connect( collectionComboBox, SIGNAL(currentIndexChanged(int)),
2410
this, SIGNAL(filterActionModified()) );
2352
2412
const QVariant value = collectionComboBox->property( "collectionId" );
2353
2413
if ( value.isValid() )