summaryrefslogtreecommitdiffstats
path: root/src/executor.cpp
diff options
context:
space:
mode:
authorAnne Jan Brouwer <brouwer@annejan.com>2019-04-17 11:26:56 +0200
committerAnne Jan Brouwer <brouwer@annejan.com>2019-04-17 11:26:56 +0200
commitf2b2f6715215e83b27d5b067a2b1a9e890bd8be7 (patch)
tree85d8768d0c0e3052ab21541e3b73f2c4af899bb7 /src/executor.cpp
parent5eae57663c53467b946ea7a7b5935766afebc90b (diff)
parent3698ff096cffec3541253ba1e745c389df0118c2 (diff)
Updated to current master
Diffstat (limited to 'src/executor.cpp')
-rw-r--r--src/executor.cpp50
1 files changed, 40 insertions, 10 deletions
diff --git a/src/executor.cpp b/src/executor.cpp
index d536068c..0790683b 100644
--- a/src/executor.cpp
+++ b/src/executor.cpp
@@ -31,7 +31,13 @@ void Executor::executeNext() {
running = true;
if (!i.workingDir.isEmpty())
m_process.setWorkingDirectory(i.workingDir);
- m_process.start(i.app, i.args);
+ if (i.app.startsWith("wsl ")) {
+ QStringList tmp = i.args;
+ QString app = i.app;
+ tmp.prepend(app.remove(0, 4));
+ m_process.start("wsl", tmp);
+ } else
+ m_process.start(i.app, i.args);
if (!i.input.isEmpty()) {
m_process.waitForStarted(-1);
QByteArray data = i.input.toUtf8();
@@ -111,14 +117,35 @@ void Executor::execute(int id, const QString &workDir, const QString &app,
#endif
return;
}
- QString appPath =
- QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(app);
+ QString appPath = app;
+ if (!appPath.startsWith("wsl "))
+ appPath =
+ QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(app);
m_execQueue.push_back(
{id, appPath, args, input, readStdout, readStderr, workDir});
executeNext();
}
/**
+ * @brief decodes the input into a string assuming UTF-8 encoding.
+ * If this fails (which is likely if it is not actually UTF-8)
+ * it will then fall back to Qt's decoding function, which
+ * will try based on BOM and if that fails fall back to local encoding.
+ *
+ * @param in input data
+ * @return Input bytes decoded to string
+ */
+static QString decodeAssumingUtf8(QByteArray in) {
+ QTextCodec *codec = QTextCodec::codecForName("UTF-8");
+ QTextCodec::ConverterState state;
+ QString out = codec->toUnicode(in.constData(), in.size(), &state);
+ if (!state.invalidChars)
+ return out;
+ codec = QTextCodec::codecForUtfText(in);
+ return codec->toUnicode(in);
+}
+
+/**
* @brief Executor::executeBlocking blocking version of the executor,
* takes input and presents it as stdin
* @param app
@@ -134,7 +161,12 @@ int Executor::executeBlocking(QString app, const QStringList &args,
QString input, QString *process_out,
QString *process_err) {
QProcess internal;
- internal.start(app, args);
+ if (app.startsWith("wsl ")) {
+ QStringList tmp = args;
+ tmp.prepend(app.remove(0, 4));
+ internal.start("wsl", tmp);
+ } else
+ internal.start(app, args);
if (!input.isEmpty()) {
QByteArray data = input.toUtf8();
internal.waitForStarted(-1);
@@ -147,9 +179,8 @@ int Executor::executeBlocking(QString app, const QStringList &args,
}
internal.waitForFinished(-1);
if (internal.exitStatus() == QProcess::NormalExit) {
- QTextCodec *codec = QTextCodec::codecForLocale();
- QString pout = codec->toUnicode(internal.readAllStandardOutput());
- QString perr = codec->toUnicode(internal.readAllStandardError());
+ QString pout = decodeAssumingUtf8(internal.readAllStandardOutput());
+ QString perr = decodeAssumingUtf8(internal.readAllStandardError());
if (process_out != Q_NULLPTR)
*process_out = pout;
if (process_err != Q_NULLPTR)
@@ -204,11 +235,10 @@ void Executor::finished(int exitCode, QProcess::ExitStatus exitStatus) {
running = false;
if (exitStatus == QProcess::NormalExit) {
QString output, err;
- QTextCodec *codec = QTextCodec::codecForLocale();
if (i.readStdout)
- output = codec->toUnicode(m_process.readAllStandardOutput());
+ output = decodeAssumingUtf8(m_process.readAllStandardOutput());
if (i.readStderr || exitCode != 0) {
- err = codec->toUnicode(m_process.readAllStandardError());
+ err = decodeAssumingUtf8(m_process.readAllStandardError());
if (exitCode != 0) {
#ifdef QT_DEBUG
dbg() << exitCode << err;