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

0001 /*
0002  * SPDX-FileCopyrightText: 1996-1998 Stefan Taferner <taferner@kde.org>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  *
0006  */
0007 
0008 #include "filteractionrewriteheader.h"
0009 
0010 #include <KComboBox>
0011 #include <KLineEdit>
0012 #include <KLocalizedString>
0013 
0014 #include <QHBoxLayout>
0015 #include <QLabel>
0016 
0017 using namespace MailCommon;
0018 
0019 FilterAction *FilterActionRewriteHeader::newAction()
0020 {
0021     return new FilterActionRewriteHeader;
0022 }
0023 
0024 FilterActionRewriteHeader::FilterActionRewriteHeader(QObject *parent)
0025     : FilterActionWithStringList(QStringLiteral("rewrite header"), i18n("Rewrite Header"), parent)
0026 {
0027     mParameterList << QString() << QStringLiteral("Subject") << QStringLiteral("Reply-To") << QStringLiteral("Delivered-To")
0028                    << QStringLiteral("X-KDE-PR-Message") << QStringLiteral("X-KDE-PR-Package") << QStringLiteral("X-KDE-PR-Keywords");
0029 
0030     mParameter = mParameterList.at(0);
0031 }
0032 
0033 bool FilterActionRewriteHeader::isEmpty() const
0034 {
0035     return mParameter.isEmpty() || mRegex.pattern().isEmpty();
0036 }
0037 
0038 QString FilterActionRewriteHeader::informationAboutNotValidAction() const
0039 {
0040     QString info;
0041     if (mParameter.isEmpty()) {
0042         info = i18n("Header not defined");
0043     }
0044     if (mRegex.pattern().isEmpty()) {
0045         if (!info.isEmpty()) {
0046             info += QLatin1Char('\n');
0047         }
0048         info += i18n("Search string is empty.");
0049     }
0050     return info;
0051 }
0052 
0053 FilterAction::ReturnCode FilterActionRewriteHeader::process(ItemContext &context, bool) const
0054 {
0055     if (isEmpty()) {
0056         return ErrorButGoOn;
0057     }
0058 
0059     const auto msg = context.item().payload<KMime::Message::Ptr>();
0060 
0061     const QByteArray param(mParameter.toLatin1());
0062     KMime::Headers::Base *header = msg->headerByType(param.constData());
0063     if (!header) {
0064         return GoOn; // TODO: Maybe create a new header by type?
0065     }
0066 
0067     QString value = header->asUnicodeString();
0068     const QString oldValue = value;
0069     const QString newValue = value.replace(mRegex, mReplacementString);
0070     if (newValue != oldValue) {
0071         msg->removeHeader(param.constData());
0072 
0073         KMime::Headers::Base *newheader = KMime::Headers::createHeader(param);
0074         if (!newheader) {
0075             newheader = new KMime::Headers::Generic(param.constData());
0076         }
0077         newheader->fromUnicodeString(newValue, "utf-8");
0078         msg->setHeader(newheader);
0079         msg->assemble();
0080 
0081         context.setNeedsPayloadStore();
0082     }
0083     return GoOn;
0084 }
0085 
0086 SearchRule::RequiredPart FilterActionRewriteHeader::requiredPart() const
0087 {
0088     return SearchRule::CompleteMessage;
0089 }
0090 
0091 QWidget *FilterActionRewriteHeader::createParamWidget(QWidget *parent) const
0092 {
0093     auto widget = new QWidget(parent);
0094     auto layout = new QHBoxLayout(widget);
0095     layout->setSpacing(4);
0096     layout->setContentsMargins({});
0097 
0098     auto comboBox = new KComboBox(widget);
0099     comboBox->setMinimumWidth(50);
0100     comboBox->setEditable(true);
0101     comboBox->setObjectName(QLatin1StringView("combo"));
0102     comboBox->setInsertPolicy(QComboBox::InsertAtBottom);
0103     layout->addWidget(comboBox, 0 /* stretch */);
0104 
0105     KCompletion *comp = comboBox->completionObject();
0106     comp->setIgnoreCase(true);
0107     comp->insertItems(mParameterList);
0108     comp->setCompletionMode(KCompletion::CompletionPopupAuto);
0109 
0110     auto label = new QLabel(i18n("Replace:"), widget);
0111     label->setObjectName(QLatin1StringView("label_replace"));
0112     label->setFixedWidth(label->sizeHint().width());
0113     layout->addWidget(label, 0);
0114 
0115     auto regExpLineEdit = new KLineEdit(widget);
0116     regExpLineEdit->setClearButtonEnabled(true);
0117     regExpLineEdit->setTrapReturnKey(true);
0118     regExpLineEdit->setObjectName(QLatin1StringView("search"));
0119     layout->addWidget(regExpLineEdit, 1);
0120 
0121     label = new QLabel(i18n("With:"), widget);
0122     label->setFixedWidth(label->sizeHint().width());
0123     label->setObjectName(QLatin1StringView("label_with"));
0124     layout->addWidget(label, 0);
0125 
0126     auto lineEdit = new KLineEdit(widget);
0127     lineEdit->setObjectName(QLatin1StringView("replace"));
0128     lineEdit->setClearButtonEnabled(true);
0129     lineEdit->setTrapReturnKey(true);
0130     layout->addWidget(lineEdit, 1);
0131 
0132     setParamWidgetValue(widget);
0133     connect(comboBox, &KComboBox::currentIndexChanged, this, &FilterActionRewriteHeader::filterActionModified);
0134     connect(comboBox->lineEdit(), &QLineEdit::textChanged, this, &FilterAction::filterActionModified);
0135     connect(regExpLineEdit, &KLineEdit::textChanged, this, &FilterActionRewriteHeader::filterActionModified);
0136     connect(lineEdit, &KLineEdit::textChanged, this, &FilterActionRewriteHeader::filterActionModified);
0137 
0138     return widget;
0139 }
0140 
0141 void FilterActionRewriteHeader::setParamWidgetValue(QWidget *paramWidget) const
0142 {
0143     const int index = mParameterList.indexOf(mParameter);
0144     const auto comboBox = paramWidget->findChild<KComboBox *>(QStringLiteral("combo"));
0145     Q_ASSERT(comboBox);
0146 
0147     comboBox->clear();
0148     comboBox->addItems(mParameterList);
0149     if (index < 0) {
0150         comboBox->addItem(mParameter);
0151         comboBox->setCurrentIndex(comboBox->count() - 1);
0152     } else {
0153         comboBox->setCurrentIndex(index);
0154     }
0155 
0156     auto regExpLineEdit = paramWidget->findChild<KLineEdit *>(QStringLiteral("search"));
0157     Q_ASSERT(regExpLineEdit);
0158     regExpLineEdit->setText(mRegex.pattern());
0159 
0160     auto lineEdit = paramWidget->findChild<KLineEdit *>(QStringLiteral("replace"));
0161     Q_ASSERT(lineEdit);
0162     lineEdit->setText(mReplacementString);
0163 }
0164 
0165 void FilterActionRewriteHeader::applyParamWidgetValue(QWidget *paramWidget)
0166 {
0167     const auto comboBox = paramWidget->findChild<KComboBox *>(QStringLiteral("combo"));
0168     Q_ASSERT(comboBox);
0169     mParameter = comboBox->currentText();
0170 
0171     const KLineEdit *regExpLineEdit = paramWidget->findChild<KLineEdit *>(QStringLiteral("search"));
0172     Q_ASSERT(regExpLineEdit);
0173     mRegex.setPattern(regExpLineEdit->text());
0174 
0175     const KLineEdit *lineEdit = paramWidget->findChild<KLineEdit *>(QStringLiteral("replace"));
0176     Q_ASSERT(lineEdit);
0177     mReplacementString = lineEdit->text();
0178 }
0179 
0180 void FilterActionRewriteHeader::clearParamWidget(QWidget *paramWidget) const
0181 {
0182     const auto comboBox = paramWidget->findChild<KComboBox *>(QStringLiteral("combo"));
0183     Q_ASSERT(comboBox);
0184     comboBox->setCurrentIndex(0);
0185 
0186     auto regExpLineEdit = paramWidget->findChild<KLineEdit *>(QStringLiteral("search"));
0187     Q_ASSERT(regExpLineEdit);
0188     regExpLineEdit->clear();
0189 
0190     auto lineEdit = paramWidget->findChild<KLineEdit *>(QStringLiteral("replace"));
0191     Q_ASSERT(lineEdit);
0192     lineEdit->clear();
0193 }
0194 
0195 QString FilterActionRewriteHeader::argsAsString() const
0196 {
0197     QString result = mParameter;
0198     result += QLatin1Char('\t');
0199     result += mRegex.pattern();
0200     result += QLatin1Char('\t');
0201     result += mReplacementString;
0202 
0203     return result;
0204 }
0205 
0206 QString FilterActionRewriteHeader::displayString() const
0207 {
0208     return label() + QStringLiteral(" \"") + argsAsString().toHtmlEscaped() + QStringLiteral("\"");
0209 }
0210 
0211 void FilterActionRewriteHeader::argsFromString(const QString &argsStr)
0212 {
0213     const QStringList list = argsStr.split(QLatin1Char('\t'));
0214     if (list.count() < 3) {
0215         return;
0216     }
0217     QString result;
0218 
0219     result = list[0];
0220     mRegex.setPattern(list[1]);
0221     mReplacementString = list[2];
0222 
0223     int index = mParameterList.indexOf(result);
0224     if (index < 0) {
0225         mParameterList.append(result);
0226         index = mParameterList.count() - 1;
0227     }
0228 
0229     mParameter = mParameterList.at(index);
0230 }
0231 
0232 #include "moc_filteractionrewriteheader.cpp"