Handle setNativeArguments inside process launcher

Change-Id: I4b4db2e5cf6b3ad4d8a39614573564145f125520
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Jarek Kobus
2021-08-09 12:57:22 +02:00
parent 8fa1a1f587
commit 4e06d3ac74
8 changed files with 25 additions and 15 deletions

View File

@@ -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;
}

View File

@@ -116,6 +116,7 @@ public:
QProcess::ProcessChannelMode channelMode = QProcess::SeparateChannels;
QString standardInputFile;
bool belowNormalPriority = false;
QString nativeArguments;
private:
void doSerialize(QDataStream &stream) const override;

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);
}