• 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
filtermanager.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2011 Tobias Koenig <tokoe@kde.org>
3 
4  This library is free software; you can redistribute it and/or modify it
5  under the terms of the GNU Library General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or (at your
7  option) any later version.
8 
9  This library is distributed in the hope that it will be useful, but WITHOUT
10  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
12  License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to the
16  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  02110-1301, USA.
18 */
19 
20 #include "filtermanager.h"
21 
22 #include "filteractions/filteraction.h"
23 #include "filteractions/filteractiondict.h"
24 #include "filterimporterexporter.h"
25 #include "mailfilteragentinterface.h"
26 #include <kconfiggroup.h>
27 #include <Akonadi/Monitor>
28 #include <Akonadi/Tag>
29 #include <Akonadi/TagFetchJob>
30 #include <Akonadi/TagFetchScope>
31 #include <Akonadi/TagAttribute>
32 
33 #include <QTimer>
34 
35 namespace MailCommon {
36 
37 class FilterManager::Private
38 {
39 public:
40  Private( FilterManager *qq )
41  : q( qq ), mMailFilterAgentInterface(0), mMonitor(new Akonadi::Monitor), mInitialized(false)
42  {
43  mMailFilterAgentInterface = new org::freedesktop::Akonadi::MailFilterAgent( QLatin1String( "org.freedesktop.Akonadi.MailFilterAgent" ),
44  QLatin1String( "/MailFilterAgent" ),
45  QDBusConnection::sessionBus(), q );
46  }
47 
48  void readConfig();
49  void writeConfig( bool withSync = true ) const;
50  void clear();
51 
52  QMap<QUrl, QString> mTagList;
53  static FilterManager *mInstance;
54  static FilterActionDict *mFilterActionDict;
55 
56  FilterManager *q;
57  OrgFreedesktopAkonadiMailFilterAgentInterface *mMailFilterAgentInterface;
58  QList<MailCommon::MailFilter *> mFilters;
59  Akonadi::Monitor *mMonitor;
60  bool mInitialized;
61 };
62 
63 void FilterManager::Private::readConfig()
64 {
65  KSharedConfig::Ptr config = KSharedConfig::openConfig( QLatin1String("akonadi_mailfilter_agentrc") );
66  clear();
67  QStringList emptyFilters;
68  mFilters = FilterImporterExporter::readFiltersFromConfig( config, emptyFilters );
69  emit q->filtersChanged();
70 }
71 
72 void FilterManager::Private::writeConfig( bool withSync ) const
73 {
74  KSharedConfig::Ptr config = KSharedConfig::openConfig( QLatin1String("akonadi_mailfilter_agentrc") );
75 
76  // Now, write out the new stuff:
77  FilterImporterExporter::writeFiltersToConfig( mFilters, config );
78  KConfigGroup group = config->group( "General" );
79 
80  if ( withSync ) {
81  group.sync();
82  }
83 }
84 
85 void FilterManager::Private::clear()
86 {
87  qDeleteAll( mFilters );
88  mFilters.clear();
89 }
90 
91 }
92 
93 using namespace MailCommon;
94 
95 FilterManager* FilterManager::Private::mInstance = 0;
96 FilterActionDict* FilterManager::Private::mFilterActionDict = 0;
97 
98 FilterManager* FilterManager::instance()
99 {
100  if ( !FilterManager::Private::mInstance )
101  FilterManager::Private::mInstance = new FilterManager;
102 
103  return FilterManager::Private::mInstance;
104 }
105 
106 FilterActionDict* FilterManager::filterActionDict()
107 {
108  if ( !FilterManager::Private::mFilterActionDict )
109  FilterManager::Private::mFilterActionDict = new FilterActionDict;
110 
111  return FilterManager::Private::mFilterActionDict;
112 }
113 
114 
115 FilterManager::FilterManager()
116  : d( new Private( this ) )
117 {
118  updateTagList();
119 
120  d->mMonitor->setTypeMonitored(Akonadi::Monitor::Tags);
121  d->mMonitor->tagFetchScope().fetchAttribute<Akonadi::TagAttribute>();
122  connect(d->mMonitor, SIGNAL(tagAdded(Akonadi::Tag)), this, SLOT(slotTagAdded(Akonadi::Tag)));
123  connect(d->mMonitor, SIGNAL(tagRemoved(Akonadi::Tag)), this, SLOT(slotTagRemoved(Akonadi::Tag)));
124  connect(d->mMonitor, SIGNAL(tagChanged(Akonadi::Tag)), this, SLOT(slotTagChanged(Akonadi::Tag)));
125 
126  qDBusRegisterMetaType<QList<qint64> >();
127  Akonadi::ServerManager::State state = Akonadi::ServerManager::self()->state();
128  if (state == Akonadi::ServerManager::Running) {
129  QTimer::singleShot(0,this,SLOT(slotReadConfig()));
130  } else {
131  connect( Akonadi::ServerManager::self(), SIGNAL(stateChanged(Akonadi::ServerManager::State)),
132  SLOT(slotServerStateChanged(Akonadi::ServerManager::State)) );
133  }
134 }
135 
136 void FilterManager::slotServerStateChanged(Akonadi::ServerManager::State state)
137 {
138  if (state == Akonadi::ServerManager::Running) {
139  d->readConfig();
140  disconnect( Akonadi::ServerManager::self(), SIGNAL(stateChanged(Akonadi::ServerManager::State)));
141  }
142 }
143 
144 void FilterManager::updateTagList()
145 {
146  Akonadi::TagFetchJob *fetchJob = new Akonadi::TagFetchJob(this);
147  fetchJob->fetchScope().fetchAttribute<Akonadi::TagAttribute>();
148  connect(fetchJob, SIGNAL(result(KJob*)), this, SLOT(slotFinishedTagListing(KJob*)));
149 }
150 
151 bool FilterManager::initialized() const
152 {
153  return d->mInitialized;
154 }
155 
156 void FilterManager::slotReadConfig()
157 {
158  d->readConfig();
159  d->mInitialized = true;
160  Q_EMIT loadingFiltersDone();
161 }
162 
163 void FilterManager::slotFinishedTagListing(KJob *job)
164 {
165  if (job->error()) {
166  kWarning() << "failed to retrieve tags " << job->errorString();
167  }
168  Akonadi::TagFetchJob *fetchJob = static_cast<Akonadi::TagFetchJob*>(job);
169  Q_FOREACH(const Akonadi::Tag &tag, fetchJob->tags() ) {
170  d->mTagList.insert(tag.url(), tag.name());
171  }
172 
173  Q_EMIT tagListingFinished();
174 }
175 
176 void FilterManager::slotTagAdded(const Akonadi::Tag &tag)
177 {
178  d->mTagList.insert(tag.url(), tag.name());
179  Q_EMIT tagListingFinished();
180 }
181 
182 void FilterManager::slotTagChanged(const Akonadi::Tag &tag)
183 {
184  if (d->mTagList.contains(tag.url())) {
185  d->mTagList.insert(tag.url(), tag.name());
186  }
187  Q_EMIT tagListingFinished();
188 }
189 
190 void FilterManager::slotTagRemoved(const Akonadi::Tag &tag)
191 {
192  if (d->mTagList.contains(tag.url())) {
193  d->mTagList.remove(tag.url());
194  }
195  Q_EMIT tagListingFinished();
196 }
197 
198 QMap<QUrl, QString> FilterManager::tagList() const
199 {
200  return d->mTagList;
201 }
202 
203 bool FilterManager::isValid() const
204 {
205  return d->mMailFilterAgentInterface->isValid();
206 }
207 
208 QString FilterManager::createUniqueFilterName( const QString &name ) const
209 {
210  return d->mMailFilterAgentInterface->createUniqueName( name );
211 }
212 
213 void FilterManager::showFilterLogDialog(qlonglong windowId)
214 {
215  d->mMailFilterAgentInterface->showFilterLogDialog(windowId);
216 }
217 
218 void FilterManager::filter( const Akonadi::Item &item, const QString &identifier, const QString &resourceId ) const
219 {
220  d->mMailFilterAgentInterface->filter( item.id(), identifier, resourceId );
221 }
222 
223 void FilterManager::filter( const Akonadi::Item &item, FilterSet set, bool account, const QString &resourceId ) const
224 {
225  d->mMailFilterAgentInterface->filterItem( item.id(), static_cast<int>(set), account ? resourceId : QString() );
226 }
227 
228 void FilterManager::filter( const Akonadi::Item::List& messages, FilterManager::FilterSet set ) const
229 {
230  QList<qint64> itemIds;
231 
232  foreach ( const Akonadi::Item &item, messages )
233  itemIds << item.id();
234 
235  d->mMailFilterAgentInterface->filterItems( itemIds, static_cast<int>(set) );
236 }
237 
238 
239 void FilterManager::filter(const Akonadi::Item::List& messages, SearchRule::RequiredPart requiredPart, const QStringList& listFilters) const
240 {
241  QList<qint64> itemIds;
242 
243  foreach ( const Akonadi::Item &item, messages )
244  itemIds << item.id();
245  d->mMailFilterAgentInterface->applySpecificFilters( itemIds, static_cast<int>(requiredPart), listFilters);
246 }
247 
248 void FilterManager::setFilters( const QList<MailCommon::MailFilter*> &filters )
249 {
250  beginUpdate();
251  d->clear();
252  d->mFilters = filters;
253  endUpdate();
254 }
255 
256 QList<MailCommon::MailFilter*> FilterManager::filters() const
257 {
258  return d->mFilters;
259 }
260 
261 void FilterManager::appendFilters( const QList<MailCommon::MailFilter*> &filters, bool replaceIfNameExists )
262 {
263  beginUpdate();
264  if ( replaceIfNameExists ) {
265  foreach ( const MailCommon::MailFilter *newFilter, filters ) {
266  int numberOfFilters = d->mFilters.count();
267  for ( int i = 0; i < numberOfFilters; ++i ) {
268  MailCommon::MailFilter *filter = d->mFilters.at( i );
269  if ( newFilter->name() == filter->name() ) {
270  d->mFilters.removeAll( filter );
271  i = 0;
272  numberOfFilters = d->mFilters.count();
273  }
274  }
275  }
276  }
277 
278  d->mFilters += filters;
279  endUpdate();
280 }
281 
282 void FilterManager::removeFilter( MailCommon::MailFilter *filter )
283 {
284  beginUpdate();
285  d->mFilters.removeAll( filter );
286  endUpdate();
287 }
288 
289 void FilterManager::beginUpdate()
290 {
291 }
292 
293 void FilterManager::endUpdate()
294 {
295  d->writeConfig( true );
296  d->mMailFilterAgentInterface->reload();
297  emit filtersChanged();
298 }
299 
MailCommon::FilterManager::setFilters
void setFilters(const QList< MailCommon::MailFilter * > &filters)
Replace the list of filters of the filter manager with the given list of filters. ...
Definition: filtermanager.cpp:248
MailCommon::FilterManager::loadingFiltersDone
void loadingFiltersDone()
MailCommon::FilterManager
A wrapper class that allows easy access to the mail filters.
Definition: filtermanager.h:40
QMap< QUrl, QString >
QDBusConnection::sessionBus
QDBusConnection sessionBus()
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
MailCommon::FilterManager::filtersChanged
void filtersChanged()
This signal is emitted whenever the filter list has been updated.
MailCommon::FilterManager::filter
void filter(const Akonadi::Item &item, const QString &identifier, const QString &resourceId) const
Apply filters interface.
Definition: filtermanager.cpp:218
MailCommon::FilterManager::showFilterLogDialog
void showFilterLogDialog(qlonglong windowId)
Shows the filter log dialog.
Definition: filtermanager.cpp:213
MailCommon::FilterManager::isValid
bool isValid() const
Returns whether the filter manager is in a usable state.
Definition: filtermanager.cpp:203
MailCommon::FilterManager::endUpdate
void endUpdate()
Should be called at the end of an filter list update.
Definition: filtermanager.cpp:293
MailCommon::FilterManager::createUniqueFilterName
QString createUniqueFilterName(const QString &name) const
Checks for existing filters with the name and extend the "name" to "name (i)" until no match is found...
Definition: filtermanager.cpp:208
MailCommon::FilterManager::initialized
bool initialized() const
Definition: filtermanager.cpp:151
MailCommon::SearchRule::RequiredPart
RequiredPart
Definition: searchrule.h:79
QString
QList< MailCommon::MailFilter * >
QStringList
MailCommon::FilterManager::appendFilters
void appendFilters(const QList< MailCommon::MailFilter * > &filters, bool replaceIfNameExists=false)
Manage filters interface.
Definition: filtermanager.cpp:261
MailCommon::FilterManager::instance
static FilterManager * instance()
Returns the global filter manager object.
Definition: filtermanager.cpp:98
MailCommon::FilterManager::filterActionDict
static FilterActionDict * filterActionDict()
Returns the global filter action dictionary.
Definition: filtermanager.cpp:106
MailCommon::FilterActionDict
List of known FilterAction-types.
Definition: filteractiondict.h:65
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:98
MailCommon::FilterManager::tagListingFinished
void tagListingFinished()
QLatin1String
filterimporterexporter.h
MailCommon::MailFilter::name
QString name() const
Equivalent to ()->name().
Definition: mailfilter.cpp:130
MailCommon::FilterManager::filters
QList< MailCommon::MailFilter * > filters() const
Returns the filter list of the manager.
Definition: filtermanager.cpp:256
MailCommon::FilterManager::FilterSet
FilterSet
Describes the list of filters.
Definition: filtermanager.h:48
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:58
filtermanager.h
MailCommon::FilterManager::removeFilter
void removeFilter(MailCommon::MailFilter *filter)
Removes the given filter from the list.
Definition: filtermanager.cpp:282
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
MailCommon::MailFilter
Definition: mailfilter.h:42
filteraction.h
MailCommon::FilterManager::tagList
QMap< QUrl, QString > tagList() const
Definition: filtermanager.cpp:198
MailCommon::FilterManager::beginUpdate
void beginUpdate()
Should be called at the beginning of an filter list update.
Definition: filtermanager.cpp:289
filteractiondict.h
QTimer::singleShot
singleShot
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