refactor: Get process IDs by iterating /proc. Improve readability in JsonConnection option handling. (#843)

Co-authored-by: brindosch <edeltraud70@gmx.de>
This commit is contained in:
Murat Seker 2020-06-29 22:55:12 +02:00 committed by GitHub
parent 26813be36a
commit 6cf9dfaa68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 60 additions and 107 deletions

View File

@ -1,5 +1,4 @@
// QT includes
#include <QCoreApplication>
#include <QImage>

View File

@ -372,7 +372,6 @@ void JsonConnection::setConfig(const QString &jsonString)
command["command"] = QString("config");
command["subcommand"] = QString("setconfig");
if (jsonString.size() > 0)
{
QJsonObject configObj;
@ -384,9 +383,6 @@ void JsonConnection::setConfig(const QString &jsonString)
command["config"] = configObj;
}
// send command message
QJsonObject reply = sendMessage(command);
@ -423,72 +419,26 @@ void JsonConnection::setAdjustment(
adjust["id"] = adjustmentId;
}
if (redAdjustment.isValid())
const auto addAdjustmentIfValid = [&] (const QString & name, const QColor & adjustment) {
if (adjustment.isValid())
{
QJsonArray red;
red.append(redAdjustment.red());
red.append(redAdjustment.green());
red.append(redAdjustment.blue());
adjust["red"] = red;
QJsonArray color;
color.append(adjustment.red());
color.append(adjustment.green());
color.append(adjustment.blue());
adjust[name] = color;
}
};
if (greenAdjustment.isValid())
{
QJsonArray green;
green.append(greenAdjustment.red());
green.append(greenAdjustment.green());
green.append(greenAdjustment.blue());
adjust["green"] = green;
}
addAdjustmentIfValid("red", redAdjustment);
addAdjustmentIfValid("green", greenAdjustment);
addAdjustmentIfValid("blue", blueAdjustment);
addAdjustmentIfValid("cyan", cyanAdjustment);
addAdjustmentIfValid("magenta", magentaAdjustment);
addAdjustmentIfValid("yellow", yellowAdjustment);
addAdjustmentIfValid("white", whiteAdjustment);
addAdjustmentIfValid("black", blackAdjustment);
if (blueAdjustment.isValid())
{
QJsonArray blue;
blue.append(blueAdjustment.red());
blue.append(blueAdjustment.green());
blue.append(blueAdjustment.blue());
adjust["blue"] = blue;
}
if (cyanAdjustment.isValid())
{
QJsonArray cyan;
cyan.append(cyanAdjustment.red());
cyan.append(cyanAdjustment.green());
cyan.append(cyanAdjustment.blue());
adjust["cyan"] = cyan;
}
if (magentaAdjustment.isValid())
{
QJsonArray magenta;
magenta.append(magentaAdjustment.red());
magenta.append(magentaAdjustment.green());
magenta.append(magentaAdjustment.blue());
adjust["magenta"] = magenta;
}
if (yellowAdjustment.isValid())
{
QJsonArray yellow;
yellow.append(yellowAdjustment.red());
yellow.append(yellowAdjustment.green());
yellow.append(yellowAdjustment.blue());
adjust["yellow"] = yellow;
}
if (whiteAdjustment.isValid())
{
QJsonArray white;
white.append(whiteAdjustment.red());
white.append(whiteAdjustment.green());
white.append(whiteAdjustment.blue());
adjust["white"] = white;
}
if (blackAdjustment.isValid())
{
QJsonArray black;
black.append(blackAdjustment.red());
black.append(blackAdjustment.green());
black.append(blackAdjustment.blue());
adjust["black"] = black;
}
if (backlightThreshold != nullptr)
{
adjust["backlightThreshold"] = *backlightThreshold;

View File

@ -1,8 +1,11 @@
#pragma once
#include <QString>
#include <QProcess>
#include <QByteArray>
#include <QDir>
#include <QFile>
#include <QRegExp>
#include <QString>
#include <QTextStream>
#ifdef WIN32
// psapi.h requires windows.h to be included
@ -12,7 +15,6 @@
unsigned int getProcessIdsByProcessName(const char *processName, QStringList &listOfPids)
{
// Clear content of returned list of PIDS
listOfPids.clear();
@ -57,33 +59,36 @@ unsigned int getProcessIdsByProcessName(const char *processName, QStringList &li
}
}
return listOfPids.count();
#else
// Run pgrep, which looks through the currently running processses and lists the process IDs
// which match the selection criteria to stdout.
QProcess process;
process.start("pgrep", QStringList() << processName);
process.waitForReadyRead();
QDir dir("/proc");
dir.setFilter(QDir::Dirs);
dir.setSorting(QDir::Name | QDir::Reversed);
QByteArray bytes = process.readAllStandardOutput();
for (const QString & pid : dir.entryList()) {
QRegExp regexp("\\d*");
if (!regexp.exactMatch(pid))
{
/* Not a number, can not be PID */
continue;
}
process.terminate();
process.waitForFinished();
process.kill();
QFile cmdline("/proc/" + pid + "/cmdline");
if (!cmdline.open(QFile::ReadOnly | QFile::Text))
{
/* Can not open cmdline file */
continue;
}
// Output is something like "2472\n2323" for multiple instances
if (bytes.isEmpty())
return 0;
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
listOfPids = QString(bytes).split("\n", Qt::SkipEmptyParts);
#else
listOfPids = QString(bytes).split("\n", QString::SkipEmptyParts);
#endif
return listOfPids.count();
QTextStream in(&cmdline);
QString command = in.readAll();
if (command.startsWith(processName))
{
listOfPids.push_back(pid);
}
}
#endif
return listOfPids.count();
}

View File

@ -153,7 +153,6 @@ int main(int argc, char** argv)
Logger::setLogLevel(Logger::WARNING);
// check if we are running already an instance
// TODO Do not use pgrep on linux, instead iter /proc
// TODO Allow one session per user
// http://www.qtcentre.org/threads/44489-Get-Process-ID-for-a-running-application
QStringList listOfPids;