File indexing completed on 2024-05-12 05:37:17

0001 /*
0002     SPDX-FileCopyrightText: 2007, 2008 Petri Damsten <damu@iki.fi>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only
0005 */
0006 
0007 #include "executable.h"
0008 #include <QDebug>
0009 ExecutableContainer::ExecutableContainer(const QString &command, QObject *parent)
0010     : Plasma5Support::DataContainer(parent)
0011     , m_process(nullptr)
0012 {
0013     setObjectName(command);
0014     connect(this, &Plasma5Support::DataContainer::updateRequested, this, &ExecutableContainer::exec);
0015     exec();
0016 }
0017 
0018 ExecutableContainer::~ExecutableContainer()
0019 {
0020     if (m_process) {
0021         disconnect(m_process, nullptr, this, nullptr);
0022     }
0023     delete m_process;
0024 }
0025 
0026 void ExecutableContainer::finished(int exitCode, QProcess::ExitStatus exitStatus)
0027 {
0028     setData(QStringLiteral("exit code"), exitCode);
0029     setData(QStringLiteral("exit status"), exitStatus);
0030     setData(QStringLiteral("stdout"), QString::fromLocal8Bit(m_process->readAllStandardOutput()));
0031     setData(QStringLiteral("stderr"), QString::fromLocal8Bit(m_process->readAllStandardError()));
0032     checkForUpdate();
0033 }
0034 
0035 void ExecutableContainer::exec()
0036 {
0037     if (!m_process) {
0038         m_process = new KProcess();
0039         connect(m_process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finished(int, QProcess::ExitStatus)));
0040         m_process->setOutputChannelMode(KProcess::SeparateChannels);
0041         m_process->setShellCommand(objectName());
0042     }
0043 
0044     if (m_process->state() == QProcess::NotRunning) {
0045         m_process->start();
0046     } else {
0047         qDebug() << "Process" << objectName() << "already running. Pid:" << m_process->processId();
0048     }
0049 }
0050 
0051 ExecutableEngine::ExecutableEngine(QObject *parent)
0052     : Plasma5Support::DataEngine(parent)
0053 {
0054     setMinimumPollingInterval(1000);
0055 }
0056 
0057 bool ExecutableEngine::sourceRequestEvent(const QString &source)
0058 {
0059     addSource(new ExecutableContainer(source, this));
0060     return true;
0061 }
0062 
0063 K_PLUGIN_CLASS_WITH_JSON(ExecutableEngine, "plasma-dataengine-executable.json")
0064 
0065 #include "executable.moc"