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"