File indexing completed on 2025-02-16 04:55:54

0001 /*
0002   SPDX-FileCopyrightText: 2020-2024 Laurent Montel <montel@kde.org>
0003 
0004   SPDX-License-Identifier: GPL-2.0-only
0005 */
0006 
0007 #include "searchserverwithvacationsupportjob.h"
0008 #include "util/findaccountinfojob.h"
0009 #include <QVariant>
0010 
0011 using namespace KSieveCore;
0012 
0013 SearchServerWithVacationSupportJob::SearchServerWithVacationSupportJob(QObject *parent)
0014     : QObject(parent)
0015 {
0016 }
0017 
0018 SearchServerWithVacationSupportJob::~SearchServerWithVacationSupportJob() = default;
0019 
0020 void SearchServerWithVacationSupportJob::sendAccountList()
0021 {
0022     Q_EMIT searchServerWithVacationSupportFinished(mAccountList);
0023     deleteLater();
0024 }
0025 
0026 void SearchServerWithVacationSupportJob::start()
0027 {
0028     if (!canStart()) {
0029         sendAccountList();
0030         return;
0031     }
0032     const QList<KSieveCore::SieveImapInstance> instances = KSieveCore::Util::sieveImapInstances();
0033     for (const KSieveCore::SieveImapInstance &instance : instances) {
0034         if (instance.status() == KSieveCore::SieveImapInstance::Broken) {
0035             continue;
0036         }
0037         mServerSieveInfos.insert(instance.name(), instance.identifier());
0038     }
0039     searchNextInfo();
0040 }
0041 
0042 void SearchServerWithVacationSupportJob::searchNextInfo()
0043 {
0044     mSieveServerMapIterator = mServerSieveInfos.constBegin();
0045     if (mSieveServerMapIterator != mServerSieveInfos.constEnd()) {
0046         slotSearchSieveScript(mSieveServerMapIterator.key(), mSieveServerMapIterator.value());
0047     } else {
0048         sendAccountList();
0049     }
0050 }
0051 
0052 void SearchServerWithVacationSupportJob::slotSearchSieveScript(const QString &name, const QString &identifier)
0053 {
0054     auto job = new KSieveCore::FindAccountInfoJob(this);
0055     connect(job, &KSieveCore::FindAccountInfoJob::findAccountInfoFinished, this, &SearchServerWithVacationSupportJob::slotFindAccountInfoFinished);
0056     job->setIdentifier(identifier);
0057     job->setProperty("serverName", QVariant(name));
0058     job->setProvider(mPasswordProvider);
0059     job->start();
0060 }
0061 
0062 void SearchServerWithVacationSupportJob::slotFindAccountInfoFinished(const KSieveCore::Util::AccountInfo &info)
0063 {
0064     const QUrl url = info.sieveUrl;
0065     if (!url.isEmpty()) {
0066         const QString serverName = sender()->property("serverName").toString();
0067         mAccountList.insert(serverName, info);
0068     }
0069     searchNextServerSieve();
0070 }
0071 
0072 void SearchServerWithVacationSupportJob::searchNextServerSieve()
0073 {
0074     ++mSieveServerMapIterator;
0075     if (mSieveServerMapIterator != mServerSieveInfos.constEnd()) {
0076         slotSearchSieveScript(mSieveServerMapIterator.key(), mSieveServerMapIterator.value());
0077     } else {
0078         sendAccountList();
0079     }
0080 }
0081 
0082 bool SearchServerWithVacationSupportJob::canStart() const
0083 {
0084     return mPasswordProvider;
0085 }
0086 
0087 KSieveCore::SieveImapPasswordProvider *SearchServerWithVacationSupportJob::passwordProvider() const
0088 {
0089     return mPasswordProvider;
0090 }
0091 
0092 void SearchServerWithVacationSupportJob::setPasswordProvider(KSieveCore::SieveImapPasswordProvider *newProvider)
0093 {
0094     mPasswordProvider = newProvider;
0095 }
0096 
0097 #include "moc_searchserverwithvacationsupportjob.cpp"