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.
 
 
 

169 lines
5.0 KiB

/*
* kmail: KDE mail client
* Copyright (c) 1996-1998 Stefan Taferner <taferner@kde.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#ifndef FILTERMANAGER_H
#define FILTERMANAGER_H
#include <AkonadiCore/collection.h>
#include <AkonadiCore/item.h>
#include "MailCommon/SearchPattern"
namespace MailCommon
{
class MailFilter;
class ItemContext;
}
class FilterManager: public QObject
{
Q_OBJECT
public:
/**
* Describes the list of filters.
*/
enum FilterSet {
NoSet = 0x0,
Inbound = 0x1,
Outbound = 0x2,
Explicit = 0x4,
BeforeOutbound = 0x8,
All = Inbound | BeforeOutbound | Outbound | Explicit
};
enum FilterRequires {
Unknown = 0,
HeaderMessage = 1,
FullMessage = 2
};
/**
* Creates a new filter manager.
*
* @param parent The parent object.
*/
explicit FilterManager(QObject *parent = Q_NULLPTR);
/**
* Destroys the filter manager.
*/
virtual ~FilterManager();
/**
* Clears the list of filters and deletes them.
*/
void clear();
/**
* Reloads the filter rules from config file.
*/
void readConfig();
/**
* Checks for existing filters with the @p name and extend the
* "name" to "name (i)" until no match is found for i=1..n
*/
QString createUniqueName(const QString &name) const;
/**
* Process given message item by applying the filter rules one by
* one. You can select which set of filters (incoming or outgoing)
* should be used.
*
* @param item The message item to process.
* @param set Select the filter set to use.
* @param account @c true if an account id is specified else @c false
* @param accountId The id of the KMAccount that the message was retrieved from
*
* @return true if the filtering was successful, false in case of any error
*/
bool process(const Akonadi::Item &item, bool needsFullPayload,
FilterSet set = Inbound,
bool account = false, const QString &accountId = QString());
bool process(const QList<MailCommon::MailFilter *> &mailFilters, const Akonadi::Item &item,
bool needsFullPayload, FilterSet set = Inbound,
bool account = false, const QString &accountId = QString());
/**
* For ad-hoc filters.
*
* Applies @p filter to message @p item.
* Return codes are as with the above method.
*/
bool process(const Akonadi::Item &item, bool needsFullPayload, const MailCommon::MailFilter *filter);
void filter(const Akonadi::Item &item, FilterManager::FilterSet set, const QString &resourceId);
void filter(const Akonadi::Item &item, const QString &filterId, const QString &resourceId);
void applySpecificFilters(const Akonadi::Item::List &selectedMessages, MailCommon::SearchRule::RequiredPart requiredPart, const QStringList &listFilters);
/**
* Applies the filters on the given @p messages.
*/
void applyFilters(const Akonadi::Item::List &messages, FilterSet set = Explicit);
/**
* Returns whether the configured filters need the full mail content.
*/
MailCommon::SearchRule::RequiredPart requiredPart(const QString &id) const;
void mailCollectionRemoved(const Akonadi::Collection &collection);
void agentRemoved(const QString &identifier);
#ifndef NDEBUG
/**
* Outputs all filter rules to console. Used for debugging.
*/
void dump() const;
#endif
protected:
bool processContextItem(MailCommon::ItemContext context);
Q_SIGNALS:
/**
* This signal is emitted whenever the filter list has been updated.
*/
void filterListUpdated();
/**
* This signal is emitted to notify that @p item has not been moved.
*/
void filteringFailed(const Akonadi::Item &item);
void percent(int progress);
void progressMessage(const QString &message);
private:
//@cond PRIVATE
class Private;
Private *d;
Q_PRIVATE_SLOT(d, void itemsFetchJobForFilterDone(KJob *))
Q_PRIVATE_SLOT(d, void itemFetchJobForFilterDone(KJob *))
Q_PRIVATE_SLOT(d, void moveJobResult(KJob *))
Q_PRIVATE_SLOT(d, void modifyJobResult(KJob *))
Q_PRIVATE_SLOT(d, void deleteJobResult(KJob *))
Q_PRIVATE_SLOT(d, void slotItemsFetchedForFilter(const Akonadi::Item::List &))
//@endcond
};
#endif