• 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
filterimporterexporter.cpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2007 Till Adam <adam@kde.org>
3 
4  This program is free software; you can redistribute it and/or modify it
5  under the terms of the GNU General Public License, version 2, as
6  published by the Free Software Foundation.
7 
8  This program is distributed in the hope that it will be useful, but
9  WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License
14  along with this program; if not, write to the Free Software
15  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16 
17  In addition, as a special exception, the copyright holders give
18  permission to link the code of this program with any edition of
19  the Qt library by Trolltech AS, Norway (or with modified versions
20  of Qt that use the same license as Qt), and distribute linked
21  combinations including the two. You must obey the GNU General
22  Public License in all respects for all of the code used other than
23  Qt. If you modify this file, you may extend this exception to
24  your version of the file, but you are not obligated to do so. If
25  you do not wish to do so, delete this exception statement from
26  your version.
27 */
28 
29 #include "filterimporterexporter.h"
30 #include "filterselectiondialog.h"
31 #include "filteraction.h"
32 #include "filtermanager.h"
33 #include "mailfilter.h"
34 
35 #include "filterimporter/filterimporterthunderbird_p.h"
36 #include "filterimporter/filterimporterevolution_p.h"
37 #include "filterimporter/filterimportersylpheed_p.h"
38 #include "filterimporter/filterimporterprocmail_p.h"
39 #include "filterimporter/filterimporterbalsa_p.h"
40 #include "filterimporter/filterimporterclawsmail_p.h"
41 #include "dialog/selectthunderbirdfilterfilesdialog.h"
42 
43 #include <messageviewer/utils/autoqpointer.h>
44 #include <messageviewer/utils/util.h>
45 
46 #include <KConfig>
47 #include <KDebug>
48 #include <KFileDialog>
49 #include <KListWidgetSearchLine>
50 #include <KMessageBox>
51 #include <KPushButton>
52 
53 #include <QListWidget>
54 #include <QRegExp>
55 #include <QVBoxLayout>
56 
57 using namespace MailCommon;
58 
59 QList<MailFilter*> FilterImporterExporter::readFiltersFromConfig(
60  const KSharedConfig::Ptr config, QStringList &emptyFilters )
61 {
62  const KConfigGroup group = config->group( "General" );
63 
64  const int numFilters = group.readEntry( "filters", 0 );
65 
66  bool filterNeedUpdate = false;
67  QList<MailFilter*> filters;
68  for ( int i = 0; i < numFilters; ++i ) {
69  const QString groupName = QString::fromLatin1( "Filter #%1" ).arg( i );
70 
71  const KConfigGroup group = config->group( groupName );
72  bool update = false;
73  MailFilter *filter = new MailFilter( group, true/*interactive*/, update );
74  filter->purify();
75  if ( update ) {
76  filterNeedUpdate = true;
77  }
78  if ( filter->isEmpty() ) {
79 #ifndef NDEBUG
80  kDebug() << "Filter" << filter->asString() << "is empty!";
81 #endif
82  emptyFilters << filter->name();
83  delete filter;
84  } else {
85  filters.append( filter );
86  }
87  }
88  if ( filterNeedUpdate ) {
89  KSharedConfig::Ptr config = KSharedConfig::openConfig( QLatin1String("akonadi_mailfilter_agentrc") );
90 
91  // Now, write out the new stuff:
92  FilterImporterExporter::writeFiltersToConfig( filters, config );
93  KConfigGroup group = config->group( "General" );
94  group.sync();
95  }
96  return filters;
97 }
98 
99 void FilterImporterExporter::writeFiltersToConfig( const QList<MailFilter*> &filters,
100  KSharedConfig::Ptr config,
101  bool exportFiler )
102 {
103  // first, delete all filter groups:
104  const QStringList filterGroups =
105  config->groupList().filter( QRegExp( QLatin1String("Filter #\\d+") ) );
106 
107  foreach ( const QString &group, filterGroups ) {
108  config->deleteGroup( group );
109  }
110 
111  int i = 0;
112  foreach ( const MailFilter *filter, filters ) {
113  if ( !filter->isEmpty() ) {
114  const QString groupName = QString::fromLatin1( "Filter #%1" ).arg( i );
115 
116  KConfigGroup group = config->group( groupName );
117  filter->writeConfig( group, exportFiler );
118  ++i;
119  }
120  }
121 
122  KConfigGroup group = config->group( "General" );
123  group.writeEntry( "filters", i );
124 
125  config->sync();
126 }
127 
128 class FilterImporterExporter::Private
129 {
130 public:
131  Private( QWidget *parent )
132  : mParent( parent )
133  {
134  }
135  void warningInfoAboutInvalidFilter( const QStringList &emptyFilters ) const;
136  QWidget *mParent;
137 };
138 
139 void FilterImporterExporter::Private::warningInfoAboutInvalidFilter(
140  const QStringList &emptyFilters ) const
141 {
142  if ( !emptyFilters.isEmpty() ) {
143  KMessageBox::informationList(
144  mParent,
145  i18n( "The following filters have not been saved because they were invalid "
146  "(e.g. containing no actions or no search rules)." ),
147  emptyFilters,
148  QString(),
149  QLatin1String("ShowInvalidFilterWarning") );
150  }
151 }
152 
153 FilterImporterExporter::FilterImporterExporter( QWidget *parent )
154  : d( new Private( parent ) )
155 {
156 }
157 
158 FilterImporterExporter::~FilterImporterExporter()
159 {
160  delete d;
161 }
162 
163 QList<MailFilter *> FilterImporterExporter::importFilters(
164  bool &canceled, FilterImporterExporter::FilterType type, const QString& filename )
165 {
166  QString fileName( filename );
167 
168  QFile file;
169  if (type != ThunderBirdFilter) {
170  if ( fileName.isEmpty() ) {
171  QString title;
172  QString defaultPath;
173  switch(type){
174  case KMailFilter:
175  title = i18n( "Import KMail Filters" );
176  defaultPath = QDir::homePath();
177  break;
178  case ThunderBirdFilter:
179  title = i18n( "Import Thunderbird Filters" );
180  defaultPath = MailCommon::FilterImporterThunderbird::defaultFiltersSettingsPath();
181  break;
182  case EvolutionFilter:
183  title = i18n( "Import Evolution Filters" );
184  defaultPath = MailCommon::FilterImporterEvolution::defaultFiltersSettingsPath();
185  break;
186  case SylpheedFilter:
187  title = i18n( "Import Sylpheed Filters" );
188  defaultPath = MailCommon::FilterImporterSylpheed::defaultFiltersSettingsPath();
189  break;
190  case ProcmailFilter:
191  title = i18n( "Import Procmail Filters" );
192  defaultPath = MailCommon::FilterImporterProcmail::defaultFiltersSettingsPath();
193  break;
194  case BalsaFilter:
195  title = i18n( "Import Balsa Filters" );
196  defaultPath = MailCommon::FilterImporterBalsa::defaultFiltersSettingsPath();
197  break;
198  case ClawsMailFilter:
199  title = i18n( "Import Claws Mail Filters" );
200  defaultPath = MailCommon::FilterImporterClawsMails::defaultFiltersSettingsPath();
201  break;
202  }
203 
204  fileName = KFileDialog::getOpenFileName(
205  defaultPath, QString(), d->mParent, title );
206  if ( fileName.isEmpty() ) {
207  canceled = true;
208  return QList<MailFilter*>(); // cancel
209  }
210  }
211  file.setFileName( fileName );
212  if ( !file.open( QIODevice::ReadOnly ) ) {
213  KMessageBox::error(
214  d->mParent,
215  i18n( "The selected file is not readable. "
216  "Your file access permissions might be insufficient." ) );
217  return QList<MailFilter*>();
218  }
219  }
220 
221  QList<MailFilter*> imported;
222  QStringList emptyFilter;
223 
224  switch(type){
225  case KMailFilter:
226  {
227  const KSharedConfig::Ptr config = KSharedConfig::openConfig( fileName );
228  imported = readFiltersFromConfig( config, emptyFilter );
229  break;
230  }
231  case ThunderBirdFilter:
232  {
233  if (fileName.isEmpty()) {
234  SelectThunderbirdFilterFilesDialog * selectThunderBirdFileDialog = new SelectThunderbirdFilterFilesDialog(d->mParent);
235  selectThunderBirdFileDialog->setStartDir(KUrl(MailCommon::FilterImporterThunderbird::defaultFiltersSettingsPath()));
236  if (selectThunderBirdFileDialog->exec()) {
237  Q_FOREACH(const QString& url, selectThunderBirdFileDialog->selectedFiles()) {
238  QFile fileThunderbird(url);
239  if (!fileThunderbird.open( QIODevice::ReadOnly )) {
240  KMessageBox::error(
241  d->mParent,
242  i18n( "The selected file is not readable. "
243  "Your file access permissions might be insufficient." ) );
244  } else {
245 
246  MailCommon::FilterImporterThunderbird *thunderBirdFilter =
247  new MailCommon::FilterImporterThunderbird( &fileThunderbird );
248 
249  imported.append(thunderBirdFilter->importFilter());
250  emptyFilter.append(thunderBirdFilter->emptyFilter());
251  delete thunderBirdFilter;
252  }
253  }
254  } else {
255  canceled = true;
256  delete selectThunderBirdFileDialog;
257  return QList<MailFilter*>();
258  }
259  delete selectThunderBirdFileDialog;
260  } else {
261  file.setFileName( fileName );
262  if ( !file.open( QIODevice::ReadOnly ) ) {
263  KMessageBox::error(
264  d->mParent,
265  i18n( "The selected file is not readable. "
266  "Your file access permissions might be insufficient." ) );
267  return QList<MailFilter*>();
268  }
269 
270  MailCommon::FilterImporterThunderbird *thunderBirdFilter = new MailCommon::FilterImporterThunderbird( &file );
271  imported = thunderBirdFilter->importFilter();
272  emptyFilter = thunderBirdFilter->emptyFilter();
273  delete thunderBirdFilter;
274  }
275  break;
276  }
277  case EvolutionFilter:
278  {
279  MailCommon::FilterImporterEvolution *filter =
280  new MailCommon::FilterImporterEvolution( &file );
281 
282  imported = filter->importFilter();
283  emptyFilter = filter->emptyFilter();
284  delete filter;
285  break;
286  }
287  case SylpheedFilter:
288  {
289  MailCommon::FilterImporterSylpheed *filter =
290  new MailCommon::FilterImporterSylpheed( &file );
291 
292  imported = filter->importFilter();
293  emptyFilter = filter->emptyFilter();
294  delete filter;
295  break;
296  }
297  case ProcmailFilter:
298  {
299  MailCommon::FilterImporterProcmail *filter =
300  new MailCommon::FilterImporterProcmail( &file );
301 
302  imported = filter->importFilter();
303  emptyFilter = filter->emptyFilter();
304  delete filter;
305  break;
306  }
307  case BalsaFilter:
308  {
309  MailCommon::FilterImporterBalsa *filter =
310  new MailCommon::FilterImporterBalsa( &file );
311 
312  imported = filter->importFilter();
313  emptyFilter = filter->emptyFilter();
314  delete filter;
315  break;
316  }
317  case ClawsMailFilter:
318  {
319  MailCommon::FilterImporterClawsMails *filter =
320  new MailCommon::FilterImporterClawsMails( &file );
321 
322  imported = filter->importFilter();
323  emptyFilter = filter->emptyFilter();
324  delete filter;
325  break;
326  }
327  }
328  d->warningInfoAboutInvalidFilter( emptyFilter );
329  file.close();
330 
331  FilterSelectionDialog dlg( d->mParent );
332  dlg.setFilters( imported );
333  if ( dlg.exec() == QDialog::Accepted ) {
334  return dlg.selectedFilters();
335  }
336  canceled = true;
337  return QList<MailFilter*>();
338 }
339 
340 void FilterImporterExporter::exportFilters( const QList<MailFilter*> &filters, const KUrl &fileName, bool saveAll )
341 {
342  KUrl saveUrl;
343  if (fileName.isEmpty()) {
344  saveUrl = KFileDialog::getSaveUrl(
345  QDir::homePath(), QString(), d->mParent, i18n( "Export Filters" ) );
346 
347  if ( saveUrl.isEmpty() ||
348  !MessageViewer::Util::checkOverwrite( saveUrl, d->mParent ) ) {
349  qDeleteAll(filters);
350  return;
351  }
352  } else {
353  saveUrl= fileName;
354  }
355  KSharedConfig::Ptr config = KSharedConfig::openConfig( saveUrl.toLocalFile() );
356  if (saveAll) {
357  writeFiltersToConfig( filters, config, true );
358  qDeleteAll(filters);
359  } else {
360  MessageViewer::AutoQPointer<FilterSelectionDialog> dlg( new FilterSelectionDialog( d->mParent ) );
361  dlg->setFilters( filters );
362  if ( dlg->exec() == QDialog::Accepted && dlg ) {
363  QList<MailFilter*> lst = dlg->selectedFilters();
364  writeFiltersToConfig( lst, config, true );
365  qDeleteAll(lst);
366  }
367  }
368 }
MailCommon::FilterImporterProcmail::defaultFiltersSettingsPath
static QString defaultFiltersSettingsPath()
Definition: filterimporterprocmail.cpp:47
selectthunderbirdfilterfilesdialog.h
MailCommon::FilterImporterAbstract::importFilter
QList< MailFilter * > importFilter() const
Definition: filterimporterabstract.cpp:37
filterimporterthunderbird_p.h
MailCommon::MailFilter::isEmpty
bool isEmpty() const
Check for empty pattern and action list.
Definition: mailfilter.cpp:563
MailCommon::FilterImporterExporter::ClawsMailFilter
Definition: filterimporterexporter.h:63
filterselectiondialog.h
MailCommon::SelectThunderbirdFilterFilesDialog::setStartDir
void setStartDir(const KUrl &)
Definition: selectthunderbirdfilterfilesdialog.cpp:55
MailCommon::FilterImporterExporter::BalsaFilter
Definition: filterimporterexporter.h:62
QWidget
MailCommon::FilterImporterSylpheed::defaultFiltersSettingsPath
static QString defaultFiltersSettingsPath()
Definition: filterimportersylpheed.cpp:56
MailCommon::FilterImporterThunderbird
Definition: filterimporterthunderbird_p.h:31
MailCommon::FilterImporterExporter::importFilters
QList< MailFilter * > importFilters(bool &canceled, FilterImporterExporter::FilterType type=FilterImporterExporter::KMailFilter, const QString &filename=QString())
Imports filters.
Definition: filterimporterexporter.cpp:163
mailfilter.h
MailCommon::MailFilter::asString
const QString asString() const
Returns the filter in a human-readable form.
Definition: mailfilter.cpp:578
MailCommon::SelectThunderbirdFilterFilesDialog::selectedFiles
QStringList selectedFiles() const
Definition: selectthunderbirdfilterfilesdialog.cpp:50
filterimportersylpheed_p.h
MailCommon::MailFilter::purify
void purify()
Remove empty rules (and actions one day).
Definition: mailfilter.cpp:538
MailCommon::FilterImporterSylpheed
Definition: filterimportersylpheed_p.h:31
MailCommon::FilterImporterExporter::~FilterImporterExporter
virtual ~FilterImporterExporter()
Destroys the filter importer/exporter.
Definition: filterimporterexporter.cpp:158
filterimporterbalsa_p.h
MailCommon::FilterImporterBalsa
Definition: filterimporterbalsa_p.h:32
MailCommon::FilterImporterBalsa::defaultFiltersSettingsPath
static QString defaultFiltersSettingsPath()
Definition: filterimporterbalsa.cpp:46
MailCommon::FilterImporterExporter::FilterImporterExporter
FilterImporterExporter(QWidget *parent=0)
Creates a new filter importer/exporter.
Definition: filterimporterexporter.cpp:153
filterimporterprocmail_p.h
MailCommon::FilterImporterExporter::FilterType
FilterType
Definition: filterimporterexporter.h:56
MailCommon::FilterImporterEvolution
Definition: filterimporterevolution_p.h:31
MailCommon::FilterImporterExporter::SylpheedFilter
Definition: filterimporterexporter.h:60
MailCommon::MailFilter::writeConfig
void writeConfig(KConfigGroup &config, bool exportFilter) const
Write contents to given config group.
Definition: mailfilter.cpp:494
MailCommon::FilterImporterExporter::ProcmailFilter
Definition: filterimporterexporter.h:61
MailCommon::FilterImporterExporter::writeFiltersToConfig
static void writeFiltersToConfig(const QList< MailFilter * > &filters, KSharedConfig::Ptr config, bool exportFilter=false)
Writes the given list of filters to the given config file.
Definition: filterimporterexporter.cpp:99
MailCommon::FilterImporterExporter::exportFilters
void exportFilters(const QList< MailFilter * > &filters, const KUrl &fileName=KUrl(), bool saveAll=false)
Exports the given filters to a file which is asked from the user.
Definition: filterimporterexporter.cpp:340
MailCommon::FilterSelectionDialog::setFilters
void setFilters(const QList< MailFilter * > &filters)
Definition: filterselectiondialog.cpp:96
filterimporterexporter.h
MailCommon::FilterImporterClawsMails
Definition: filterimporterclawsmail_p.h:31
filterimporterclawsmail_p.h
MailCommon::FilterImporterClawsMails::defaultFiltersSettingsPath
static QString defaultFiltersSettingsPath()
Definition: filterimporterclawsmail.cpp:61
MailCommon::MailFilter::name
QString name() const
Equivalent to ()->name().
Definition: mailfilter.cpp:123
filterimporterevolution_p.h
MailCommon::FilterImporterProcmail
Definition: filterimporterprocmail_p.h:31
MailCommon::FilterImporterEvolution::defaultFiltersSettingsPath
static QString defaultFiltersSettingsPath()
Definition: filterimporterevolution.cpp:57
MailCommon::FilterImporterExporter::readFiltersFromConfig
static QList< MailFilter * > readFiltersFromConfig(const KSharedConfig::Ptr config, QStringList &emptyFilter)
Reads a list of filters from the given config file.
Definition: filterimporterexporter.cpp:59
MailCommon::FilterImporterAbstract::emptyFilter
QStringList emptyFilter() const
Definition: filterimporterabstract.cpp:42
filtermanager.h
MailCommon::FilterImporterThunderbird::defaultFiltersSettingsPath
static QString defaultFiltersSettingsPath()
Definition: filterimporterthunderbird.cpp:57
MailCommon::FilterSelectionDialog
Definition: filterselectiondialog.h:35
MailCommon::FilterSelectionDialog::selectedFilters
QList< MailFilter * > selectedFilters() const
Definition: filterselectiondialog.cpp:113
MailCommon::SelectThunderbirdFilterFilesDialog
Definition: selectthunderbirdfilterfilesdialog.h:26
MailCommon::MailFilter
Definition: mailfilter.h:42
MailCommon::FilterImporterExporter::EvolutionFilter
Definition: filterimporterexporter.h:59
filteraction.h
QList
MailCommon::FilterImporterExporter::ThunderBirdFilter
Definition: filterimporterexporter.h:58
MailCommon::FilterImporterExporter::KMailFilter
Definition: filterimporterexporter.h:57
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:55:14 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