File indexing completed on 2024-09-22 04:50:01

0001 /*
0002 
0003   SPDX-FileCopyrightText: 2012-2024 Laurent Montel <montel@kde.org>
0004 
0005   SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "filteractionunsetstatus.h"
0009 #include "mailcommon_debug.h"
0010 #include <KLocalizedString>
0011 using namespace MailCommon;
0012 
0013 FilterAction *FilterActionUnsetStatus::newAction()
0014 {
0015     return new FilterActionUnsetStatus;
0016 }
0017 
0018 FilterActionUnsetStatus::FilterActionUnsetStatus(QObject *parent)
0019     : FilterActionStatus(QStringLiteral("unset status"), i18nc("action: to unset the status", "Unset Status"), parent)
0020 {
0021 }
0022 
0023 bool FilterActionUnsetStatus::checkIsValid(int &index) const
0024 {
0025     index = mParameterList.indexOf(mParameter);
0026     return index < 1;
0027 }
0028 
0029 bool FilterActionUnsetStatus::isEmpty() const
0030 {
0031     int index = 0;
0032     return checkIsValid(index);
0033 }
0034 
0035 QString FilterActionUnsetStatus::informationAboutNotValidAction() const
0036 {
0037     return i18n("Status not defined.");
0038 }
0039 
0040 FilterAction::ReturnCode FilterActionUnsetStatus::process(ItemContext &context, bool) const
0041 {
0042     int index = 0;
0043     if (checkIsValid(index)) {
0044         return ErrorButGoOn;
0045     }
0046 
0047     Akonadi::MessageStatus status;
0048     status.setStatusFromFlags(context.item().flags());
0049 
0050     Akonadi::MessageStatus newStatus = FilterActionStatus::statuses[index - 1];
0051     // Laurent unread status doesn't exist. And crash if we use "const Akonadi::Item::Flag flag = *(flags.begin());" etc. => if we unset "unread" we set read
0052     if (newStatus == Akonadi::MessageStatus::statusUnread()) {
0053         Akonadi::MessageStatus oldStatus = status;
0054         newStatus.setRead(true);
0055         if (oldStatus != newStatus) {
0056             context.item().setFlags(newStatus.statusFlags());
0057             context.setNeedsFlagStore();
0058         }
0059         return GoOn;
0060     }
0061 
0062     QSet<QByteArray> flags = newStatus.statusFlags();
0063     const Akonadi::Item::Flag flag = *(flags.begin());
0064     if (context.item().hasFlag(flag)) {
0065         context.item().clearFlag(flag);
0066         context.setNeedsFlagStore();
0067     }
0068     return GoOn;
0069 }
0070 
0071 SearchRule::RequiredPart FilterActionUnsetStatus::requiredPart() const
0072 {
0073     return SearchRule::Envelope;
0074 }
0075 
0076 QString FilterActionUnsetStatus::sieveCode() const
0077 {
0078     QString flagCode;
0079     const QString parameter = argsAsString();
0080     if (parameter == QLatin1Char('R')) {
0081         flagCode = QStringLiteral("\\\\Seen");
0082     } else if (parameter == QLatin1Char('D')) {
0083         flagCode = QStringLiteral("\\\\Deleted");
0084     } else if (parameter == QLatin1Char('A')) {
0085         flagCode = QStringLiteral("\\\\Answered");
0086     } else {
0087         qCDebug(MAILCOMMON_LOG) << " FilterActionSetStatus::sieveCode() unknown flags" << parameter;
0088         flagCode = parameter;
0089     }
0090 
0091     const QString result = QStringLiteral("removeflag \"%1\";").arg(flagCode);
0092     return result;
0093 }
0094 
0095 QStringList FilterActionUnsetStatus::sieveRequires() const
0096 {
0097     return QStringList() << QStringLiteral("imap4flags");
0098 }
0099 
0100 #include "moc_filteractionunsetstatus.cpp"