• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

mailcommon

  • sources
  • kde-4.14
  • kdepim
  • mailcommon
  • filter
mailfilter.cpp
Go to the documentation of this file.
1 /* -*- mode: C++; c-file-style: "gnu" -*-
2  * kmail: KDE mail client
3  * Copyright (c) 1996-1998 Stefan Taferner <taferner@kde.org>
4  * Copyright (C) 2012 Andras Mantia <amantia@kde.org>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  */
21 
22 // my header
23 #include "mailfilter.h"
24 
25 // other kmail headers
26 #include "filteractions/filteraction.h"
27 #include "filteractions/filteractiondict.h"
28 #include "filtermanager.h"
29 #include "filterlog.h"
30 #include "dialog/filteractionmissingargumentdialog.h"
31 using MailCommon::FilterLog;
32 
33 #include "pimcommon/util/pimutil.h"
34 
35 // KDEPIMLIBS headers
36 #include <Akonadi/AgentManager>
37 
38 // other KDE headers
39 #include <klocale.h>
40 #include <kmessagebox.h>
41 #include <kdebug.h>
42 #include <kconfig.h>
43 #include <kconfiggroup.h>
44 #include <krandom.h>
45 
46 #include <algorithm>
47 #ifndef Q_MOC_RUN
48 #include <boost/bind.hpp>
49 #endif
50 
51 
52 using namespace MailCommon;
53 
54 MailFilter::MailFilter()
55 {
56  generateRandomIdentifier();
57  bApplyOnInbound = true;
58  bApplyBeforeOutbound = false;
59  bApplyOnOutbound = false;
60  bApplyOnExplicit = true;
61  bStopProcessingHere = true;
62  bConfigureShortcut = false;
63  bConfigureToolbar = false;
64  bAutoNaming = true;
65  mApplicability = All;
66  bEnabled = true;
67 }
68 
69 
70 MailFilter::MailFilter( const KConfigGroup & aConfig, bool interactive, bool & needUpdate )
71 {
72  needUpdate = readConfig( aConfig, interactive );
73 }
74 
75 
76 MailFilter::MailFilter( const MailFilter & aFilter )
77 {
78  mIdentifier = aFilter.mIdentifier;
79  mPattern = aFilter.mPattern;
80 
81  bApplyOnInbound = aFilter.applyOnInbound();
82  bApplyBeforeOutbound = aFilter.applyBeforeOutbound();
83  bApplyOnOutbound = aFilter.applyOnOutbound();
84  bApplyOnExplicit = aFilter.applyOnExplicit();
85  bStopProcessingHere = aFilter.stopProcessingHere();
86  bConfigureShortcut = aFilter.configureShortcut();
87  bConfigureToolbar = aFilter.configureToolbar();
88  mToolbarName = aFilter.toolbarName();
89  mApplicability = aFilter.applicability();
90  bAutoNaming = aFilter.isAutoNaming();
91  bEnabled = aFilter.isEnabled();
92  mIcon = aFilter.icon();
93  mShortcut = aFilter.shortcut();
94 
95  QListIterator<FilterAction*> it( aFilter.mActions );
96  while ( it.hasNext() ) {
97  FilterAction *action = it.next();
98  FilterActionDesc *desc = FilterManager::filterActionDict()->value( action->name() );
99  if ( desc ) {
100  FilterAction *f = desc->create();
101  if ( f ) {
102  f->argsFromString( action->argsAsString() );
103  mActions.append( f );
104  }
105  }
106  }
107 
108  mAccounts.clear();
109  QStringList::ConstIterator it2;
110  QStringList::ConstIterator end2 = aFilter.mAccounts.constEnd();
111  for ( it2 = aFilter.mAccounts.constBegin() ; it2 != end2 ; ++it2 )
112  mAccounts.append( *it2 );
113 }
114 
115 MailFilter::~MailFilter()
116 {
117  qDeleteAll( mActions );
118 }
119 
120 void MailFilter::generateRandomIdentifier()
121 {
122  mIdentifier = KRandom::randomString(16);
123 }
124 
125 QString MailFilter::identifier() const
126 {
127  return mIdentifier;
128 }
129 
130 QString MailFilter::name() const
131 {
132  return mPattern.name();
133 }
134 
135 MailFilter::ReturnCode MailFilter::execActions( ItemContext &context, bool& stopIt, bool applyOnOutbound ) const
136 {
137  ReturnCode status = NoResult;
138 
139  QList<FilterAction*>::const_iterator it( mActions.constBegin() );
140  QList<FilterAction*>::const_iterator end( mActions.constEnd() );
141  for ( ; it != end ; ++it ) {
142 
143  if ( FilterLog::instance()->isLogging() ) {
144  const QString logText( i18n( "<b>Applying filter action:</b> %1",
145  (*it)->displayString() ) );
146  FilterLog::instance()->add( logText, FilterLog::AppliedAction );
147  }
148 
149  FilterAction::ReturnCode result = (*it)->process( context, applyOnOutbound );
150 
151  switch ( result ) {
152  case FilterAction::CriticalError:
153  if ( FilterLog::instance()->isLogging() ) {
154  const QString logText = QString::fromLatin1( "<font color=#FF0000>%1</font>" )
155  .arg( i18n( "A critical error occurred. Processing stops here." ) );
156  FilterLog::instance()->add( logText, FilterLog::AppliedAction );
157  }
158  // in case it's a critical error: return immediately!
159  return CriticalError;
160  case FilterAction::ErrorButGoOn:
161  if ( FilterLog::instance()->isLogging() ) {
162  const QString logText = QString::fromLatin1( "<font color=#FF0000>%1</font>" )
163  .arg( i18n( "A problem was found while applying this action." ) );
164  FilterLog::instance()->add( logText, FilterLog::AppliedAction );
165  }
166  default:
167  break;
168  }
169  }
170 
171  if ( status == NoResult ) // No filters matched, keep copy of message
172  status = GoOn;
173 
174  stopIt = stopProcessingHere();
175 
176  return status;
177 }
178 
179 QList<FilterAction*>* MailFilter::actions()
180 {
181  return &mActions;
182 }
183 
184 const QList<FilterAction*>* MailFilter::actions() const
185 {
186  return &mActions;
187 }
188 
189 SearchPattern* MailFilter::pattern()
190 {
191  return &mPattern;
192 }
193 
194 const SearchPattern* MailFilter::pattern() const
195 {
196  return &mPattern;
197 }
198 
199 void MailFilter::setApplyOnOutbound( bool aApply )
200 {
201  bApplyOnOutbound = aApply;
202 }
203 
204 void MailFilter::setApplyBeforeOutbound( bool aApply )
205 {
206  bApplyBeforeOutbound = aApply;
207 }
208 
209 bool MailFilter::applyOnOutbound() const
210 {
211  return bApplyOnOutbound;
212 }
213 
214 bool MailFilter::applyBeforeOutbound() const
215 {
216  return bApplyBeforeOutbound;
217 }
218 
219 void MailFilter::setApplyOnInbound( bool aApply )
220 {
221  bApplyOnInbound = aApply;
222 }
223 
224 bool MailFilter::applyOnInbound() const
225 {
226  return bApplyOnInbound;
227 }
228 
229 void MailFilter::setApplyOnExplicit( bool aApply )
230 {
231  bApplyOnExplicit = aApply;
232 }
233 
234 bool MailFilter::applyOnExplicit() const
235 {
236  return bApplyOnExplicit;
237 }
238 
239 void MailFilter::setApplicability( AccountType aApply )
240 {
241  mApplicability = aApply;
242 }
243 
244 MailFilter::AccountType MailFilter::applicability() const
245 {
246  return mApplicability;
247 }
248 
249 SearchRule::RequiredPart MailFilter::requiredPart(const QString& id) const
250 {
251  //find the required message part needed for the filter
252  //this can be either only the Envelope, all Header or the CompleteMessage
253  //Makes the assumption that Envelope < Header < CompleteMessage
254  int requiredPart = SearchRule::Envelope;
255 
256  if (!bEnabled || !applyOnAccount(id))
257  return static_cast<SearchRule::RequiredPart>(requiredPart);
258 
259  if (pattern())
260  requiredPart = qMax( requiredPart, (int)pattern()->requiredPart() ) ; // no pattern means always matches?
261 
262  int requiredPartByActions = SearchRule::Envelope;
263 
264  QList<FilterAction*> actionList = *actions();
265  if (!actionList.isEmpty()) {
266  requiredPartByActions = (*std::max_element(actionList.constBegin(), actionList.constEnd(),
267  boost::bind(&MailCommon::FilterAction::requiredPart, _1) <
268  boost::bind(&MailCommon::FilterAction::requiredPart, _2) ))->requiredPart();
269  }
270  requiredPart = qMax( requiredPart, requiredPartByActions);
271 
272  return static_cast<SearchRule::RequiredPart>(requiredPart);
273 }
274 
275 void MailFilter::folderRemoved( const Akonadi::Collection & aFolder, const Akonadi::Collection& aNewFolder )
276 {
277  QListIterator<FilterAction*> it( mActions );
278  while ( it.hasNext() )
279  it.next()->folderRemoved( aFolder, aNewFolder );
280 }
281 
282 void MailFilter::setApplyOnAccount( const QString& id, bool aApply )
283 {
284  if (aApply && !mAccounts.contains( id )) {
285  mAccounts.append( id );
286  } else if (!aApply && mAccounts.contains( id )) {
287  mAccounts.removeAll( id );
288  }
289 }
290 
291 bool MailFilter::applyOnAccount( const QString& id ) const
292 {
293  if ( applicability() == All )
294  return true;
295  if ( applicability() == ButImap ) {
296  Akonadi::AgentInstance instance = Akonadi::AgentManager::self()->instance( id );
297  if ( instance.isValid() ) {
298  return !PimCommon::Util::isImapResource( instance.type().identifier());
299  } else {
300  return false;
301  }
302  }
303  if ( applicability() == Checked )
304  return mAccounts.contains( id );
305 
306  return false;
307 }
308 
309 void MailFilter::setStopProcessingHere( bool aStop )
310 {
311  bStopProcessingHere = aStop;
312 }
313 
314 bool MailFilter::stopProcessingHere() const
315 {
316  return bStopProcessingHere;
317 }
318 
319 void MailFilter::setConfigureShortcut( bool aShort )
320 {
321  bConfigureShortcut = aShort;
322  bConfigureToolbar = (bConfigureToolbar && bConfigureShortcut);
323 }
324 
325 bool MailFilter::configureShortcut() const
326 {
327  return bConfigureShortcut;
328 }
329 
330 void MailFilter::setConfigureToolbar( bool aTool )
331 {
332  bConfigureToolbar = (aTool && bConfigureShortcut);
333 }
334 
335 bool MailFilter::configureToolbar() const
336 {
337  return bConfigureToolbar;
338 }
339 
340 void MailFilter::setToolbarName( const QString &toolbarName )
341 {
342  mToolbarName = toolbarName;
343 }
344 
345 void MailFilter::setShortcut( const KShortcut &shortcut )
346 {
347  mShortcut = shortcut;
348 }
349 
350 const KShortcut& MailFilter::shortcut() const
351 {
352  return mShortcut;
353 }
354 
355 void MailFilter::setIcon( const QString &icon )
356 {
357  mIcon = icon;
358 }
359 
360 QString MailFilter::icon() const
361 {
362  return mIcon;
363 }
364 
365 void MailFilter::setAutoNaming( bool useAutomaticNames )
366 {
367  bAutoNaming = useAutomaticNames;
368 }
369 
370 bool MailFilter::isAutoNaming() const
371 {
372  return bAutoNaming;
373 }
374 
375 //-----------------------------------------------------------------------------
376 bool MailFilter::readConfig(const KConfigGroup & config, bool interactive)
377 {
378  bool needUpdate = false;
379  // MKSearchPattern::readConfig ensures
380  // that the pattern is purified.
381  mPattern.readConfig(config);
382  mIdentifier = config.readEntry( "identifier", KRandom::randomString( 16 ) );
383 
384  const QStringList sets = config.readEntry("apply-on", QStringList() );
385  if ( sets.isEmpty() && !config.hasKey("apply-on") ) {
386  bApplyBeforeOutbound = false;
387  bApplyOnOutbound = false;
388  bApplyOnInbound = true;
389  bApplyOnExplicit = true;
390  mApplicability = ButImap;
391  } else {
392  bApplyBeforeOutbound = bool(sets.contains(QLatin1String("before-send-mail")));
393  bApplyOnInbound = bool(sets.contains(QLatin1String("check-mail")));
394  bApplyOnOutbound = bool(sets.contains(QLatin1String("send-mail")));
395  bApplyOnExplicit = bool(sets.contains(QLatin1String("manual-filtering")));
396  mApplicability = (AccountType) config.readEntry(
397  "Applicability", (int)ButImap );
398  }
399 
400  bStopProcessingHere = config.readEntry( "StopProcessingHere", true );
401  bConfigureShortcut = config.readEntry( "ConfigureShortcut", false );
402  QString shortcut( config.readEntry( "Shortcut", QString() ) );
403  if ( !shortcut.isEmpty() ) {
404  KShortcut sc( shortcut );
405  setShortcut( sc );
406  }
407  bConfigureToolbar = config.readEntry( "ConfigureToolbar", false );
408  bConfigureToolbar = bConfigureToolbar && bConfigureShortcut;
409  mToolbarName = config.readEntry( "ToolbarName", name() );
410  mIcon = config.readEntry( "Icon", "system-run" );
411  bAutoNaming = config.readEntry( "AutomaticName", false );
412  bEnabled = config.readEntry( "Enabled", true );
413  QString actName, argsName;
414 
415  mActions.clear();
416 
417  int numActions = config.readEntry( "actions", 0 );
418  if (numActions > FILTER_MAX_ACTIONS) {
419  numActions = FILTER_MAX_ACTIONS ;
420  KMessageBox::information( 0, i18n("<qt>Too many filter actions in filter rule <b>%1</b>.</qt>", mPattern.name() ) );
421  }
422 
423  for ( int i=0 ; i < numActions ; ++i ) {
424  actName.sprintf("action-name-%d", i);
425  argsName.sprintf("action-args-%d", i);
426  // get the action description...
427  FilterActionDesc *desc = FilterManager::filterActionDict()->value(
428  config.readEntry( actName, QString() ) );
429  if ( desc ) {
430  //...create an instance...
431  FilterAction *fa = desc->create();
432  if ( fa ) {
433  //...load it with it's parameter...
434  if ( interactive ) {
435  const bool ret = fa->argsFromStringInteractive( config.readEntry( argsName, QString() ), name() );
436  if ( ret )
437  needUpdate = true;
438  }
439  else
440  fa->argsFromString( config.readEntry( argsName, QString() ) );
441  //...check if it's empty and...
442  if ( !fa->isEmpty() )
443  //...append it if it's not and...
444  mActions.append( fa );
445  else
446  //...delete is else.
447  delete fa;
448  }
449  } else
450  KMessageBox::information( 0 /* app-global modal dialog box */,
451  i18n("<qt>Unknown filter action <b>%1</b><br />in filter rule <b>%2</b>.<br />Ignoring it.</qt>",
452  config.readEntry( actName, QString() ),
453  mPattern.name() ) );
454  }
455 
456  mAccounts = config.readEntry( "accounts-set",QStringList() );
457  if ( !mAccounts.isEmpty() && interactive ) {
458  if ( !FilterActionMissingAccountDialog::allAccountExist( mAccounts ) ) {
459  FilterActionMissingAccountDialog *dlg = new FilterActionMissingAccountDialog(mAccounts, name());
460  if ( dlg->exec() ) {
461  mAccounts = dlg->selectedAccount();
462  needUpdate = true;
463  }
464  delete dlg;
465  }
466  }
467  return needUpdate;
468 }
469 
470 void MailFilter::generateSieveScript(QStringList &requires, QString &code)
471 {
472  mPattern.generateSieveScript(requires, code);
473 
474  QList<FilterAction*>::const_iterator it;
475  QList<FilterAction*>::const_iterator end( mActions.constEnd() );
476 
477  code += QLatin1String(")\n{\n");
478  bool firstAction = true;
479  for ( it = mActions.constBegin() ; it != end ; ++it) {
480  //Add endline here.
481  if (firstAction) {
482  firstAction = false;
483  } else {
484  code += QLatin1Char('\n');
485  }
486  code += QLatin1String(" ") + (*it)->sieveCode();
487  Q_FOREACH(const QString &str, (*it)->sieveRequires()) {
488  if (!requires.contains(str)) {
489  requires.append(str);
490  }
491  }
492  }
493  code += QLatin1String("\n}\n");
494 }
495 
496 void MailFilter::writeConfig(KConfigGroup & config, bool exportFilter) const
497 {
498  mPattern.writeConfig(config);
499  config.writeEntry( "identifier", mIdentifier );
500 
501  QStringList sets;
502  if ( bApplyOnInbound )
503  sets.append( QLatin1String("check-mail") );
504  if ( bApplyBeforeOutbound )
505  sets.append( QLatin1String("before-send-mail") );
506  if ( bApplyOnOutbound )
507  sets.append( QLatin1String("send-mail") );
508  if ( bApplyOnExplicit )
509  sets.append( QLatin1String("manual-filtering") );
510  config.writeEntry( "apply-on", sets );
511 
512  config.writeEntry( "StopProcessingHere", bStopProcessingHere );
513  config.writeEntry( "ConfigureShortcut", bConfigureShortcut );
514  if ( !mShortcut.isEmpty() )
515  config.writeEntry( "Shortcut", mShortcut.toString() );
516  config.writeEntry( "ConfigureToolbar", bConfigureToolbar );
517  config.writeEntry( "ToolbarName", mToolbarName );
518  if ( !mIcon.isEmpty() )
519  config.writeEntry( "Icon", mIcon );
520  config.writeEntry( "AutomaticName", bAutoNaming );
521  config.writeEntry( "Applicability", (int)mApplicability );
522  config.writeEntry( "Enabled", bEnabled );
523  QString key;
524  int i;
525 
526  QList<FilterAction*>::const_iterator it;
527  QList<FilterAction*>::const_iterator end( mActions.constEnd() );
528 
529  for ( i=0, it = mActions.constBegin() ; it != end ; ++it, ++i ) {
530  config.writeEntry( key.sprintf("action-name-%d", i),
531  (*it)->name() );
532  config.writeEntry( key.sprintf("action-args-%d", i),
533  exportFilter ? ( *it )->argsAsStringReal() : (*it)->argsAsString() );
534  }
535  config.writeEntry( "actions", i );
536  if ( !mAccounts.isEmpty() )
537  config.writeEntry( "accounts-set", mAccounts );
538 }
539 
540 QString MailFilter::purify(bool removeAction)
541 {
542  QString informationAboutNotValidAction = mPattern.purify(removeAction);
543 
544  QListIterator<FilterAction*> it( mActions );
545  it.toBack();
546  while ( it.hasPrevious() ) {
547  FilterAction *action = it.previous();
548  if ( action->isEmpty() ) {
549  if (!informationAboutNotValidAction.isEmpty())
550  informationAboutNotValidAction += QLatin1Char('\n');
551  informationAboutNotValidAction += action->informationAboutNotValidAction();
552  if (removeAction)
553  mActions.removeAll ( action );
554  }
555  }
556 
557  if ( !Akonadi::AgentManager::self()->instances().isEmpty() ) { // safety test to ensure that Akonadi system is ready
558 
559  // Remove invalid accounts from mAccounts - just to be tidy
560  QStringList::Iterator it2 = mAccounts.begin();
561  while ( it2 != mAccounts.end() ) {
562  if ( !Akonadi::AgentManager::self()->instance( *it2 ).isValid() )
563  it2 = mAccounts.erase( it2 );
564  else
565  ++it2;
566  }
567  }
568  return informationAboutNotValidAction;
569 }
570 
571 bool MailFilter::isEmpty() const
572 {
573  return ( mPattern.isEmpty() && mActions.isEmpty() ) ||
574  ( ( applicability() == Checked ) && bApplyOnInbound && mAccounts.isEmpty() );
575 }
576 
577 QString MailFilter::toolbarName() const
578 {
579  if ( mToolbarName.isEmpty() )
580  return name();
581  else
582  return mToolbarName;
583 }
584 
585 const QString MailFilter::asString() const
586 {
587  QString result;
588 
589  result += "Filter name: " + name() + " (" + mIdentifier + ")\n";
590  result += mPattern.asString() + '\n';
591 
592  result += QString("Filter is %1\n").arg(bEnabled ? QLatin1String("enabled") : QLatin1String("disabled"));
593 
594  QList<FilterAction*>::const_iterator it( mActions.constBegin() );
595  QList<FilterAction*>::const_iterator end( mActions.constEnd() );
596  for ( ; it != end ; ++it ) {
597  result += " action: ";
598  result += (*it)->label();
599  result += ' ';
600  result += (*it)->argsAsString();
601  result += '\n';
602  }
603  result += "This filter belongs to the following sets:";
604  if ( bApplyOnInbound )
605  result += " Inbound";
606  if ( bApplyBeforeOutbound )
607  result += " before-Outbound";
608  if ( bApplyOnOutbound )
609  result += " Outbound";
610  if ( bApplyOnExplicit )
611  result += " Explicit";
612  result += '\n';
613  if ( bApplyOnInbound && mApplicability == All ) {
614  result += "This filter applies to all accounts.\n";
615  } else if ( bApplyOnInbound && mApplicability == ButImap ) {
616  result += "This filter applies to all but IMAP accounts.\n";
617  } else if ( bApplyOnInbound ) {
618  QStringList::ConstIterator it2;
619  result += "This filter applies to the following accounts:";
620  if ( mAccounts.isEmpty() )
621  result += " None";
622  else {
623  for ( it2 = mAccounts.begin() ; it2 != mAccounts.end() ; ++it2 ) {
624  if ( Akonadi::AgentManager::self()->instance( *it2 ).isValid() ) {
625  result += ' ' + Akonadi::AgentManager::self()->instance( *it2 ).name();
626  }
627  }
628  }
629  result += '\n';
630  }
631  if ( bStopProcessingHere )
632  result += "If it matches, processing stops at this filter.\n";
633 
634  return result;
635 }
636 
637 QDataStream& MailCommon::operator<<( QDataStream &stream, const MailCommon::MailFilter &filter )
638 {
639  stream << filter.mIdentifier;
640  stream << filter.mPattern.serialize();
641 
642  stream << filter.mActions.count();
643  QListIterator<FilterAction*> it( filter.mActions );
644  while ( it.hasNext() ) {
645  const FilterAction *action = it.next();
646  stream << action->name();
647  stream << action->argsAsString();
648  }
649 
650  stream << filter.mAccounts;
651  stream << filter.mIcon;
652  stream << filter.mToolbarName;
653  stream << filter.mShortcut.primary() << filter.mShortcut.alternate();
654  stream << filter.bApplyOnInbound;
655  stream << filter.bApplyBeforeOutbound;
656  stream << filter.bApplyOnOutbound;
657  stream << filter.bApplyOnExplicit;
658  stream << filter.bStopProcessingHere;
659  stream << filter.bConfigureShortcut;
660  stream << filter.bConfigureToolbar;
661  stream << filter.bAutoNaming;
662  stream << filter.mApplicability;
663  stream << filter.bEnabled;
664 
665  return stream;
666 }
667 
668 QDataStream& MailCommon::operator>>( QDataStream &stream, MailCommon::MailFilter &filter )
669 {
670  QByteArray pattern;
671  int numberOfActions;
672  QKeySequence primary, alternate;
673  bool bApplyOnInbound;
674  bool bApplyBeforeOutbound;
675  bool bApplyOnOutbound;
676  bool bApplyOnExplicit;
677  bool bStopProcessingHere;
678  bool bConfigureShortcut;
679  bool bConfigureToolbar;
680  bool bAutoNaming;
681  int applicability;
682  bool bEnabled;
683 
684  stream >> filter.mIdentifier;
685  stream >> pattern;
686 
687  stream >> numberOfActions;
688  qDeleteAll(filter.mActions);
689  filter.mActions.clear();
690 
691  for (int i = 0; i < numberOfActions; ++i) {
692  QString actionName;
693  QString actionArguments;
694 
695  stream >> actionName;
696  stream >> actionArguments;
697 
698  FilterActionDesc *description = FilterManager::filterActionDict()->value( actionName );
699  if ( description ) {
700  FilterAction *filterAction = description->create();
701  if ( filterAction ) {
702  filterAction->argsFromString( actionArguments );
703  filter.mActions.append( filterAction );
704  }
705  }
706  }
707 
708  stream >> filter.mAccounts;
709  stream >> filter.mIcon;
710  stream >> filter.mToolbarName;
711  stream >> primary >> alternate;
712  stream >> bApplyOnInbound;
713  stream >> bApplyBeforeOutbound;
714  stream >> bApplyOnOutbound;
715  stream >> bApplyOnExplicit;
716  stream >> bStopProcessingHere;
717  stream >> bConfigureShortcut;
718  stream >> bConfigureToolbar;
719  stream >> bAutoNaming;
720  stream >> applicability;
721  stream >> bEnabled;
722 
723  filter.mPattern.deserialize(pattern);
724  filter.mShortcut = KShortcut( primary, alternate );
725  filter.bApplyOnInbound = bApplyOnInbound;
726  filter.bApplyBeforeOutbound = bApplyBeforeOutbound;
727  filter.bApplyOnOutbound = bApplyOnOutbound;
728  filter.bApplyOnExplicit = bApplyOnExplicit;
729  filter.bStopProcessingHere = bStopProcessingHere;
730  filter.bConfigureShortcut = bConfigureShortcut;
731  filter.bConfigureToolbar = bConfigureToolbar;
732  filter.bAutoNaming = bAutoNaming;
733  filter.bEnabled = bEnabled;
734  filter.mApplicability = static_cast<MailCommon::MailFilter::AccountType>( applicability );
735 
736  return stream;
737 }
738 
739 
740 bool MailFilter::isEnabled() const
741 {
742  return bEnabled;
743 }
744 
745 void MailFilter::setEnabled( bool enabled )
746 {
747  bEnabled = enabled;
748 }
MailCommon::MailFilter::setConfigureShortcut
void setConfigureShortcut(bool aShort)
Set whether this filter should be plugged into the filter menu.
Definition: mailfilter.cpp:319
QList::clear
void clear()
MailCommon::MailFilter::applyOnExplicit
bool applyOnExplicit() const
Definition: mailfilter.cpp:234
MailCommon::SearchPattern::asString
QString asString() const
Returns the pattern as string.
Definition: searchpattern.cpp:277
MailCommon::SearchPattern::generateSieveScript
void generateSieveScript(QStringList &requires, QString &code)
Definition: searchpattern.cpp:403
FilterActionMissingAccountDialog::allAccountExist
static bool allAccountExist(const QStringList &lst)
Definition: filteractionmissingargumentdialog.cpp:396
MailCommon::MailFilter::ReturnCode
ReturnCode
Result codes returned by process.
Definition: mailfilter.h:59
MailCommon::MailFilter::GoOn
Definition: mailfilter.h:59
MailCommon::MailFilter::isEmpty
bool isEmpty() const
Check for empty pattern and action list.
Definition: mailfilter.cpp:571
QListIterator::next
const T & next()
QByteArray
QListIterator::previous
const T & previous()
MailCommon::SearchPattern::serialize
QByteArray serialize() const
Writes the pattern into a byte array for persistance purposes.
Definition: searchpattern.cpp:350
MailCommon::MailFilter::generateRandomIdentifier
void generateRandomIdentifier()
Definition: mailfilter.cpp:120
MailCommon::MailFilter::~MailFilter
~MailFilter()
Cleanup.
Definition: mailfilter.cpp:115
QDataStream
MailCommon::MailFilter::shortcut
const KShortcut & shortcut() const
Definition: mailfilter.cpp:350
MailCommon::MailFilter::CriticalError
Definition: mailfilter.h:59
MailCommon::MailFilter::purify
QString purify(bool removeAction=true)
Remove empty rules (and actions one day).
Definition: mailfilter.cpp:540
MailCommon::FilterAction::requiredPart
virtual SearchRule::RequiredPart requiredPart() const =0
Returns the required part from the item that is needed for the action to operate. ...
QStringList::contains
bool contains(const QString &str, Qt::CaseSensitivity cs) const
MailCommon::SearchPattern::readConfig
void readConfig(const KConfigGroup &config)
Reads a search pattern from a KConfigGroup.
Definition: searchpattern.cpp:161
filteractionmissingargumentdialog.h
MailCommon::MailFilter::setApplyOnOutbound
void setApplyOnOutbound(bool aApply=true)
Set whether this filter should be applied on outbound messages (aApply == true) or not...
Definition: mailfilter.cpp:199
MailCommon::MailFilter::setShortcut
void setShortcut(const KShortcut &shortcut)
Set the shortcut to be used if plugged into the filter menu or toolbar.
Definition: mailfilter.cpp:345
MailCommon::FilterAction::argsAsString
virtual QString argsAsString() const =0
Return extra arguments as string.
QList::erase
iterator erase(iterator pos)
mailfilter.h
MailCommon::FILTER_MAX_ACTIONS
const int FILTER_MAX_ACTIONS
Definition: mailfilter.h:40
MailCommon::MailFilter::requiredPart
SearchRule::RequiredPart requiredPart(const QString &id) const
Returns the required part from the item that is needed for the filter to operate. ...
Definition: mailfilter.cpp:249
MailCommon::MailFilter::actions
QList< FilterAction * > * actions()
Provides a reference to the internal action list.
Definition: mailfilter.cpp:179
MailCommon::MailFilter::asString
const QString asString() const
Returns the filter in a human-readable form.
Definition: mailfilter.cpp:585
MailCommon::MailFilter::ButImap
Definition: mailfilter.h:70
MailCommon::MailFilter::generateSieveScript
void generateSieveScript(QStringList &requires, QString &code)
Definition: mailfilter.cpp:470
QList::const_iterator
MailCommon::FilterLog::instance
static FilterLog * instance()
Returns the single global instance of the filter log.
Definition: filterlog.cpp:107
MailCommon::FilterLog
KMail Filter Log Collector.
Definition: filterlog.h:55
filterlog.h
MailCommon::FilterAction
Abstract base class for mail filter actions.
Definition: filteraction.h:52
MailCommon::MailFilter::setStopProcessingHere
void setStopProcessingHere(bool aStop)
Definition: mailfilter.cpp:309
MailCommon::MailFilter::MailFilter
MailFilter()
Constructor that initializes basic settings.
Definition: mailfilter.cpp:54
QList::append
void append(const T &value)
MailCommon::FilterAction::informationAboutNotValidAction
virtual QString informationAboutNotValidAction() const
Definition: filteraction.cpp:60
MailCommon::MailFilter::setApplyBeforeOutbound
void setApplyBeforeOutbound(bool aApply=true)
Set whether this filter should be applied on outbound messages before sending (aApply == TRUE) or not...
Definition: mailfilter.cpp:204
MailCommon::SearchPattern::deserialize
void deserialize(const QByteArray &)
Constructs the pattern from a byte array serialization.
Definition: searchpattern.cpp:358
MailCommon::FilterAction::ErrorButGoOn
A non-critical error occurred.
Definition: filteraction.h:63
MailCommon::FilterLog::isLogging
bool isLogging() const
Returns whether the filter log is currently active.
Definition: filterlog.cpp:116
MailCommon::MailFilter::identifier
QString identifier() const
Returns the unique identifier of this filter.
Definition: mailfilter.cpp:125
MailCommon::MailFilter::setToolbarName
void setToolbarName(const QString &toolbarName)
This sets the toolbar name for this filter.
Definition: mailfilter.cpp:340
MailCommon::FilterAction::argsFromStringInteractive
virtual bool argsFromStringInteractive(const QString &argsStr, const QString &filterName)
Read extra arguments from given string.
Definition: filteraction.cpp:89
QList::isEmpty
bool isEmpty() const
QString::isEmpty
bool isEmpty() const
QList::removeAll
int removeAll(const T &value)
MailCommon::FilterAction::isEmpty
virtual bool isEmpty() const
Determines whether this action is valid.
Definition: filteraction.cpp:55
MailCommon::MailFilter::applyOnOutbound
bool applyOnOutbound() const
Definition: mailfilter.cpp:209
MailCommon::MailFilter::setEnabled
void setEnabled(bool)
Definition: mailfilter.cpp:745
MailCommon::MailFilter::configureShortcut
bool configureShortcut() const
Definition: mailfilter.cpp:325
QList::Iterator
typedef Iterator
MailCommon::MailFilter::configureToolbar
bool configureToolbar() const
Definition: mailfilter.cpp:335
MailCommon::SearchPattern::writeConfig
void writeConfig(KConfigGroup &config) const
Writes itself into config.
Definition: searchpattern.cpp:241
QListIterator::toBack
void toBack()
MailCommon::SearchRule::RequiredPart
RequiredPart
Definition: searchrule.h:79
QString
QList
MailCommon::SearchPattern
This class is an abstraction of a search over messages.
Definition: searchpattern.h:79
MailCommon::MailFilter::applyOnAccount
bool applyOnAccount(const QString &id) const
Definition: mailfilter.cpp:291
MailCommon::FilterAction::name
QString name() const
Returns identifier name, ie.
Definition: filteraction.cpp:50
MailCommon::MailFilter::isEnabled
bool isEnabled() const
Return if filter is enabled or not.
Definition: mailfilter.cpp:740
QStringList
MailCommon::MailFilter::applyOnInbound
bool applyOnInbound() const
Definition: mailfilter.cpp:224
MailCommon::MailFilter::writeConfig
void writeConfig(KConfigGroup &config, bool exportFilter) const
Write contents to given config group.
Definition: mailfilter.cpp:496
QList::end
iterator end()
MailCommon::FilterLog::AppliedAction
Log all applied actions.
Definition: filterlog.h:78
FilterActionMissingAccountDialog::selectedAccount
QStringList selectedAccount() const
Definition: filteractionmissingargumentdialog.cpp:391
MailCommon::MailFilter::stopProcessingHere
bool stopProcessingHere() const
Definition: mailfilter.cpp:314
QLatin1Char
MailCommon::FilterActionDesc
Auxiliary struct for FilterActionDict.
Definition: filteractiondict.h:36
MailCommon::MailFilter::AccountType
AccountType
Account type codes used by setApplicability.
Definition: mailfilter.h:70
MailCommon::FilterManager::filterActionDict
static FilterActionDict * filterActionDict()
Returns the global filter action dictionary.
Definition: filtermanager.cpp:106
MailCommon::SearchRule::Envelope
Definition: searchrule.h:80
MailCommon::MailFilter::readConfig
bool readConfig(const KConfigGroup &config, bool interactive=false)
Initialize from given config group.
Definition: mailfilter.cpp:376
MailCommon::MailFilter::NoResult
Definition: mailfilter.h:59
MailCommon::operator>>
MAILCOMMON_EXPORT QDataStream & operator>>(QDataStream &stream, MailFilter &filter)
Definition: mailfilter.cpp:668
MailCommon::MailFilter::All
Definition: mailfilter.h:70
QListIterator::hasPrevious
bool hasPrevious() const
MailCommon::MailFilter::setIcon
void setIcon(const QString &icon)
Set the icon to be used if plugged into the filter menu or toolbar.
Definition: mailfilter.cpp:355
MailCommon::FilterAction::ReturnCode
ReturnCode
Describes the possible return codes of filter processing:
Definition: filteraction.h:60
MailCommon::MailFilter::applicability
AccountType applicability() const
Definition: mailfilter.cpp:244
MailCommon::MailFilter::setApplicability
void setApplicability(AccountType aApply=All)
Set whether this filter should be applied on inbound messages for all accounts (aApply == All) or inb...
Definition: mailfilter.cpp:239
QLatin1String
QKeySequence
QString::sprintf
QString & sprintf(const char *cformat,...)
MailCommon::operator<<
MAILCOMMON_EXPORT QDataStream & operator<<(QDataStream &stream, const MailFilter &filter)
Definition: mailfilter.cpp:637
MailCommon::FilterAction::argsFromString
virtual void argsFromString(const QString &argsStr)=0
Read extra arguments from given string.
MailCommon::MailFilter::icon
QString icon() const
Definition: mailfilter.cpp:360
QList::ConstIterator
typedef ConstIterator
MailCommon::MailFilter::setConfigureToolbar
void setConfigureToolbar(bool aTool)
Set whether this filter should be plugged into the toolbar.
Definition: mailfilter.cpp:330
context
const char * context
Definition: searchpatternedit.cpp:54
MailCommon::MailFilter::setAutoNaming
void setAutoNaming(bool useAutomaticNames)
Set the mode for using automatic naming for the filter.
Definition: mailfilter.cpp:365
MailCommon::MailFilter::name
QString name() const
Equivalent to ()->name().
Definition: mailfilter.cpp:130
MailCommon::MailFilter::execActions
ReturnCode execActions(ItemContext &context, bool &stopIt, bool applyOnOutbound) const
Execute the filter action(s) on the given message.
Definition: mailfilter.cpp:135
QString::fromLatin1
QString fromLatin1(const char *str, int size)
MailCommon::FilterActionDesc::create
FilterActionNewFunc create
Definition: filteractiondict.h:39
MailCommon::MailFilter::setApplyOnExplicit
void setApplyOnExplicit(bool aApply=true)
Set whether this filter should be applied on explicit (CTRL-J) filtering (aApply == true) or not...
Definition: mailfilter.cpp:229
MailCommon::MailFilter::setApplyOnInbound
void setApplyOnInbound(bool aApply=true)
Set whether this filter should be applied on inbound messages (aApply == true) or not...
Definition: mailfilter.cpp:219
QListIterator
MailCommon::MailFilter::Checked
Definition: mailfilter.h:70
MailCommon::SearchPattern::requiredPart
SearchRule::RequiredPart requiredPart() const
Returns the required part from the item that is needed for the search to operate. ...
Definition: searchpattern.cpp:123
MailCommon::MailFilter::folderRemoved
void folderRemoved(const Akonadi::Collection &aFolder, const Akonadi::Collection &aNewFolder)
Called from the filter manager when a folder is moved.
Definition: mailfilter.cpp:275
MailCommon::FilterLog::add
void add(const QString &entry, ContentType type)
Adds the given log entry under the given content type to the log.
Definition: filterlog.cpp:164
MailCommon::SearchPattern::purify
QString purify(bool removeAction=true)
Removes all empty rules from the list.
Definition: searchpattern.cpp:136
filtermanager.h
MailCommon::MailFilter::setApplyOnAccount
void setApplyOnAccount(const QString &id, bool aApply=true)
Set whether this filter should be applied on inbound messages for the account with id (id)...
Definition: mailfilter.cpp:282
FilterActionMissingAccountDialog
Definition: filteractionmissingargumentdialog.h:130
QList::constEnd
const_iterator constEnd() const
QList::constBegin
const_iterator constBegin() const
MailCommon::MailFilter::applyBeforeOutbound
bool applyBeforeOutbound() const
Definition: mailfilter.cpp:214
MailCommon::ItemContext
A helper class for the filtering process.
Definition: itemcontext.h:39
MailCommon::MailFilter::isAutoNaming
bool isAutoNaming() const
Definition: mailfilter.cpp:370
MailCommon::MailFilter::pattern
SearchPattern * pattern()
Provides a reference to the internal pattern.
Definition: mailfilter.cpp:189
MailCommon::MailFilter
Definition: mailfilter.h:42
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
QList::begin
iterator begin()
MailCommon::MailFilter::toolbarName
QString toolbarName() const
Definition: mailfilter.cpp:577
filteraction.h
MailCommon::FilterAction::CriticalError
(e.g.
Definition: filteraction.h:66
MailCommon::SearchPattern::name
QString name() const
Returns the name of the search pattern.
Definition: searchpattern.h:172
filteractiondict.h
QListIterator::hasNext
bool hasNext() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:31:40 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

mailcommon

Skip menu "mailcommon"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer
  • pimprint

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal