File indexing completed on 2025-02-16 04:56:08

0001 /*
0002   SPDX-FileCopyrightText: 2013-2024 Laurent Montel <montel@kde.org>
0003 
0004   SPDX-License-Identifier: GPL-2.0-only
0005 */
0006 
0007 #include "vacationmanager.h"
0008 #include "ksieveui/vacation/multiimapvacationdialog.h"
0009 #include <KSieveCore/MultiImapVacationManager>
0010 #include <KSieveCore/VacationCreateScriptJob>
0011 
0012 #include <KLocalizedString>
0013 #include <KMessageBox>
0014 #include <QPointer>
0015 #include <QWidget>
0016 
0017 using namespace KSieveUi;
0018 
0019 class KSieveUi::VacationManagerPrivate
0020 {
0021 public:
0022     VacationManagerPrivate(QWidget *parent)
0023         : mWidget(parent)
0024     {
0025     }
0026 
0027     QWidget *const mWidget;
0028     QPointer<KSieveUi::MultiImapVacationDialog> mMultiImapVacationDialog = nullptr;
0029     QPointer<KSieveCore::MultiImapVacationManager> mCheckVacation = nullptr;
0030     bool mQuestionAsked = false;
0031 };
0032 
0033 VacationManager::VacationManager(KSieveCore::SieveImapPasswordProvider *passwordProvider, QWidget *parent)
0034     : QObject(parent)
0035     , d(new KSieveUi::VacationManagerPrivate(parent))
0036 {
0037     d->mCheckVacation = new KSieveCore::MultiImapVacationManager(passwordProvider, this);
0038     connect(d->mCheckVacation.data(), &KSieveCore::MultiImapVacationManager::scriptActive, this, &VacationManager::slotUpdateVacationScriptStatus);
0039 }
0040 
0041 VacationManager::~VacationManager() = default;
0042 
0043 void VacationManager::checkVacation()
0044 {
0045     d->mCheckVacation->checkVacation();
0046 }
0047 
0048 void VacationManager::slotUpdateVacationScriptStatus(bool active, const QString &serverName)
0049 {
0050     Q_EMIT updateVacationScriptStatus(active, serverName);
0051     if (active) {
0052         if (!d->mQuestionAsked) {
0053             d->mQuestionAsked = true;
0054             if (KMessageBox::questionTwoActions(nullptr,
0055                                                 i18n("There is still an active out-of-office reply configured.\n"
0056                                                      "Do you want to edit it?"),
0057                                                 i18nc("@title:window", "Out-of-office reply still active"),
0058                                                 KGuiItem(i18n("Edit"), QStringLiteral("document-properties")),
0059                                                 KGuiItem(i18n("Ignore"), QStringLiteral("dialog-cancel")))
0060                 == KMessageBox::ButtonCode::PrimaryAction) {
0061                 slotEditVacation(serverName);
0062             }
0063         }
0064     }
0065 }
0066 
0067 void VacationManager::slotEditVacation(const QString &serverName)
0068 {
0069     if (d->mMultiImapVacationDialog) {
0070         d->mMultiImapVacationDialog->raise();
0071         d->mMultiImapVacationDialog->activateWindow();
0072     } else {
0073         d->mMultiImapVacationDialog = new KSieveUi::MultiImapVacationDialog(d->mCheckVacation, d->mWidget);
0074         connect(d->mMultiImapVacationDialog.data(), &KSieveUi::MultiImapVacationDialog::okClicked, this, &VacationManager::slotDialogOk);
0075         connect(d->mMultiImapVacationDialog.data(), &KSieveUi::MultiImapVacationDialog::cancelClicked, this, &VacationManager::slotDialogCanceled);
0076     }
0077     d->mMultiImapVacationDialog->show();
0078 
0079     if (!serverName.isEmpty()) {
0080         d->mMultiImapVacationDialog->switchToServerNamePage(serverName);
0081     }
0082 }
0083 
0084 void VacationManager::slotDialogCanceled()
0085 {
0086     if (d->mMultiImapVacationDialog->isVisible()) {
0087         d->mMultiImapVacationDialog->hide();
0088     }
0089 
0090     d->mMultiImapVacationDialog->deleteLater();
0091     d->mMultiImapVacationDialog = nullptr;
0092 }
0093 
0094 void VacationManager::slotDialogOk()
0095 {
0096     const QList<KSieveCore::VacationCreateScriptJob *> listJob = d->mMultiImapVacationDialog->listCreateJob();
0097     for (KSieveCore::VacationCreateScriptJob *job : listJob) {
0098         connect(job, &KSieveCore::VacationCreateScriptJob::scriptActive, this, &VacationManager::updateVacationScriptStatus);
0099         job->setKep14Support(d->mCheckVacation->kep14Support(job->serverName()));
0100         job->start();
0101     }
0102     if (d->mMultiImapVacationDialog->isVisible()) {
0103         d->mMultiImapVacationDialog->hide();
0104     }
0105 
0106     d->mMultiImapVacationDialog->deleteLater();
0107 
0108     d->mMultiImapVacationDialog = nullptr;
0109 }
0110 
0111 #include "moc_vacationmanager.cpp"