From 4e06d3ac74de6973718468d705e11804eb34ce2e Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 9 Aug 2021 12:57:22 +0200 Subject: [PATCH] Handle setNativeArguments inside process launcher Change-Id: I4b4db2e5cf6b3ad4d8a39614573564145f125520 Reviewed-by: hjk --- src/libs/utils/launcherpackets.cpp | 4 ++-- src/libs/utils/launcherpackets.h | 1 + src/libs/utils/launchersocket.cpp | 1 + src/libs/utils/launchersocket.h | 2 ++ src/libs/utils/processutils.cpp | 12 ++++++++++++ src/libs/utils/processutils.h | 1 + src/libs/utils/qtcprocess.cpp | 18 +++++------------- .../processlauncher/launchersockethandler.cpp | 1 + 8 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/libs/utils/launcherpackets.cpp b/src/libs/utils/launcherpackets.cpp index e14705509de..cb0e221ad2a 100644 --- a/src/libs/utils/launcherpackets.cpp +++ b/src/libs/utils/launcherpackets.cpp @@ -59,13 +59,13 @@ StartProcessPacket::StartProcessPacket(quintptr token) void StartProcessPacket::doSerialize(QDataStream &stream) const { stream << command << arguments << workingDir << env << processMode << writeData << channelMode - << standardInputFile << belowNormalPriority; + << standardInputFile << belowNormalPriority << nativeArguments; } void StartProcessPacket::doDeserialize(QDataStream &stream) { stream >> command >> arguments >> workingDir >> env >> processMode >> writeData >> channelMode - >> standardInputFile >> belowNormalPriority; + >> standardInputFile >> belowNormalPriority >> nativeArguments; } diff --git a/src/libs/utils/launcherpackets.h b/src/libs/utils/launcherpackets.h index 9a70da350d6..642cd6400df 100644 --- a/src/libs/utils/launcherpackets.h +++ b/src/libs/utils/launcherpackets.h @@ -116,6 +116,7 @@ public: QProcess::ProcessChannelMode channelMode = QProcess::SeparateChannels; QString standardInputFile; bool belowNormalPriority = false; + QString nativeArguments; private: void doSerialize(QDataStream &stream) const override; diff --git a/src/libs/utils/launchersocket.cpp b/src/libs/utils/launchersocket.cpp index 4a319d1ee8e..2fc0584d100 100644 --- a/src/libs/utils/launchersocket.cpp +++ b/src/libs/utils/launchersocket.cpp @@ -410,6 +410,7 @@ void LauncherHandle::doStart() p.channelMode = m_channelMode; p.standardInputFile = m_standardInputFile; p.belowNormalPriority = m_belowNormalPriority; + p.nativeArguments = m_nativeArguments; sendPacket(p); } diff --git a/src/libs/utils/launchersocket.h b/src/libs/utils/launchersocket.h index 28f7b5a35b7..181c62b445f 100644 --- a/src/libs/utils/launchersocket.h +++ b/src/libs/utils/launchersocket.h @@ -104,6 +104,7 @@ public: QProcess::ExitStatus exitStatus() const { QMutexLocker locker(&m_mutex); return m_exitStatus; } void setBelowNormalPriority() { m_belowNormalPriority = true; } + void setNativeArguments(const QString &arguments) { m_nativeArguments = arguments; } signals: void errorOccurred(QProcess::ProcessError error); @@ -185,6 +186,7 @@ private: CallerHandle *m_callerHandle = nullptr; bool m_belowNormalPriority = false; + QString m_nativeArguments; friend class LauncherSocket; friend class CallerHandle; diff --git a/src/libs/utils/processutils.cpp b/src/libs/utils/processutils.cpp index 853c4767891..cd88e53d4d6 100644 --- a/src/libs/utils/processutils.cpp +++ b/src/libs/utils/processutils.cpp @@ -70,8 +70,20 @@ void ProcessStartHandler::setBelowNormalPriority(QProcess *process) [](QProcess::CreateProcessArguments *args) { args->flags |= BELOW_NORMAL_PRIORITY_CLASS; }); +#else + Q_UNUSED(process) #endif // Q_OS_WIN } +void ProcessStartHandler::setNativeArguments(QProcess *process, const QString &arguments) +{ +#ifdef Q_OS_WIN + if (!arguments.isEmpty()) + process->setNativeArguments(arguments); +#else + Q_UNUSED(process) + Q_UNUSED(arguments) +#endif // Q_OS_WIN +} } // namespace Utils diff --git a/src/libs/utils/processutils.h b/src/libs/utils/processutils.h index 9ffef7eca94..27736afac4a 100644 --- a/src/libs/utils/processutils.h +++ b/src/libs/utils/processutils.h @@ -47,6 +47,7 @@ public: void handleProcessStart(QProcess *process); void handleProcessStarted(QProcess *process); void setBelowNormalPriority(QProcess *process); + void setNativeArguments(QProcess *process, const QString &arguments); private: ProcessMode m_processMode = ProcessMode::Reader; diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index 390e8e83872..38e65e8e84c 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -138,10 +138,8 @@ public: void setBelowNormalPriority() { m_belowNormalPriority = true; } bool isBelowNormalPriority() const { return m_belowNormalPriority; } - -#ifdef Q_OS_WIN - virtual void setNativeArguments(const QString &arguments) = 0; -#endif + void setNativeArguments(const QString &arguments) { m_nativeArguments = arguments; } + QString nativeArguments() const { return m_nativeArguments; } signals: void started(); @@ -155,6 +153,7 @@ protected: private: const ProcessMode m_processMode; bool m_belowNormalPriority = false; + QString m_nativeArguments; }; class ProcessHelper : public QProcess @@ -223,6 +222,7 @@ public: m_processStartHandler.setWriteData(writeData); if (isBelowNormalPriority()) m_processStartHandler.setBelowNormalPriority(&m_process); + m_processStartHandler.setNativeArguments(&m_process, nativeArguments()); m_process.start(program, arguments, m_processStartHandler.openMode()); m_processStartHandler.handleProcessStart(&m_process); } @@ -269,11 +269,6 @@ public: void setDisableUnixTerminal() override { m_process.m_disableUnixTerminal = true; } -#ifdef Q_OS_WIN - void setNativeArguments(const QString &arguments) override - { m_process.setNativeArguments(arguments); } -#endif - private: void handleStarted() { @@ -325,6 +320,7 @@ public: { if (isBelowNormalPriority()) m_handle->setBelowNormalPriority(); + m_handle->setNativeArguments(nativeArguments()); m_handle->start(program, arguments, writeData); } void terminate() override { cancel(); } // TODO: what are differences among terminate, kill and close? @@ -351,10 +347,6 @@ public: bool lowPriority() const override { QTC_CHECK(false); return false; } void setDisableUnixTerminal() override { QTC_CHECK(false); } -#ifdef Q_OS_WIN - void setNativeArguments(const QString &arguments) override { QTC_CHECK(false); } -#endif - private: typedef void (ProcessLauncherImpl::*PreSignal)(void); diff --git a/src/tools/processlauncher/launchersockethandler.cpp b/src/tools/processlauncher/launchersockethandler.cpp index 2e0ef6b08e9..14d394bbaa3 100644 --- a/src/tools/processlauncher/launchersockethandler.cpp +++ b/src/tools/processlauncher/launchersockethandler.cpp @@ -245,6 +245,7 @@ void LauncherSocketHandler::handleStartPacket() handler->setWriteData(packet.writeData); if (packet.belowNormalPriority) handler->setBelowNormalPriority(process); + handler->setNativeArguments(process, packet.nativeArguments); process->start(packet.command, packet.arguments, handler->openMode()); handler->handleProcessStart(process); }