diff options
Diffstat (limited to 'src/libs/installer/qprocesswrapper.cpp')
-rw-r--r-- | src/libs/installer/qprocesswrapper.cpp | 86 |
1 files changed, 70 insertions, 16 deletions
diff --git a/src/libs/installer/qprocesswrapper.cpp b/src/libs/installer/qprocesswrapper.cpp index b33e7d43c..44117eefb 100644 --- a/src/libs/installer/qprocesswrapper.cpp +++ b/src/libs/installer/qprocesswrapper.cpp @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2017 The Qt Company Ltd. +** Copyright (C) 2023 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -32,6 +32,7 @@ #include "utils.h" #include <QDir> +#include <QVariant> namespace QInstaller { @@ -53,7 +54,7 @@ QProcessWrapper::QProcessWrapper(QObject *parent) connect(&process, &QIODevice::bytesWritten, this, &QProcessWrapper::bytesWritten); connect(&process, &QIODevice::aboutToClose, this, &QProcessWrapper::aboutToClose); connect(&process, &QIODevice::readChannelFinished, this, &QProcessWrapper::readChannelFinished); - connect(&process, SIGNAL(error(QProcess::ProcessError)), SIGNAL(error(QProcess::ProcessError))); + connect(&process, SIGNAL(errorOccurred(QProcess::ProcessError)), SIGNAL(errorOccurred(QProcess::ProcessError))); connect(&process, &QProcess::readyReadStandardOutput, this, &QProcessWrapper::readyReadStandardOutput); connect(&process, &QProcess::readyReadStandardError, this, &QProcessWrapper::readyReadStandardError); connect(&process, SIGNAL(finished(int,QProcess::ExitStatus)), SIGNAL(finished(int,QProcess::ExitStatus))); @@ -87,7 +88,7 @@ void QProcessWrapper::processSignals() } else if (name == QLatin1String(Protocol::QProcessSignalReadChannelFinished)) { emit readChannelFinished(); } else if (name == QLatin1String(Protocol::QProcessSignalError)) { - emit error(static_cast<QProcess::ProcessError> (receivedSignals.takeFirst().toInt())); + emit errorOccurred(static_cast<QProcess::ProcessError> (receivedSignals.takeFirst().toInt())); } else if (name == QLatin1String(Protocol::QProcessSignalReadyReadStandardOutput)) { emit readyReadStandardOutput(); } else if (name == QLatin1String(Protocol::QProcessSignalReadyReadStandardError)) { @@ -107,6 +108,11 @@ void QProcessWrapper::processSignals() m_lock.unlock(); } +/*! + Starts the \a program with \a arguments in the working directory \a workingDirectory as a detached + process. The process id can be retrieved with the \a pid parameter. Compared to the QProcess + implementation of the same method this does not show a window for the started process on Windows. +*/ bool QProcessWrapper::startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory, qint64 *pid) { @@ -123,22 +129,70 @@ bool QProcessWrapper::startDetached(const QString &program, const QStringList &a return QInstaller::startDetached(program, arguments, workingDirectory, pid); } +/*! + Starts the \a program with \a arguments as a detached process. Compared to the QProcess + implementation of the same method this does not show a window for the started process on Windows. +*/ bool QProcessWrapper::startDetached(const QString &program, const QStringList &arguments) { return startDetached(program, arguments, QDir::currentPath()); } +/*! + Starts the \a program as a detached process. Compared to the QProcess implementation of the same + method this does not show a window for the started process on Windows. +*/ bool QProcessWrapper::startDetached(const QString &program) { return startDetached(program, QStringList()); } +/*! + Starts the \a program as a detached process. The variants of the function suffixed with \c 2 + use the base \c QProcess::startDetached implementation internally to start the process. +*/ +bool QProcessWrapper::startDetached2(const QString &program) +{ + return startDetached2(program, QStringList()); +} + +/*! + Starts the \a program with \a arguments as a detached process. The variants of the function + suffixed with \c 2 use the base \c QProcess::startDetached implementation internally to + start the process. +*/ +bool QProcessWrapper::startDetached2(const QString &program, const QStringList &arguments) +{ + return startDetached2(program, arguments, QDir::currentPath()); +} + +/*! + Starts the \a program with \a arguments in the working directory \a workingDirectory as a detached + process. The process id can be retrieved with the \a pid parameter. The variants + of the function suffixed with \c 2 use the base \c QProcess::startDetached implementation + internally to start the process. +*/ +bool QProcessWrapper::startDetached2(const QString &program, const QStringList &arguments, const QString &workingDirectory, qint64 *pid) +{ + QProcessWrapper w; + if (w.connectToServer()) { + const QPair<bool, qint64> result = + w.callRemoteMethod<QPair<bool, qint64> >(QLatin1String(Protocol::QProcessStartDetached2), + program, arguments, workingDirectory); + if (pid != nullptr) + *pid = result.second; + w.processSignals(); + return result.first; + } + return QProcess::startDetached(program, arguments, workingDirectory, pid); +} + void QProcessWrapper::setProcessChannelMode(QProcessWrapper::ProcessChannelMode mode) { if (connectToServer()) { m_lock.lockForWrite(); - callRemoteMethod(QLatin1String(Protocol::QProcessSetProcessChannelMode), - static_cast<QProcess::ProcessChannelMode>(mode), dummy); + callRemoteMethodDefaultReply(QLatin1String(Protocol::QProcessSetProcessChannelMode), + static_cast<QProcess::ProcessChannelMode>(mode)); m_lock.unlock(); } else { process.setProcessChannelMode(static_cast<QProcess::ProcessChannelMode>(mode)); @@ -162,8 +216,8 @@ void QProcessWrapper::setReadChannel(QProcessWrapper::ProcessChannel chan) { if (connectToServer()) { m_lock.lockForWrite(); - callRemoteMethod(QLatin1String(Protocol::QProcessSetReadChannel), - static_cast<QProcess::ProcessChannel>(chan), dummy); + callRemoteMethodDefaultReply(QLatin1String(Protocol::QProcessSetReadChannel), + static_cast<QProcess::ProcessChannel>(chan)); m_lock.unlock(); } else { process.setReadChannel(static_cast<QProcess::ProcessChannel>(chan)); @@ -209,7 +263,7 @@ void QProcessWrapper::closeWriteChannel() { if (connectToServer()) { m_lock.lockForWrite(); - callRemoteMethod(QLatin1String(Protocol::QProcessCloseWriteChannel)); + callRemoteMethodDefaultReply(QLatin1String(Protocol::QProcessCloseWriteChannel)); m_lock.unlock(); } else { process.closeWriteChannel(); @@ -242,7 +296,7 @@ void QProcessWrapper::kill() { if (connectToServer()) { m_lock.lockForWrite(); - callRemoteMethod(QLatin1String(Protocol::QProcessKill)); + callRemoteMethodDefaultReply(QLatin1String(Protocol::QProcessKill)); m_lock.unlock(); } else { process.kill(); @@ -289,7 +343,7 @@ void QProcessWrapper::start(const QString ¶m1, const QStringList ¶m2, { if (connectToServer()) { m_lock.lockForWrite(); - callRemoteMethod(QLatin1String(Protocol::QProcessStart3Arg), param1, param2, param3); + callRemoteMethodDefaultReply(QLatin1String(Protocol::QProcessStart3Arg), param1, param2, param3); m_lock.unlock(); } else { process.start(param1, param2, param3); @@ -300,10 +354,10 @@ void QProcessWrapper::start(const QString ¶m1, QIODevice::OpenMode param2) { if (connectToServer()) { m_lock.lockForWrite(); - callRemoteMethod(QLatin1String(Protocol::QProcessStart2Arg), param1, param2); + callRemoteMethodDefaultReply(QLatin1String(Protocol::QProcessStart2Arg), param1, param2); m_lock.unlock(); } else { - process.start(param1, param2); + process.start(param1, {}, param2); } } @@ -322,7 +376,7 @@ void QProcessWrapper::terminate() { if (connectToServer()) { m_lock.lockForWrite(); - callRemoteMethod(QLatin1String(Protocol::QProcessTerminate)); + callRemoteMethodDefaultReply(QLatin1String(Protocol::QProcessTerminate)); m_lock.unlock(); } else { process.terminate(); @@ -389,7 +443,7 @@ void QProcessWrapper::setEnvironment(const QStringList ¶m1) { if (connectToServer()) { m_lock.lockForWrite(); - callRemoteMethod(QLatin1String(Protocol::QProcessSetEnvironment), param1, dummy); + callRemoteMethodDefaultReply(QLatin1String(Protocol::QProcessSetEnvironment), param1); m_lock.unlock(); } else { process.setEnvironment(param1); @@ -401,7 +455,7 @@ void QProcessWrapper::setNativeArguments(const QString ¶m1) { if (connectToServer()) { m_lock.lockForWrite(); - callRemoteMethod(QLatin1String(Protocol::QProcessSetNativeArguments), param1, dummy); + callRemoteMethodDefaultReply(QLatin1String(Protocol::QProcessSetNativeArguments), param1); m_lock.unlock(); } else { process.setNativeArguments(param1); @@ -413,7 +467,7 @@ void QProcessWrapper::setWorkingDirectory(const QString ¶m1) { if (connectToServer()) { m_lock.lockForWrite(); - callRemoteMethod(QLatin1String(Protocol::QProcessSetWorkingDirectory), param1, dummy); + callRemoteMethodDefaultReply(QLatin1String(Protocol::QProcessSetWorkingDirectory), param1); m_lock.unlock(); } else { process.setWorkingDirectory(param1); |