Skip to content

Commit

Permalink
Split args manually in runExternalProgram()
Browse files Browse the repository at this point in the history
Need to split arguments manually because QProcess::startDetached(QString)
will strip off empty parameters.
E.g. `python.exe "1" "" "3"` will become `python.exe "1" "3"`.
Closes #8454.
  • Loading branch information
Chocobo1 committed Apr 1, 2018
1 parent ccc91e2 commit c07cd44
Showing 1 changed file with 25 additions and 2 deletions.
27 changes: 25 additions & 2 deletions src/app/application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@

#include <algorithm>

#ifdef Q_OS_WIN
#include <memory>
#endif

#include <QAtomicInt>
#include <QDebug>
#include <QFileInfo>
Expand Down Expand Up @@ -77,6 +81,10 @@
#include <iostream>
#endif // DISABLE_GUI

#ifdef Q_OS_WIN
#include <Shellapi.h>
#endif

#ifndef DISABLE_WEBUI
#include "webui/webui.h"
#endif
Expand Down Expand Up @@ -275,7 +283,7 @@ void Application::processMessage(const QString &message)

void Application::runExternalProgram(const BitTorrent::TorrentHandle *torrent) const
{
QString program = Preferences::instance()->getAutoRunProgram();
QString program = Preferences::instance()->getAutoRunProgram().trimmed();
program.replace("%N", torrent->name());
program.replace("%L", torrent->category());

Expand All @@ -297,7 +305,22 @@ void Application::runExternalProgram(const BitTorrent::TorrentHandle *torrent) c
#if defined(Q_OS_UNIX)
QProcess::startDetached(QLatin1String("/bin/sh"), {QLatin1String("-c"), program});
#else
QProcess::startDetached(program);
std::unique_ptr<wchar_t[]> programWchar(new wchar_t[program.length() + 1] {});
program.toWCharArray(programWchar.get());

// Need to split arguments manually because QProcess::startDetached(QString)
// will strip off empty parameters.
// E.g. `python.exe "1" "" "3"` will become `python.exe "1" "3"`
int argCount = 0;
LPWSTR *args = ::CommandLineToArgvW(programWchar.get(), &argCount);

QStringList argList;
for (int i = 1; i < argCount; ++i)
argList += QString::fromWCharArray(args[i]);

QProcess::startDetached(QString::fromWCharArray(args[0]), argList);

::LocalFree(args);
#endif
}

Expand Down

0 comments on commit c07cd44

Please sign in to comment.