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

mailcommon

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

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