aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhjk <hjk@qt.io>2022-04-27 14:19:49 +0200
committerhjk <hjk@qt.io>2022-04-28 08:20:11 +0000
commitaa3bdcb427241246cf4c8b0a8da880b923c4d9ad (patch)
treede19a5e4b29e4eb9d79ec0412b4dd24fd941a565
parent93401c9c8181dd4a72ec29217984b9a979090fbc (diff)
Utils: Add a QString-based write to QtcProcess
Centralize some boiler plate and warn about best-guessed cases. Keep the QByteArray based access as writeRaw() Fixes: QTCREATORBUG-27445 Change-Id: I948d80fba78b36cf85cc73664175ab05eb7707d4 Reviewed-by: Orgad Shaneh <orgads@gmail.com> Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
-rw-r--r--src/libs/utils/qtcprocess.cpp18
-rw-r--r--src/libs/utils/qtcprocess.h4
-rw-r--r--src/plugins/android/androidavdmanager.cpp6
-rw-r--r--src/plugins/android/androidsdkmanager.cpp2
-rw-r--r--src/plugins/debugger/cdb/cdbengine.cpp2
-rw-r--r--src/plugins/debugger/gdb/gdbengine.cpp2
-rw-r--r--src/plugins/debugger/lldb/lldbengine.cpp9
-rw-r--r--src/plugins/debugger/lldb/lldbengine.h2
-rw-r--r--src/plugins/debugger/pdb/pdbengine.cpp4
-rw-r--r--src/plugins/docker/dockerdevice.cpp4
-rw-r--r--src/plugins/git/mergetool.cpp12
-rw-r--r--src/plugins/git/mergetool.h2
-rw-r--r--src/plugins/languageclient/languageclientinterface.cpp2
-rw-r--r--src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp2
-rw-r--r--src/plugins/projectexplorer/devicesupport/sshdeviceprocess.h2
-rw-r--r--src/plugins/qbsprojectmanager/qbssession.cpp6
-rw-r--r--src/plugins/remotelinux/linuxdevice.cpp13
17 files changed, 54 insertions, 38 deletions
diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp
index 1b4820c5758..20b21526a62 100644
--- a/src/libs/utils/qtcprocess.cpp
+++ b/src/libs/utils/qtcprocess.cpp
@@ -1207,11 +1207,27 @@ QByteArray QtcProcess::readAllStandardError()
return buf;
}
-qint64 QtcProcess::write(const QByteArray &input)
+qint64 QtcProcess::write(const QString &input)
{
QTC_ASSERT(processMode() == ProcessMode::Writer, return -1);
QTC_ASSERT(d->m_process, return -1);
QTC_ASSERT(state() == QProcess::Running, return -1);
+
+ // Non-windows is assumed to be UTF-8
+ if (commandLine().executable().osType() != OsTypeWindows)
+ return writeRaw(input.toUtf8());
+
+ if (HostOsInfo::hostOs() == OsTypeWindows)
+ return writeRaw(input.toLocal8Bit());
+
+ // "remote" Windows target on non-Windows host is unlikely,
+ // but the true encoding is not accessible. Use UTF8 as best guess.
+ QTC_CHECK(false);
+ return writeRaw(input.toUtf8());
+}
+
+qint64 QtcProcess::writeRaw(const QByteArray &input)
+{
return d->m_process->write(input);
}
diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h
index 976e0ad4024..53a14ed4103 100644
--- a/src/libs/utils/qtcprocess.h
+++ b/src/libs/utils/qtcprocess.h
@@ -69,7 +69,9 @@ public:
virtual QByteArray readAllStandardOutput();
virtual QByteArray readAllStandardError();
- virtual qint64 write(const QByteArray &input);
+
+ virtual qint64 write(const QString &input);
+ qint64 writeRaw(const QByteArray &input);
virtual qint64 processId() const;
qint64 applicationMainThreadId() const;
diff --git a/src/plugins/android/androidavdmanager.cpp b/src/plugins/android/androidavdmanager.cpp
index 95699a5c56e..3b3098cdc5a 100644
--- a/src/plugins/android/androidavdmanager.cpp
+++ b/src/plugins/android/androidavdmanager.cpp
@@ -130,7 +130,7 @@ static CreateAvdInfo createAvdCommand(const AndroidConfig &config, const CreateA
return result;
}
QTC_CHECK(proc.isRunning());
- proc.write(QByteArray("yes\n")); // yes to "Do you wish to create a custom hardware profile"
+ proc.write("yes\n"); // yes to "Do you wish to create a custom hardware profile"
auto start = chrono::steady_clock::now();
QString errorOutput;
@@ -144,9 +144,9 @@ static CreateAvdInfo createAvdCommand(const AndroidConfig &config, const CreateA
if (index != -1)
question = question.mid(index);
if (question.contains("hw.gpu.enabled"))
- proc.write(QByteArray("yes\n"));
+ proc.write("yes\n");
else
- proc.write(QByteArray("\n"));
+ proc.write("\n");
question.clear();
}
// The exit code is always 0, so we need to check stderr
diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp
index 41dab000895..d238e60ef38 100644
--- a/src/plugins/android/androidsdkmanager.cpp
+++ b/src/plugins/android/androidsdkmanager.cpp
@@ -1041,7 +1041,7 @@ void AndroidSdkManagerPrivate::getPendingLicense(SdkCmdFutureInterface &fi)
QByteArray userInput = getUserInput();
if (!userInput.isEmpty()) {
clearUserInput();
- licenseCommand.write(userInput);
+ licenseCommand.writeRaw(userInput);
++inputCounter;
if (steps != -1)
fi.setProgressValue(qRound((inputCounter / (double)steps) * 100));
diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp
index 8c9a95a9abe..e2da844b0e8 100644
--- a/src/plugins/debugger/cdb/cdbengine.cpp
+++ b/src/plugins/debugger/cdb/cdbengine.cpp
@@ -1060,7 +1060,7 @@ void CdbEngine::runCommand(const DebuggerCommand &dbgCmd)
qDebug("CdbEngine::postCommand: resulting command '%s'\n", qPrintable(fullCmd));
}
showMessage(cmd, LogInput);
- m_process.write(fullCmd.toLocal8Bit());
+ m_process.write(fullCmd);
}
void CdbEngine::activateFrame(int index)
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 2366a06701b..93aff153bc2 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -785,7 +785,7 @@ void GdbEngine::runCommand(const DebuggerCommand &command)
.arg(token).arg(buffer));
QMetaObject::invokeMethod(this, [this, buffer] { handleResponse(buffer); });
} else {
- m_gdbProc.write(cmd.function.toUtf8() + "\r\n");
+ m_gdbProc.write(cmd.function + "\r\n");
if (command.flags & NeedsFlush) {
// We don't need the response or result here, just want to flush
// anything that's still on the gdb side.
diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp
index 13bfd56f3af..2168280abe3 100644
--- a/src/plugins/debugger/lldb/lldbengine.cpp
+++ b/src/plugins/debugger/lldb/lldbengine.cpp
@@ -153,7 +153,7 @@ void LldbEngine::runCommand(const DebuggerCommand &command)
}
showMessage(msg, LogInput);
m_commandForToken[currentToken()] = cmd;
- executeCommand("script theDumper." + function.toUtf8());
+ executeCommand("script theDumper." + function);
}
void LldbEngine::debugLastCommand()
@@ -170,7 +170,7 @@ void LldbEngine::handleAttachedToCore()
updateLocals();
}
-void LldbEngine::executeCommand(const QByteArray &command)
+void LldbEngine::executeCommand(const QString &command)
{
// For some reason, sometimes LLDB misses the first character of the next command on Windows
// if passing only 1 LF.
@@ -242,14 +242,13 @@ void LldbEngine::setupEngine()
const DebuggerRunParameters &rp = runParameters();
- executeCommand("script sys.path.insert(1, '" + rp.dumperPath.path().toLocal8Bit() + "')");
+ executeCommand("script sys.path.insert(1, '" + rp.dumperPath.path() + "')");
// This triggers reportState("enginesetupok") or "enginesetupfailed":
executeCommand("script from lldbbridge import *");
QString commands = nativeStartupCommands();
if (!commands.isEmpty())
- executeCommand(commands.toLocal8Bit());
-
+ executeCommand(commands);
const QString path = debuggerSettings()->extraDumperFile.value();
if (!path.isEmpty() && QFileInfo(path).isReadable()) {
diff --git a/src/plugins/debugger/lldb/lldbengine.h b/src/plugins/debugger/lldb/lldbengine.h
index 4d80c0b9fd6..0e7e60bb713 100644
--- a/src/plugins/debugger/lldb/lldbengine.h
+++ b/src/plugins/debugger/lldb/lldbengine.h
@@ -130,7 +130,7 @@ private:
void runCommand(const DebuggerCommand &cmd) override;
void debugLastCommand() override;
void handleAttachedToCore();
- void executeCommand(const QByteArray &command);
+ void executeCommand(const QString &command);
private:
DebuggerCommand m_lastDebuggableCommand;
diff --git a/src/plugins/debugger/pdb/pdbengine.cpp b/src/plugins/debugger/pdb/pdbengine.cpp
index 0d66f58ebd6..7777ef906db 100644
--- a/src/plugins/debugger/pdb/pdbengine.cpp
+++ b/src/plugins/debugger/pdb/pdbengine.cpp
@@ -86,7 +86,7 @@ void PdbEngine::postDirectCommand(const QString &command)
{
QTC_ASSERT(m_proc.isRunning(), notifyEngineIll());
showMessage(command, LogInput);
- m_proc.write(command.toUtf8() + '\n');
+ m_proc.write(command + '\n');
}
void PdbEngine::runCommand(const DebuggerCommand &cmd)
@@ -98,7 +98,7 @@ void PdbEngine::runCommand(const DebuggerCommand &cmd)
QTC_ASSERT(m_proc.isRunning(), notifyEngineIll());
QString command = "qdebug('" + cmd.function + "'," + cmd.argsToPython() + ")";
showMessage(command, LogInput);
- m_proc.write(command.toUtf8() + '\n');
+ m_proc.write(command + '\n');
}
void PdbEngine::shutdownInferior()
diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp
index 2c7c9c6aa4a..d11174bfd9c 100644
--- a/src/plugins/docker/dockerdevice.cpp
+++ b/src/plugins/docker/dockerdevice.cpp
@@ -1002,7 +1002,7 @@ bool DockerDevicePrivate::runInShell(const CommandLine &cmd) const
QTC_ASSERT(m_shell, LOG("No shell. Could not run " << cmd.toUserOutput()); return false);
QMutexLocker l(&m_shellMutex);
m_shell->readAllStandardOutput(); // clean possible left-overs
- m_shell->write(cmd.toUserOutput().toUtf8() + "\necho $?\n");
+ m_shell->write(cmd.toUserOutput() + "\necho $?\n");
QTC_ASSERT(m_shell->waitForReadyRead(), return false);
QByteArray output = m_shell->readAllStandardOutput();
bool ok;
@@ -1033,7 +1033,7 @@ QByteArray DockerDevicePrivate::outputForRunInShell(const CommandLine &cmd) cons
}
const QByteArray markerWithNewLine("___QC_DOCKER_" + randomHex() + "_OUTPUT_MARKER___\n");
- m_shell->write(cmd.toUserOutput().toUtf8() + "\necho -n \"" + markerWithNewLine + "\"\n");
+ m_shell->write(cmd.toUserOutput() + "\necho -n \"" + markerWithNewLine + "\"\n");
QByteArray output;
while (!output.endsWith(markerWithNewLine)) {
QTC_ASSERT(m_shell->isRunning(), return {});
diff --git a/src/plugins/git/mergetool.cpp b/src/plugins/git/mergetool.cpp
index 61c51749411..747737b1e3e 100644
--- a/src/plugins/git/mergetool.cpp
+++ b/src/plugins/git/mergetool.cpp
@@ -176,7 +176,6 @@ void MergeTool::chooseAction()
}
msgBox.exec();
- QByteArray ba;
QVariant key;
QAbstractButton *button = msgBox.clickedButton();
if (button)
@@ -184,9 +183,8 @@ void MergeTool::chooseAction()
// either the message box was closed without clicking anything, or abort was clicked
if (!key.isValid())
key = QVariant('a'); // abort
- ba.append(key.toChar().toLatin1());
- ba.append('\n');
- write(ba);
+
+ write(QString(key.toChar()) + '\n');
}
void MergeTool::addButton(QMessageBox *msgBox, const QString &text, char key)
@@ -268,10 +266,10 @@ void MergeTool::done()
deleteLater();
}
-void MergeTool::write(const QByteArray &bytes)
+void MergeTool::write(const QString &str)
{
- m_process->write(bytes);
- VcsOutputWindow::append(QString::fromLocal8Bit(bytes));
+ m_process->write(str);
+ VcsOutputWindow::append(str);
}
} // namespace Internal
diff --git a/src/plugins/git/mergetool.h b/src/plugins/git/mergetool.h
index 5247a6217a4..7d0fba01b80 100644
--- a/src/plugins/git/mergetool.h
+++ b/src/plugins/git/mergetool.h
@@ -71,7 +71,7 @@ private:
void readData();
void readLine(const QString &line);
void done();
- void write(const QByteArray &bytes);
+ void write(const QString &str);
FileState parseStatus(const QString &line, QString &extraInfo);
QString mergeTypeName();
diff --git a/src/plugins/languageclient/languageclientinterface.cpp b/src/plugins/languageclient/languageclientinterface.cpp
index a22ea669767..40aa11113a1 100644
--- a/src/plugins/languageclient/languageclientinterface.cpp
+++ b/src/plugins/languageclient/languageclientinterface.cpp
@@ -133,7 +133,7 @@ void StdIOClientInterface::sendData(const QByteArray &data)
}
qCDebug(LOGLSPCLIENTV) << "StdIOClient send data:";
qCDebug(LOGLSPCLIENTV).noquote() << data;
- m_process.write(data);
+ m_process.writeRaw(data);
}
void StdIOClientInterface::onProcessFinished()
diff --git a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp
index cf3cfccd7f3..061996286b6 100644
--- a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp
+++ b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp
@@ -326,7 +326,7 @@ void SshDeviceProcess::SshDeviceProcessPrivate::setState(SshDeviceProcess::SshDe
}
}
-qint64 SshDeviceProcess::write(const QByteArray &data)
+qint64 SshDeviceProcess::write(const QString &data)
{
QTC_ASSERT(!usesTerminal(), return -1);
return d->remoteProcess->write(data);
diff --git a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.h b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.h
index 1d09e253124..4a48f35e9d5 100644
--- a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.h
+++ b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.h
@@ -52,7 +52,7 @@ public:
QByteArray readAllStandardOutput() override;
QByteArray readAllStandardError() override;
- qint64 write(const QByteArray &data) override;
+ qint64 write(const QString &data) override;
protected:
void emitStarted() override;
diff --git a/src/plugins/qbsprojectmanager/qbssession.cpp b/src/plugins/qbsprojectmanager/qbssession.cpp
index 3d2df477b10..67c77c7bf97 100644
--- a/src/plugins/qbsprojectmanager/qbssession.cpp
+++ b/src/plugins/qbsprojectmanager/qbssession.cpp
@@ -233,8 +233,8 @@ void QbsSession::initialize()
void QbsSession::sendQuitPacket()
{
- d->qbsProcess->write(Packet::createPacket(QJsonObject{qMakePair(QString("type"),
- QJsonValue("quit"))}));
+ d->qbsProcess->writeRaw(Packet::createPacket(QJsonObject{qMakePair(QString("type"),
+ QJsonValue("quit"))}));
}
QbsSession::~QbsSession()
@@ -562,7 +562,7 @@ void QbsSession::sendRequestNow(const QJsonObject &request)
{
QTC_ASSERT(d->state == State::Active, return);
if (!request.isEmpty())
- d->qbsProcess->write(Packet::createPacket(request));
+ d->qbsProcess->writeRaw(Packet::createPacket(request));
}
ErrorInfo QbsSession::getErrorInfo(const QJsonObject &packet)
diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp
index bcc6642cd94..8bb02780ff1 100644
--- a/src/plugins/remotelinux/linuxdevice.cpp
+++ b/src/plugins/remotelinux/linuxdevice.cpp
@@ -872,10 +872,11 @@ public:
QTC_CHECK(m_shell->readAllStandardOutput().isNull()); // clean possible left-overs
QTC_CHECK(m_shell->readAllStandardError().isNull()); // clean possible left-overs
- const QByteArray prefix = !data.isEmpty()
- ? QByteArray("echo '" + data.toBase64() + "' | base64 -d | ") : QByteArray("");
- const QByteArray suffix = QByteArray(" > /dev/null 2>&1\necho $?\n");
- const QByteArray command = prefix + cmd.toUserOutput().toUtf8() + suffix;
+ QString prefix;
+ if (!data.isEmpty())
+ prefix = "echo '" + QString::fromUtf8(data.toBase64()) + "' | base64 -d | ";
+ const QString suffix = " > /dev/null 2>&1\necho $?\n";
+ const QString command = prefix + cmd.toUserOutput() + suffix;
m_shell->write(command);
DEBUG("RUN1 " << cmd.toUserOutput());
@@ -896,8 +897,8 @@ public:
QTC_CHECK(m_shell->readAllStandardError().isNull()); // clean possible left-overs
auto cleanup = qScopeGuard([this] { m_shell->readAllStandardOutput(); }); // clean on assert
- const QByteArray suffix = QByteArray(" 2> /dev/null \necho $? 1>&2\n");
- const QByteArray command = cmd.toUtf8() + suffix;
+ const QString suffix = " 2> /dev/null \necho $? 1>&2\n";
+ const QString command = cmd + suffix;
m_shell->write(command);
DEBUG("RUN2 " << cmd.toUserOutput());