7#include "mailcommon_debug.h"
8#include "searchrule/searchruledate.h"
9#include "searchrule/searchruleencryption.h"
10#include "searchrule/searchrulenumerical.h"
11#include "searchrule/searchrulestatus.h"
12#include "searchrule/searchrulestring.h"
14#include <KConfigGroup>
22static const char *
const funcConfigNames[] = {
"contains",
33 "is-not-in-addressbook",
43static const int numFuncConfigNames =
sizeof funcConfigNames /
sizeof *funcConfigNames;
68 mField = other.mField;
69 mFunction = other.mFunction;
70 mContents = other.mContents;
78 if (
field ==
"<status>") {
80 }
else if (
field ==
"<age in days>" ||
field ==
"<size>") {
82 }
else if (
field ==
"<date>") {
84 }
else if (
field ==
"<encryption>") {
105 const char cIdx = char(
int(
'A') + aIdx);
108 static const QString func = QStringLiteral(
"func");
115 if (field2 ==
"<To or Cc>") {
142 for (
int i = 0; i < numFuncConfigNames; ++i) {
143 if (qstricmp(funcConfigNames[i], str) == 0) {
144 return static_cast<Function
>(i);
151QString SearchRule::functionToString(Function function)
154 return funcConfigNames[int(
function)];
156 return QStringLiteral(
"invalid");
162 const char cIdx = char(
'A' + aIdx);
164 static const QString func = QStringLiteral(
"func");
168 config.
writeEntry(func + cIdx, functionToString(mFunction));
172QString SearchRule::conditionToString(Function function)
180 str =
i18n(
"not equal");
183 str =
i18n(
"is greater");
185 case FuncIsLessOrEqual:
186 str =
i18n(
"is less or equal");
189 str =
i18n(
"is less");
191 case FuncIsGreaterOrEqual:
192 str =
i18n(
"is greater or equal");
194 case FuncIsInAddressbook:
195 str =
i18n(
"is in addressbook");
197 case FuncIsNotInAddressbook:
198 str =
i18n(
"is not in addressbook");
200 case FuncIsInCategory:
201 str =
i18n(
"is in category");
203 case FuncIsNotInCategory:
204 str =
i18n(
"is in category");
206 case FuncHasAttachment:
207 str =
i18n(
"has an attachment");
209 case FuncHasNoAttachment:
210 str =
i18n(
"has not an attachment");
213 str =
i18n(
"start with");
215 case FuncNotStartWith:
216 str =
i18n(
"not start with");
219 str =
i18n(
"end with");
222 str =
i18n(
"not end with");
228 str =
i18n(
"contains");
230 case FuncContainsNot:
231 str =
i18n(
"not contains");
234 str =
i18n(
"has regexp");
237 str =
i18n(
"not regexp");
245 QString contentStr = mContents;
246 if (mField ==
"<size>") {
257 comparison = QStringLiteral(
":over");
259 case FuncIsLessOrEqual:
260 comparison = QStringLiteral(
":under");
264 comparison = QStringLiteral(
":under");
266 case FuncIsGreaterOrEqual:
267 comparison = QStringLiteral(
":over");
270 case FuncIsInAddressbook:
271 case FuncIsNotInAddressbook:
272 case FuncIsInCategory:
273 case FuncIsNotInCategory:
274 case FuncHasAttachment:
275 case FuncHasNoAttachment:
277 case FuncNotStartWith:
282 case FuncContainsNot:
290 }
else if (mField ==
"<status>") {
293 }
else if (mField ==
"<any header>") {
296 }
else if (mField ==
"contents") {
299 }
else if (mField ==
"<age in days>") {
302 }
else if (mField ==
"<date>") {
305 }
else if (mField ==
"<recipients>") {
308 }
else if (mField ==
"<tag>") {
310 }
else if (mField ==
"<message>") {
312 code +=
i18n(
"<message> not implemented/supported");
313 }
else if (mField ==
"<body>") {
315 requireModules << QStringLiteral(
"body");
318 bool negative =
false;
323 comparison = QStringLiteral(
":contains");
325 case FuncContainsNot:
327 comparison = QStringLiteral(
":contains");
330 comparison = QStringLiteral(
":is");
333 comparison = QStringLiteral(
":is");
337 comparison = QStringLiteral(
":regex");
339 requireModules << QStringLiteral(
"regex");
344 requireModules << QStringLiteral(
"regex");
346 comparison = QStringLiteral(
":regex");
350 comparison = QStringLiteral(
":regex");
352 requireModules << QStringLiteral(
"regex");
356 case FuncNotStartWith:
357 comparison = QStringLiteral(
":regex");
359 requireModules << QStringLiteral(
"regex");
361 comparison = QStringLiteral(
":regex");
366 comparison = QStringLiteral(
":regex");
368 requireModules << QStringLiteral(
"regex");
370 comparison = QStringLiteral(
":regex");
374 comparison = QStringLiteral(
":regex");
376 requireModules << QStringLiteral(
"regex");
378 comparison = QStringLiteral(
":regex");
383 case FuncIsLessOrEqual:
385 case FuncIsGreaterOrEqual:
386 case FuncIsInAddressbook:
387 case FuncIsNotInAddressbook:
388 case FuncIsInCategory:
389 case FuncIsNotInCategory:
390 case FuncHasAttachment:
391 case FuncHasNoAttachment:
396 code += (negative ? QStringLiteral(
"not ") :
QString()) + QStringLiteral(
"body :text %1 \"%2\"").arg(comparison, contentStr);
399 bool negative =
false;
404 comparison = QStringLiteral(
":contains");
406 case FuncContainsNot:
408 comparison = QStringLiteral(
":contains");
411 comparison = QStringLiteral(
":is");
414 comparison = QStringLiteral(
":is");
418 comparison = QStringLiteral(
":regex");
420 requireModules << QStringLiteral(
"regex");
425 requireModules << QStringLiteral(
"regex");
427 comparison = QStringLiteral(
":regex");
431 comparison = QStringLiteral(
":regex");
433 requireModules << QStringLiteral(
"regex");
437 case FuncNotStartWith:
438 comparison = QStringLiteral(
":regex");
440 requireModules << QStringLiteral(
"regex");
442 comparison = QStringLiteral(
":regex");
447 comparison = QStringLiteral(
":regex");
449 requireModules << QStringLiteral(
"regex");
451 comparison = QStringLiteral(
":regex");
455 comparison = QStringLiteral(
":regex");
457 requireModules << QStringLiteral(
"regex");
459 comparison = QStringLiteral(
":regex");
465 case FuncIsLessOrEqual:
467 case FuncIsGreaterOrEqual:
468 case FuncIsInAddressbook:
469 case FuncIsNotInAddressbook:
470 case FuncIsInCategory:
471 case FuncIsNotInCategory:
472 case FuncHasAttachment:
473 case FuncHasNoAttachment:
478 code += (negative ? QStringLiteral(
"not ") :
QString())
479 + QStringLiteral(
"header %1 \"%2\" \"%3\"").arg(comparison).arg(
QLatin1StringView(mField)).arg(contentStr);
516 result += functionToString(mFunction);
525 case SearchRule::FuncContains:
526 case SearchRule::FuncContainsNot:
527 return Akonadi::SearchTerm::CondContains;
529 case SearchRule::FuncEquals:
530 case SearchRule::FuncNotEqual:
531 return Akonadi::SearchTerm::CondEqual;
533 case SearchRule::FuncIsGreater:
534 return Akonadi::SearchTerm::CondGreaterThan;
536 case SearchRule::FuncIsGreaterOrEqual:
537 return Akonadi::SearchTerm::CondGreaterOrEqual;
539 case SearchRule::FuncIsLess:
540 return Akonadi::SearchTerm::CondLessThan;
542 case SearchRule::FuncIsLessOrEqual:
543 return Akonadi::SearchTerm::CondLessOrEqual;
545 case SearchRule::FuncRegExp:
546 case SearchRule::FuncNotRegExp:
548 return Akonadi::SearchTerm::CondContains;
550 case SearchRule::FuncStartWith:
551 case SearchRule::FuncNotStartWith:
552 case SearchRule::FuncEndWith:
553 case SearchRule::FuncNotEndWith:
555 return Akonadi::SearchTerm::CondContains;
557 qCDebug(MAILCOMMON_LOG) <<
"Unhandled function type: " <<
function();
560 return Akonadi::SearchTerm::CondEqual;
567 case SearchRule::FuncContainsNot:
568 case SearchRule::FuncNotEqual:
569 case SearchRule::FuncNotRegExp:
570 case SearchRule::FuncHasNoAttachment:
571 case SearchRule::FuncIsNotInCategory:
572 case SearchRule::FuncIsNotInAddressbook:
573 case SearchRule::FuncNotStartWith:
574 case SearchRule::FuncNotEndWith:
584 s << mField << functionToString(mFunction) << mContents;
void writeEntry(const char *key, const char *value, WriteConfigFlags pFlags=Normal)
QString readEntry(const char *key, const char *aDefault=nullptr) const
This class represents a search pattern rule operating on numerical values.
This class represents a search to be performed against the status of a message.
This class represents one search pattern rule.
QByteArray field() const
Returns the message header field name (without the trailing ':').
static SearchRule::Ptr createInstanceFromConfig(const KConfigGroup &group, int index)
Creates a new search rule from a given config group.
Function function() const
Returns the filter function of the rule.
QString contents() const
Returns the contents of the rule.
void setField(const QByteArray &name)
Sets the message header field name.
std::shared_ptr< SearchRule > Ptr
Defines a pointer to a search rule.
Akonadi::SearchTerm::Condition akonadiComparator() const
Converts the rule function into the corresponding Akonadi query operator.
void setFunction(Function function)
Sets the filter function of the rule.
virtual ~SearchRule()
Destroys the search rule.
Function
Describes operators for comparison of field and contents.
SearchRule(const QByteArray &field=QByteArray(), Function function=FuncContains, const QString &contents=QString())
Creates new new search rule.
bool isNegated() const
Helper that returns whether the rule has a negated function.
const SearchRule & operator=(const SearchRule &other)
Initializes this rule with an other rule.
const QString asString() const
Returns the rule as string for debugging purpose.
void setContents(const QString &contents)
Set the contents of the rule.
void writeConfig(KConfigGroup &group, int index) const
Saves the object into a given config group.
static SearchRule::Ptr createInstance(const QByteArray &field=QByteArray(), Function function=FuncContains, const QString &contents=QString())
Creates a new search rule of a certain type by instantiating the appropriate subclass depending on th...
QString i18n(const char *text, const TYPE &arg...)
QString arg(Args &&... args) const const
QString fromLatin1(QByteArrayView str)
QString number(double n, char format, int precision)
int toInt(bool *ok, int base) const const
QByteArray toLatin1() const const
bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const