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"