File indexing completed on 2024-06-23 05:15:11

0001 /*
0002     SPDX-FileCopyrightText: 2007 Volker Krause <vkrause@kde.org>
0003 
0004     Based on KMail code by:
0005     SPDX-FileCopyrightText: 1996-1998 Stefan Taferner <taferner@kde.org>
0006     SPDX-FileCopyrightText: 2000-2002 Michael Haeckel <haeckel@kde.org>
0007 
0008     SPDX-License-Identifier: LGPL-2.0-or-later
0009 */
0010 
0011 #include "precommandjob.h"
0012 
0013 #include <KLocalizedString>
0014 
0015 #include <QProcess>
0016 
0017 using namespace MailTransport;
0018 
0019 /**
0020  * Private class that helps to provide binary compatibility between releases.
0021  * @internal
0022  */
0023 class PreCommandJobPrivate
0024 {
0025 public:
0026     explicit PreCommandJobPrivate(PrecommandJob *parent);
0027     QProcess *process = nullptr;
0028     QString precommand;
0029     PrecommandJob *const q;
0030 
0031     // Slots
0032     void slotFinished(int, QProcess::ExitStatus);
0033     void slotStarted();
0034     void slotError(QProcess::ProcessError error);
0035 };
0036 
0037 PreCommandJobPrivate::PreCommandJobPrivate(PrecommandJob *parent)
0038     : q(parent)
0039 {
0040 }
0041 
0042 PrecommandJob::PrecommandJob(const QString &precommand, QObject *parent)
0043     : KJob(parent)
0044     , d(new PreCommandJobPrivate(this))
0045 {
0046     d->precommand = precommand;
0047     d->process = new QProcess(this);
0048     connect(d->process, &QProcess::started, this, [this]() {
0049         d->slotStarted();
0050     });
0051     connect(d->process, &QProcess::errorOccurred, this, [this](QProcess::ProcessError error) {
0052         d->slotError(error);
0053     });
0054     connect(d->process, &QProcess::finished, this, [this](int val, QProcess::ExitStatus status) {
0055         d->slotFinished(val, status);
0056     });
0057 }
0058 
0059 PrecommandJob::~PrecommandJob() = default;
0060 
0061 void PrecommandJob::start()
0062 {
0063     d->process->start(d->precommand, QStringList());
0064 }
0065 
0066 void PreCommandJobPrivate::slotStarted()
0067 {
0068     Q_EMIT q->infoMessage(q, i18n("Executing precommand '%1'.", precommand));
0069 }
0070 
0071 void PreCommandJobPrivate::slotError(QProcess::ProcessError error)
0072 {
0073     q->setError(KJob::UserDefinedError);
0074     if (error == QProcess::FailedToStart) {
0075         q->setErrorText(i18n("Unable to start precommand '%1'.", precommand));
0076     } else {
0077         q->setErrorText(i18n("Error while executing precommand '%1'.", precommand));
0078     }
0079     q->emitResult();
0080 }
0081 
0082 bool PrecommandJob::doKill()
0083 {
0084     delete d->process;
0085     d->process = nullptr;
0086     return true;
0087 }
0088 
0089 void PreCommandJobPrivate::slotFinished(int exitCode, QProcess::ExitStatus exitStatus)
0090 {
0091     if (exitStatus == QProcess::CrashExit) {
0092         q->setError(KJob::UserDefinedError);
0093         q->setErrorText(i18n("The precommand crashed."));
0094     } else if (exitCode != 0) {
0095         q->setError(KJob::UserDefinedError);
0096         q->setErrorText(i18n("The precommand exited with code %1.", process->exitStatus()));
0097     }
0098     q->emitResult();
0099 }
0100 
0101 #include "moc_precommandjob.cpp"