You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
302 lines
8.7 KiB
302 lines
8.7 KiB
/* |
|
Copyright (C) 2011 Tobias Koenig <tokoe@kde.org> |
|
|
|
This library is free software; you can redistribute it and/or modify it |
|
under the terms of the GNU Library General Public License as published by |
|
the Free Software Foundation; either version 2 of the License, or (at your |
|
option) any later version. |
|
|
|
This library is distributed in the hope that it will be useful, but WITHOUT |
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public |
|
License for more details. |
|
|
|
You should have received a copy of the GNU Library General Public License |
|
along with this library; see the file COPYING.LIB. If not, write to the |
|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
|
02110-1301, USA. |
|
*/ |
|
|
|
#include "filtermanager.h" |
|
#include "mailcommon_debug.h" |
|
|
|
#include "filteractions/filteraction.h" |
|
#include "filteractions/filteractiondict.h" |
|
#include "filterimporterexporter.h" |
|
#include "mailfilteragentinterface.h" |
|
#include <kconfiggroup.h> |
|
#include <Monitor> |
|
#include <Tag> |
|
#include <TagFetchJob> |
|
#include <TagFetchScope> |
|
#include <TagAttribute> |
|
|
|
#include <QTimer> |
|
|
|
namespace MailCommon |
|
{ |
|
|
|
class Q_DECL_HIDDEN FilterManager::Private |
|
{ |
|
public: |
|
Private(FilterManager *qq) |
|
: q(qq), mMailFilterAgentInterface(0), mMonitor(new Akonadi::Monitor), mInitialized(false) |
|
{ |
|
mMailFilterAgentInterface = new org::freedesktop::Akonadi::MailFilterAgent(QStringLiteral("org.freedesktop.Akonadi.MailFilterAgent"), |
|
QStringLiteral("/MailFilterAgent"), |
|
QDBusConnection::sessionBus(), q); |
|
} |
|
|
|
void readConfig(); |
|
void writeConfig(bool withSync = true) const; |
|
void clear(); |
|
|
|
QMap<QUrl, QString> mTagList; |
|
static FilterManager *mInstance; |
|
static FilterActionDict *mFilterActionDict; |
|
|
|
FilterManager *q; |
|
OrgFreedesktopAkonadiMailFilterAgentInterface *mMailFilterAgentInterface; |
|
QList<MailCommon::MailFilter *> mFilters; |
|
Akonadi::Monitor *mMonitor; |
|
bool mInitialized; |
|
}; |
|
|
|
void FilterManager::Private::readConfig() |
|
{ |
|
KSharedConfig::Ptr config = KSharedConfig::openConfig(QStringLiteral("akonadi_mailfilter_agentrc")); |
|
clear(); |
|
QStringList emptyFilters; |
|
mFilters = FilterImporterExporter::readFiltersFromConfig(config, emptyFilters); |
|
Q_EMIT q->filtersChanged(); |
|
} |
|
|
|
void FilterManager::Private::writeConfig(bool withSync) const |
|
{ |
|
KSharedConfig::Ptr config = KSharedConfig::openConfig(QStringLiteral("akonadi_mailfilter_agentrc")); |
|
|
|
// Now, write out the new stuff: |
|
FilterImporterExporter::writeFiltersToConfig(mFilters, config); |
|
KConfigGroup group = config->group("General"); |
|
|
|
if (withSync) { |
|
group.sync(); |
|
} |
|
} |
|
|
|
void FilterManager::Private::clear() |
|
{ |
|
qDeleteAll(mFilters); |
|
mFilters.clear(); |
|
} |
|
|
|
} |
|
|
|
using namespace MailCommon; |
|
|
|
FilterManager *FilterManager::Private::mInstance = Q_NULLPTR; |
|
FilterActionDict *FilterManager::Private::mFilterActionDict = Q_NULLPTR; |
|
|
|
FilterManager *FilterManager::instance() |
|
{ |
|
if (!FilterManager::Private::mInstance) { |
|
FilterManager::Private::mInstance = new FilterManager; |
|
} |
|
|
|
return FilterManager::Private::mInstance; |
|
} |
|
|
|
FilterActionDict *FilterManager::filterActionDict() |
|
{ |
|
if (!FilterManager::Private::mFilterActionDict) { |
|
FilterManager::Private::mFilterActionDict = new FilterActionDict; |
|
} |
|
|
|
return FilterManager::Private::mFilterActionDict; |
|
} |
|
|
|
FilterManager::FilterManager() |
|
: d(new Private(this)) |
|
{ |
|
updateTagList(); |
|
|
|
d->mMonitor->setTypeMonitored(Akonadi::Monitor::Tags); |
|
d->mMonitor->tagFetchScope().fetchAttribute<Akonadi::TagAttribute>(); |
|
connect(d->mMonitor, &Akonadi::Monitor::tagAdded, this, &FilterManager::slotTagAdded); |
|
connect(d->mMonitor, &Akonadi::Monitor::tagRemoved, this, &FilterManager::slotTagRemoved); |
|
connect(d->mMonitor, &Akonadi::Monitor::tagChanged, this, &FilterManager::slotTagChanged); |
|
|
|
qDBusRegisterMetaType<QList<qint64> >(); |
|
Akonadi::ServerManager::State state = Akonadi::ServerManager::self()->state(); |
|
if (state == Akonadi::ServerManager::Running) { |
|
QTimer::singleShot(0, this, &FilterManager::slotReadConfig); |
|
} else { |
|
connect(Akonadi::ServerManager::self(), &Akonadi::ServerManager::stateChanged, this, &FilterManager::slotServerStateChanged); |
|
} |
|
} |
|
|
|
void FilterManager::slotServerStateChanged(Akonadi::ServerManager::State state) |
|
{ |
|
if (state == Akonadi::ServerManager::Running) { |
|
d->readConfig(); |
|
disconnect(Akonadi::ServerManager::self(), SIGNAL(stateChanged(Akonadi::ServerManager::State))); |
|
} |
|
} |
|
|
|
void FilterManager::updateTagList() |
|
{ |
|
Akonadi::TagFetchJob *fetchJob = new Akonadi::TagFetchJob(this); |
|
fetchJob->fetchScope().fetchAttribute<Akonadi::TagAttribute>(); |
|
connect(fetchJob, &Akonadi::TagFetchJob::result, this, &FilterManager::slotFinishedTagListing); |
|
} |
|
|
|
bool FilterManager::initialized() const |
|
{ |
|
return d->mInitialized; |
|
} |
|
|
|
void FilterManager::slotReadConfig() |
|
{ |
|
d->readConfig(); |
|
d->mInitialized = true; |
|
Q_EMIT loadingFiltersDone(); |
|
} |
|
|
|
void FilterManager::slotFinishedTagListing(KJob *job) |
|
{ |
|
if (job->error()) { |
|
qCWarning(MAILCOMMON_LOG) << "failed to retrieve tags " << job->errorString(); |
|
} |
|
Akonadi::TagFetchJob *fetchJob = static_cast<Akonadi::TagFetchJob *>(job); |
|
Q_FOREACH (const Akonadi::Tag &tag, fetchJob->tags()) { |
|
d->mTagList.insert(tag.url(), tag.name()); |
|
} |
|
|
|
Q_EMIT tagListingFinished(); |
|
} |
|
|
|
void FilterManager::slotTagAdded(const Akonadi::Tag &tag) |
|
{ |
|
d->mTagList.insert(tag.url(), tag.name()); |
|
Q_EMIT tagListingFinished(); |
|
} |
|
|
|
void FilterManager::slotTagChanged(const Akonadi::Tag &tag) |
|
{ |
|
if (d->mTagList.contains(tag.url())) { |
|
d->mTagList.insert(tag.url(), tag.name()); |
|
} |
|
Q_EMIT tagListingFinished(); |
|
} |
|
|
|
void FilterManager::slotTagRemoved(const Akonadi::Tag &tag) |
|
{ |
|
if (d->mTagList.contains(tag.url())) { |
|
d->mTagList.remove(tag.url()); |
|
} |
|
Q_EMIT tagListingFinished(); |
|
} |
|
|
|
QMap<QUrl, QString> FilterManager::tagList() const |
|
{ |
|
return d->mTagList; |
|
} |
|
|
|
bool FilterManager::isValid() const |
|
{ |
|
return d->mMailFilterAgentInterface->isValid(); |
|
} |
|
|
|
QString FilterManager::createUniqueFilterName(const QString &name) const |
|
{ |
|
return d->mMailFilterAgentInterface->createUniqueName(name); |
|
} |
|
|
|
void FilterManager::showFilterLogDialog(qlonglong windowId) |
|
{ |
|
d->mMailFilterAgentInterface->showFilterLogDialog(windowId); |
|
} |
|
|
|
void FilterManager::filter(const Akonadi::Item &item, const QString &identifier, const QString &resourceId) const |
|
{ |
|
d->mMailFilterAgentInterface->filter(item.id(), identifier, resourceId); |
|
} |
|
|
|
void FilterManager::filter(const Akonadi::Item &item, FilterSet set, bool account, const QString &resourceId) const |
|
{ |
|
d->mMailFilterAgentInterface->filterItem(item.id(), static_cast<int>(set), account ? resourceId : QString()); |
|
} |
|
|
|
void FilterManager::filter(const Akonadi::Item::List &messages, FilterManager::FilterSet set) const |
|
{ |
|
QList<qint64> itemIds; |
|
|
|
foreach (const Akonadi::Item &item, messages) { |
|
itemIds << item.id(); |
|
} |
|
|
|
d->mMailFilterAgentInterface->filterItems(itemIds, static_cast<int>(set)); |
|
} |
|
|
|
void FilterManager::filter(const Akonadi::Item::List &messages, SearchRule::RequiredPart requiredPart, const QStringList &listFilters) const |
|
{ |
|
QList<qint64> itemIds; |
|
|
|
foreach (const Akonadi::Item &item, messages) { |
|
itemIds << item.id(); |
|
} |
|
d->mMailFilterAgentInterface->applySpecificFilters(itemIds, static_cast<int>(requiredPart), listFilters); |
|
} |
|
|
|
void FilterManager::setFilters(const QList<MailCommon::MailFilter *> &filters) |
|
{ |
|
beginUpdate(); |
|
d->clear(); |
|
d->mFilters = filters; |
|
endUpdate(); |
|
} |
|
|
|
QList<MailCommon::MailFilter *> FilterManager::filters() const |
|
{ |
|
return d->mFilters; |
|
} |
|
|
|
void FilterManager::appendFilters(const QList<MailCommon::MailFilter *> &filters, bool replaceIfNameExists) |
|
{ |
|
beginUpdate(); |
|
if (replaceIfNameExists) { |
|
foreach (const MailCommon::MailFilter *newFilter, filters) { |
|
int numberOfFilters = d->mFilters.count(); |
|
for (int i = 0; i < numberOfFilters; ++i) { |
|
MailCommon::MailFilter *filter = d->mFilters.at(i); |
|
if (newFilter->name() == filter->name()) { |
|
d->mFilters.removeAll(filter); |
|
i = 0; |
|
numberOfFilters = d->mFilters.count(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
d->mFilters += filters; |
|
endUpdate(); |
|
} |
|
|
|
void FilterManager::removeFilter(MailCommon::MailFilter *filter) |
|
{ |
|
beginUpdate(); |
|
d->mFilters.removeAll(filter); |
|
endUpdate(); |
|
} |
|
|
|
void FilterManager::beginUpdate() |
|
{ |
|
} |
|
|
|
void FilterManager::endUpdate() |
|
{ |
|
d->writeConfig(true); |
|
d->mMailFilterAgentInterface->reload(); |
|
Q_EMIT filtersChanged(); |
|
} |
|
|
|
|