File indexing completed on 2024-05-19 05:39:08

0001 /*
0002     SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only
0005 */
0006 
0007 #include "sessiontrack.h"
0008 #include "signalhandler.h"
0009 #include <QCoreApplication>
0010 #include <QDBusConnection>
0011 #include <QDBusServiceWatcher>
0012 #include <signal.h>
0013 
0014 SessionTrack::SessionTrack(const QList<QProcess *> &processes)
0015     : m_processes(processes)
0016 {
0017     SignalHandler::self()->addSignal(SIGTERM);
0018     connect(SignalHandler::self(), &SignalHandler::signalReceived, QCoreApplication::instance(), [](int signal) {
0019         if (signal == SIGTERM) {
0020             QCoreApplication::instance()->exit(0);
0021         }
0022     });
0023 
0024     for (auto process : std::as_const(m_processes)) {
0025         connect(process, &QProcess::finished, this, [this] {
0026             m_processes.removeAll(static_cast<QProcess *>(sender()));
0027         });
0028     }
0029 
0030     QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, &SessionTrack::deleteLater);
0031 }
0032 
0033 SessionTrack::~SessionTrack()
0034 {
0035     disconnect(this, nullptr, QCoreApplication::instance(), nullptr);
0036 
0037     for (auto process : std::as_const(m_processes)) {
0038         process->terminate();
0039     }
0040 
0041     // copy before the loop as we remove finished processes from the vector
0042     const QList<QProcess *> processesCopy = m_processes;
0043     for (auto process : processesCopy) {
0044         if (process->state() == QProcess::Running && !process->waitForFinished(500)) {
0045             process->kill();
0046         } else {
0047             delete process;
0048         }
0049     }
0050 }