• 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
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 "filteraction.h"
23 #include "filteractiondict.h"
24 #include "filterimporterexporter.h"
25 #include "mailfilteragentinterface.h"
26 #include <kconfiggroup.h>
27 
28 #include <Nepomuk2/Resource>
29 #include <Nepomuk2/Vocabulary/NIE>
30 #include <Nepomuk2/ResourceWatcher>
31 #include <Nepomuk2/Query/QueryServiceClient>
32 #include <Nepomuk2/Query/Result>
33 #include <Nepomuk2/Query/ResourceTypeTerm>
34 #include <soprano/nao.h>
35 
36 #include <QTimer>
37 
38 namespace MailCommon {
39 
40 class FilterManager::Private
41 {
42 public:
43  Private( FilterManager *qq )
44  : q( qq ), mMailFilterAgentInterface(0), mTagQueryClient(0), mInitialized(false)
45  {
46  mMailFilterAgentInterface = new org::freedesktop::Akonadi::MailFilterAgent( QLatin1String( "org.freedesktop.Akonadi.MailFilterAgent" ),
47  QLatin1String( "/MailFilterAgent" ),
48  QDBusConnection::sessionBus(), q );
49  }
50 
51  void readConfig();
52  void writeConfig( bool withSync = true ) const;
53  void clear();
54 
55  QMap<QUrl, QString> mTagList;
56  static FilterManager *mInstance;
57  static FilterActionDict *mFilterActionDict;
58 
59  FilterManager *q;
60  OrgFreedesktopAkonadiMailFilterAgentInterface *mMailFilterAgentInterface;
61  QList<MailCommon::MailFilter *> mFilters;
62  Nepomuk2::Query::QueryServiceClient *mTagQueryClient;
63  bool mInitialized;
64 };
65 
66 void FilterManager::Private::readConfig()
67 {
68  KSharedConfig::Ptr config = KSharedConfig::openConfig( QLatin1String("akonadi_mailfilter_agentrc") );
69  clear();
70  QStringList emptyFilters;
71  mFilters = FilterImporterExporter::readFiltersFromConfig( config, emptyFilters );
72  emit q->filtersChanged();
73 }
74 
75 void FilterManager::Private::writeConfig( bool withSync ) const
76 {
77  KSharedConfig::Ptr config = KSharedConfig::openConfig( QLatin1String("akonadi_mailfilter_agentrc") );
78 
79  // Now, write out the new stuff:
80  FilterImporterExporter::writeFiltersToConfig( mFilters, config );
81  KConfigGroup group = config->group( "General" );
82 
83  if ( withSync ) {
84  group.sync();
85  }
86 }
87 
88 void FilterManager::Private::clear()
89 {
90  qDeleteAll( mFilters );
91  mFilters.clear();
92 }
93 
94 }
95 
96 using namespace MailCommon;
97 
98 FilterManager* FilterManager::Private::mInstance = 0;
99 FilterActionDict* FilterManager::Private::mFilterActionDict = 0;
100 
101 FilterManager* FilterManager::instance()
102 {
103  if ( !FilterManager::Private::mInstance )
104  FilterManager::Private::mInstance = new FilterManager;
105 
106  return FilterManager::Private::mInstance;
107 }
108 
109 FilterActionDict* FilterManager::filterActionDict()
110 {
111  if ( !FilterManager::Private::mFilterActionDict )
112  FilterManager::Private::mFilterActionDict = new FilterActionDict;
113 
114  return FilterManager::Private::mFilterActionDict;
115 }
116 
117 
118 FilterManager::FilterManager()
119  : d( new Private( this ) )
120 {
121  updateTagList();
122 
123  Nepomuk2::ResourceWatcher *watcher = new Nepomuk2::ResourceWatcher(this);
124  watcher->addType(Soprano::Vocabulary::NAO::Tag());
125  connect(watcher, SIGNAL(resourceCreated(Nepomuk2::Resource,QList<QUrl>)),
126  this, SLOT(resourceCreated(Nepomuk2::Resource,QList<QUrl>)));
127  connect(watcher, SIGNAL(resourceRemoved(QUrl,QList<QUrl>)),
128  this, SLOT(resourceRemoved(QUrl,QList<QUrl>)));
129  connect(watcher, SIGNAL(propertyChanged(Nepomuk2::Resource,Nepomuk2::Types::Property,QVariantList,QVariantList)),
130  this, SLOT(propertyChanged(Nepomuk2::Resource)));
131 
132 
133  watcher->start();
134 
135  qDBusRegisterMetaType<QList<qint64> >();
136  Akonadi::ServerManager::State state = Akonadi::ServerManager::self()->state();
137  if (state == Akonadi::ServerManager::Running) {
138  QTimer::singleShot(0,this,SLOT(slotReadConfig()));
139  } else {
140  connect( Akonadi::ServerManager::self(), SIGNAL(stateChanged(Akonadi::ServerManager::State)),
141  SLOT(slotServerStateChanged(Akonadi::ServerManager::State)) );
142  }
143 }
144 
145 void FilterManager::slotServerStateChanged(Akonadi::ServerManager::State state)
146 {
147  if (state == Akonadi::ServerManager::Running) {
148  d->readConfig();
149  disconnect( Akonadi::ServerManager::self(), SIGNAL(stateChanged(Akonadi::ServerManager::State)));
150  }
151 }
152 
153 void FilterManager::updateTagList()
154 {
155  if ( d->mTagQueryClient )
156  return;
157  d->mTagList.clear();
158  d->mTagQueryClient = new Nepomuk2::Query::QueryServiceClient(this);
159  connect( d->mTagQueryClient, SIGNAL(newEntries(QList<Nepomuk2::Query::Result>)),
160  this, SLOT(slotNewTagEntries(QList<Nepomuk2::Query::Result>)) );
161  connect( d->mTagQueryClient, SIGNAL(finishedListing()),
162  this, SLOT(slotFinishedTagListing()) );
163 
164  Nepomuk2::Query::ResourceTypeTerm term( Soprano::Vocabulary::NAO::Tag() );
165  Nepomuk2::Query::Query query( term );
166  d->mTagQueryClient->query(query);
167 }
168 
169 bool FilterManager::initialized() const
170 {
171  return d->mInitialized;
172 }
173 
174 void FilterManager::slotReadConfig()
175 {
176  d->readConfig();
177  d->mInitialized = true;
178  Q_EMIT loadingFiltersDone();
179 }
180 
181 void FilterManager::slotFinishedTagListing()
182 {
183  d->mTagQueryClient->close();
184  d->mTagQueryClient->deleteLater();
185  d->mTagQueryClient = 0;
186  Q_EMIT tagListingFinished();
187 }
188 
189 void FilterManager::slotNewTagEntries(const QList<Nepomuk2::Query::Result>& results)
190 {
191  Q_FOREACH(const Nepomuk2::Query::Result &result, results ) {
192  Nepomuk2::Resource resource = result.resource();
193  d->mTagList.insert(resource.uri(), resource.label());
194  }
195 }
196 
197 void FilterManager::resourceCreated(const Nepomuk2::Resource& res,const QList<QUrl>&)
198 {
199  d->mTagList.insert(res.uri(),res.label());
200  Q_EMIT tagListingFinished();
201 }
202 
203 void FilterManager::resourceRemoved(const QUrl&url,const QList<QUrl>&)
204 {
205  if (d->mTagList.contains(url)) {
206  d->mTagList.remove(url);
207  }
208  Q_EMIT tagListingFinished();
209 }
210 
211 void FilterManager::propertyChanged(const Nepomuk2::Resource& res)
212 {
213  if (d->mTagList.contains(res.uri())) {
214  d->mTagList.insert(res.uri(), res.label() );
215  }
216  Q_EMIT tagListingFinished();
217 }
218 
219 QMap<QUrl, QString> FilterManager::tagList() const
220 {
221  return d->mTagList;
222 }
223 
224 bool FilterManager::isValid() const
225 {
226  return d->mMailFilterAgentInterface->isValid();
227 }
228 
229 QString FilterManager::createUniqueFilterName( const QString &name ) const
230 {
231  return d->mMailFilterAgentInterface->createUniqueName( name );
232 }
233 
234 void FilterManager::showFilterLogDialog(qlonglong windowId)
235 {
236  d->mMailFilterAgentInterface->showFilterLogDialog(windowId);
237 }
238 
239 void FilterManager::filter( const Akonadi::Item &item, const QString &identifier, const QString &resourceId ) const
240 {
241  d->mMailFilterAgentInterface->filter( item.id(), identifier, resourceId );
242 }
243 
244 void FilterManager::filter( const Akonadi::Item &item, FilterSet set, bool account, const QString &resourceId ) const
245 {
246  d->mMailFilterAgentInterface->filterItem( item.id(), static_cast<int>(set), account ? resourceId : QString() );
247 }
248 
249 void FilterManager::filter( const Akonadi::Item::List& messages, FilterManager::FilterSet set ) const
250 {
251  QList<qint64> itemIds;
252 
253  foreach ( const Akonadi::Item &item, messages )
254  itemIds << item.id();
255 
256  d->mMailFilterAgentInterface->filterItems( itemIds, static_cast<int>(set) );
257 }
258 
259 
260 void FilterManager::filter(const Akonadi::Item::List& messages, SearchRule::RequiredPart requiredPart, const QStringList& listFilters) const
261 {
262  QList<qint64> itemIds;
263 
264  foreach ( const Akonadi::Item &item, messages )
265  itemIds << item.id();
266  d->mMailFilterAgentInterface->applySpecificFilters( itemIds, static_cast<int>(requiredPart), listFilters);
267 }
268 
269 void FilterManager::setFilters( const QList<MailCommon::MailFilter*> &filters )
270 {
271  beginUpdate();
272  d->clear();
273  d->mFilters = filters;
274  endUpdate();
275 }
276 
277 QList<MailCommon::MailFilter*> FilterManager::filters() const
278 {
279  return d->mFilters;
280 }
281 
282 void FilterManager::appendFilters( const QList<MailCommon::MailFilter*> &filters, bool replaceIfNameExists )
283 {
284  beginUpdate();
285  if ( replaceIfNameExists ) {
286  foreach ( const MailCommon::MailFilter *newFilter, filters ) {
287  int numberOfFilters = d->mFilters.count();
288  for ( int i = 0; i < numberOfFilters; ++i ) {
289  MailCommon::MailFilter *filter = d->mFilters.at( i );
290  if ( newFilter->name() == filter->name() ) {
291  d->mFilters.removeAll( filter );
292  i = 0;
293  numberOfFilters = d->mFilters.count();
294  }
295  }
296  }
297  }
298 
299  d->mFilters += filters;
300  endUpdate();
301 }
302 
303 void FilterManager::removeFilter( MailCommon::MailFilter *filter )
304 {
305  beginUpdate();
306  d->mFilters.removeAll( filter );
307  endUpdate();
308 }
309 
310 void FilterManager::beginUpdate()
311 {
312 }
313 
314 void FilterManager::endUpdate()
315 {
316  d->writeConfig( true );
317  d->mMailFilterAgentInterface->reload();
318  emit filtersChanged();
319 }
320 
321 #include "filtermanager.moc"
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:269
MailCommon::FilterManager::loadingFiltersDone
void loadingFiltersDone()
MailCommon::FilterManager
A wrapper class that allows easy access to the mail filters.
Definition: filtermanager.h:47
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:239
MailCommon::FilterManager::showFilterLogDialog
void showFilterLogDialog(qlonglong windowId)
Shows the filter log dialog.
Definition: filtermanager.cpp:234
MailCommon::FilterManager::isValid
bool isValid() const
Returns whether the filter manager is in a usable state.
Definition: filtermanager.cpp:224
MailCommon::FilterManager::endUpdate
void endUpdate()
Should be called at the end of an filter list update.
Definition: filtermanager.cpp:314
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:229
MailCommon::FilterManager::initialized
bool initialized() const
Definition: filtermanager.cpp:169
MailCommon::SearchRule::RequiredPart
RequiredPart
Definition: searchpattern.h:104
MailCommon::FilterManager::appendFilters
void appendFilters(const QList< MailCommon::MailFilter * > &filters, bool replaceIfNameExists=false)
Manage filters interface.
Definition: filtermanager.cpp:282
MailCommon::FilterManager::instance
static FilterManager * instance()
Returns the global filter manager object.
Definition: filtermanager.cpp:101
MailCommon::FilterManager::filterActionDict
static FilterActionDict * filterActionDict()
Returns the global filter action dictionary.
Definition: filtermanager.cpp:109
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:99
MailCommon::FilterManager::tagListingFinished
void tagListingFinished()
filterimporterexporter.h
MailCommon::MailFilter::name
QString name() const
Equivalent to ()->name().
Definition: mailfilter.cpp:123
MailCommon::FilterManager::filters
QList< MailCommon::MailFilter * > filters() const
Returns the filter list of the manager.
Definition: filtermanager.cpp:277
MailCommon::FilterManager::FilterSet
FilterSet
Describes the list of filters.
Definition: filtermanager.h:55
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
filtermanager.h
MailCommon::FilterManager::removeFilter
void removeFilter(MailCommon::MailFilter *filter)
Removes the given filter from the list.
Definition: filtermanager.cpp:303
MailCommon::MailFilter
Definition: mailfilter.h:42
filteraction.h
MailCommon::FilterManager::tagList
QMap< QUrl, QString > tagList() const
Definition: filtermanager.cpp:219
MailCommon::FilterManager::beginUpdate
void beginUpdate()
Should be called at the beginning of an filter list update.
Definition: filtermanager.cpp:310
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: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