kinit: check the process exit code on state change

for flexibility

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2024-05-16 06:33:13 +03:00
parent 71704a410d
commit c72478ab01
2 changed files with 39 additions and 34 deletions

View file

@ -77,6 +77,7 @@ KLauncherProcess::KLauncherProcess(QObject *parent)
: QProcess(parent),
m_kstartupinfo(nullptr),
m_startuptimer(nullptr),
m_window(0),
m_temp(false)
{
connect(
@ -90,16 +91,21 @@ KLauncherProcess::~KLauncherProcess()
removeTemp(m_temp, m_args);
}
void KLauncherProcess::setupStartup(const QString &appexe, const KService::Ptr kservice,
const qint64 timeout, const bool temp, const QStringList &args)
void KLauncherProcess::setupProcess(const QString &appexe, const QStringList &args,
const quint64 window, const KService::Ptr kservice,
const qint64 timeout, const bool temp)
{
Q_ASSERT(m_kstartupinfoid.none() == true);
m_appexe = appexe;
m_args = args;
m_window = window;
m_temp = temp;
QByteArray startupwmclass;
if (KRun::checkStartupNotify(kservice.data(), &startupwmclass)) {
m_kstartupinfoid.initId(KStartupInfo::createNewStartupId());
kDebug() << "setting up ASN for" << kservice->entryPath() << m_kstartupinfoid.id();
m_kstartupinfodata.setHostname();
m_kstartupinfodata.setBin(QFileInfo(appexe).fileName());
m_kstartupinfodata.setBin(QFileInfo(m_appexe).fileName());
m_kstartupinfodata.setDescription(i18n("Launching %1", kservice->name()));
m_kstartupinfodata.setIcon(kservice->icon());
m_kstartupinfodata.setApplicationId(kservice->entryPath());
@ -109,21 +115,35 @@ void KLauncherProcess::setupStartup(const QString &appexe, const KService::Ptr k
QProcess::setProcessEnvironment(processenv);
sendSIStart(timeout);
} else {
kDebug() << "no ASN for" << appexe;
kDebug() << "no ASN for" << m_appexe;
}
m_temp = temp;
m_args = args;
}
void KLauncherProcess::slotProcessStateChanged(QProcess::ProcessState state)
{
kDebug() << "process state changed" << this << state;
kDebug() << "process state changed" << m_appexe << state;
if (state == QProcess::Starting && !m_kstartupinfoid.none()) {
m_kstartupinfodata.addPid(QProcess::pid());
sendSIChange();
} else if (state == QProcess::NotRunning && !m_kstartupinfoid.none()) {
} else if (state == QProcess::NotRunning) {
if (!m_kstartupinfoid.none()) {
sendSIFinish();
}
if (exitCode() != 0) {
kError() << "finished with error" << m_appexe;
const QByteArray processerror = readAllStandardError();
if (processerror.isEmpty()) {
showError(i18n("Application exited abnormally: %1", m_appexe), m_window);
} else {
KMessageBox::detailedErrorWId(
static_cast<WId>(m_window),
i18n("Application exited abnormally: %1", m_appexe),
QString::fromLocal8Bit(processerror.constData(), processerror.size())
);
}
}
deleteLater();
}
}
void KLauncherProcess::slotStartupRemoved(const KStartupInfoId &kstartupinfoid,
@ -135,14 +155,14 @@ void KLauncherProcess::slotStartupRemoved(const KStartupInfoId &kstartupinfoid,
kDebug() << "startup removed" << kstartupinfoid.id() << m_kstartupinfoid.id();
if (kstartupinfoid.id() == m_kstartupinfoid.id() || kstartupinfodata.is_pid(QProcess::pid())) {
kDebug() << "startup done for process" << this;
kDebug() << "startup done for process" << m_appexe;
sendSIFinish();
}
}
void KLauncherProcess::slotStartupTimeout()
{
kWarning() << "timed out while waiting for process" << this;
kWarning() << "timed out while waiting for process" << m_appexe;
sendSIFinish();
}
@ -173,7 +193,7 @@ void KLauncherProcess::sendSIChange()
if (m_kstartupinfoid.none()) {
return;
}
kDebug() << "sending ASN change for" << m_kstartupinfodata.bin();
kDebug() << "sending ASN change for" << m_appexe;
KStartupInfo::sendChange(m_kstartupinfoid, m_kstartupinfodata);
}
@ -182,7 +202,7 @@ void KLauncherProcess::sendSIFinish()
if (m_kstartupinfoid.none()) {
return;
}
kDebug() << "sending ASN finish for" << m_kstartupinfodata.bin();
kDebug() << "sending ASN finish for" << m_appexe;
KStartupInfo::sendFinish(m_kstartupinfoid, m_kstartupinfodata);
m_kstartupinfoid = KStartupInfoId();
m_kstartupinfodata = KStartupInfoData();
@ -435,7 +455,6 @@ void KLauncherAdaptor::slotProcessFinished(int exitcode)
KLauncherProcess* process = qobject_cast<KLauncherProcess*>(sender());
kDebug() << "process finished" << process << exitcode;
m_processes.removeOne(process);
process->deleteLater();
}
QString KLauncherAdaptor::findExe(const QString &app) const
@ -502,7 +521,7 @@ bool KLauncherAdaptor::startProgram(const QString &app, const QStringList &args,
}
process->setProcessEnvironment(processenv);
process->setWorkingDirectory(workdir);
process->setupStartup(appexe, kservice, timeout, temp, args);
process->setupProcess(appexe, args, window, kservice, timeout, temp);
kDebug() << "starting" << appexe << args << envs << workdir;
process->start(appexe, args);
while (process->state() == QProcess::Starting) {
@ -516,22 +535,6 @@ bool KLauncherAdaptor::startProgram(const QString &app, const QStringList &args,
showError(i18n("Could not start the application: %1", app), window);
return false;
}
if (process->state() == QProcess::NotRunning && process->exitCode() != 0) {
kError() << "started but finished with error" << appexe;
const QByteArray processerror = process->readAllStandardError();
m_processes.removeOne(process);
process->deleteLater();
if (processerror.isEmpty()) {
showError(i18n("Application exited abnormally: %1", app), window);
} else {
KMessageBox::detailedErrorWId(
static_cast<WId>(window),
i18n("Application exited abnormally: %1", app),
QString::fromLocal8Bit(processerror.constData(), processerror.size())
);
}
return false;
}
kDebug() << "started" << appexe;
connect(process, SIGNAL(finished(int)), this, SLOT(slotProcessFinished(int)));
return true;

View file

@ -35,8 +35,8 @@ public:
explicit KLauncherProcess(QObject *parent);
~KLauncherProcess();
void setupStartup(const QString &appexe, const KService::Ptr kservice, const qint64 timeout,
const bool temp, const QStringList &args);
void setupProcess(const QString &appexe, const QStringList &args, const quint64 window,
const KService::Ptr kservice, const qint64 timeout, const bool temp);
private Q_SLOTS:
void slotProcessStateChanged(QProcess::ProcessState state);
@ -54,8 +54,10 @@ private:
QTimer* m_startuptimer;
KStartupInfoId m_kstartupinfoid;
KStartupInfoData m_kstartupinfodata;
bool m_temp;
QString m_appexe;
QStringList m_args;
quint64 m_window;
bool m_temp;
};
// Adaptor class for interface org.kde.KLauncher