File indexing completed on 2024-06-23 05:18:32
0001 /* 0002 * This file is part of KMail. 0003 * 0004 * SPDX-FileCopyrightText: 2010 KDAB 0005 * SPDX-FileContributor: Tobias Koenig <tokoe@kde.org> 0006 * SPDX-FileContributor: Leo Franchi <lfranchi@kde.org> 0007 * 0008 * SPDX-License-Identifier: GPL-2.0-or-later 0009 */ 0010 0011 #include "job/emailaddressresolvejob.h" 0012 0013 #include "aliasesexpandjob.h" 0014 #include "settings/messagecomposersettings.h" 0015 0016 #include "MessageComposer/Composer" 0017 #include "MessageComposer/InfoPart" 0018 0019 #include <KEmailAddress> 0020 #include <QVariant> 0021 0022 using namespace MessageComposer; 0023 0024 class MessageComposer::EmailAddressResolveJobPrivate 0025 { 0026 public: 0027 EmailAddressResolveJobPrivate() = default; 0028 0029 QVariantMap mResultMap; 0030 QString mFrom; 0031 QStringList mTo; 0032 QStringList mCc; 0033 QStringList mBcc; 0034 QStringList mReplyTo; 0035 QString mDefaultDomainName; 0036 int mJobCount = 0; 0037 }; 0038 0039 EmailAddressResolveJob::EmailAddressResolveJob(QObject *parent) 0040 : KJob(parent) 0041 , d(new MessageComposer::EmailAddressResolveJobPrivate) 0042 { 0043 } 0044 0045 EmailAddressResolveJob::~EmailAddressResolveJob() = default; 0046 0047 static inline bool containsAliases(const QString &address) 0048 { 0049 // an valid email is defined as foo@foo.extension 0050 return !(address.contains(QLatin1Char('@')) && address.contains(QLatin1Char('.'))); 0051 } 0052 0053 static bool containsAliases(const QStringList &addresses) 0054 { 0055 for (const QString &address : addresses) { 0056 if (containsAliases(address)) { 0057 return true; 0058 } 0059 } 0060 0061 return false; 0062 } 0063 0064 void EmailAddressResolveJob::setDefaultDomainName(const QString &domainName) 0065 { 0066 d->mDefaultDomainName = domainName; 0067 } 0068 0069 void EmailAddressResolveJob::start() 0070 { 0071 QList<AliasesExpandJob *> jobs; 0072 0073 if (containsAliases(d->mFrom)) { 0074 auto job = new AliasesExpandJob(d->mFrom, d->mDefaultDomainName, this); 0075 job->setProperty("id", QStringLiteral("infoPartFrom")); 0076 connect(job, &AliasesExpandJob::result, this, &EmailAddressResolveJob::slotAliasExpansionDone); 0077 jobs << job; 0078 } 0079 if (containsAliases(d->mTo)) { 0080 auto job = new AliasesExpandJob(d->mTo.join(QLatin1StringView(", ")), d->mDefaultDomainName, this); 0081 job->setProperty("id", QStringLiteral("infoPartTo")); 0082 connect(job, &AliasesExpandJob::result, this, &EmailAddressResolveJob::slotAliasExpansionDone); 0083 jobs << job; 0084 } 0085 0086 if (containsAliases(d->mCc)) { 0087 auto job = new AliasesExpandJob(d->mCc.join(QLatin1StringView(", ")), d->mDefaultDomainName, this); 0088 job->setProperty("id", QStringLiteral("infoPartCc")); 0089 connect(job, &AliasesExpandJob::result, this, &EmailAddressResolveJob::slotAliasExpansionDone); 0090 jobs << job; 0091 } 0092 0093 if (containsAliases(d->mBcc)) { 0094 auto job = new AliasesExpandJob(d->mBcc.join(QLatin1StringView(", ")), d->mDefaultDomainName, this); 0095 job->setProperty("id", QStringLiteral("infoPartBcc")); 0096 connect(job, &AliasesExpandJob::result, this, &EmailAddressResolveJob::slotAliasExpansionDone); 0097 jobs << job; 0098 } 0099 if (containsAliases(d->mReplyTo)) { 0100 auto job = new AliasesExpandJob(d->mReplyTo.join(QLatin1StringView(", ")), d->mDefaultDomainName, this); 0101 job->setProperty("id", QStringLiteral("infoPartReplyTo")); 0102 connect(job, &AliasesExpandJob::result, this, &EmailAddressResolveJob::slotAliasExpansionDone); 0103 jobs << job; 0104 } 0105 0106 d->mJobCount = jobs.count(); 0107 0108 if (d->mJobCount == 0) { 0109 emitResult(); 0110 } else { 0111 for (AliasesExpandJob *job : std::as_const(jobs)) { 0112 job->start(); 0113 } 0114 } 0115 } 0116 0117 void EmailAddressResolveJob::slotAliasExpansionDone(KJob *job) 0118 { 0119 if (job->error()) { 0120 setError(job->error()); 0121 setErrorText(job->errorText()); 0122 emitResult(); 0123 return; 0124 } 0125 0126 const AliasesExpandJob *expandJob = qobject_cast<AliasesExpandJob *>(job); 0127 d->mResultMap.insert(expandJob->property("id").toString(), expandJob->addresses()); 0128 0129 d->mJobCount--; 0130 if (d->mJobCount == 0) { 0131 emitResult(); 0132 } 0133 } 0134 0135 void EmailAddressResolveJob::setFrom(const QString &from) 0136 { 0137 d->mFrom = from; 0138 d->mResultMap.insert(QStringLiteral("infoPartFrom"), from); 0139 } 0140 0141 void EmailAddressResolveJob::setTo(const QStringList &to) 0142 { 0143 d->mTo = to; 0144 d->mResultMap.insert(QStringLiteral("infoPartTo"), to.join(QLatin1StringView(", "))); 0145 } 0146 0147 void EmailAddressResolveJob::setCc(const QStringList &cc) 0148 { 0149 d->mCc = cc; 0150 d->mResultMap.insert(QStringLiteral("infoPartCc"), cc.join(QLatin1StringView(", "))); 0151 } 0152 0153 void EmailAddressResolveJob::setBcc(const QStringList &bcc) 0154 { 0155 d->mBcc = bcc; 0156 d->mResultMap.insert(QStringLiteral("infoPartBcc"), bcc.join(QLatin1StringView(", "))); 0157 } 0158 0159 void EmailAddressResolveJob::setReplyTo(const QStringList &replyTo) 0160 { 0161 d->mReplyTo = replyTo; 0162 d->mResultMap.insert(QStringLiteral("infoPartReplyTo"), replyTo.join(QLatin1StringView(", "))); 0163 } 0164 0165 QString EmailAddressResolveJob::expandedFrom() const 0166 { 0167 return d->mResultMap.value(QStringLiteral("infoPartFrom")).toString(); 0168 } 0169 0170 QStringList EmailAddressResolveJob::expandedTo() const 0171 { 0172 return KEmailAddress::splitAddressList(d->mResultMap.value(QStringLiteral("infoPartTo")).toString()); 0173 } 0174 0175 QStringList EmailAddressResolveJob::expandedCc() const 0176 { 0177 return KEmailAddress::splitAddressList(d->mResultMap.value(QStringLiteral("infoPartCc")).toString()); 0178 } 0179 0180 QStringList EmailAddressResolveJob::expandedBcc() const 0181 { 0182 return KEmailAddress::splitAddressList(d->mResultMap.value(QStringLiteral("infoPartBcc")).toString()); 0183 } 0184 0185 QStringList EmailAddressResolveJob::expandedReplyTo() const 0186 { 0187 return KEmailAddress::splitAddressList(d->mResultMap.value(QStringLiteral("infoPartReplyTo")).toString()); 0188 } 0189 0190 #include "moc_emailaddressresolvejob.cpp"