From aa7a552654ba3b218b87397dedc9e5a66d2f6701 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 10 Jan 2021 23:08:07 -0500 Subject: implemented exe command better error when cwd doesn't exist --- src/commandline.cpp | 47 +++++++++++++++++++++++++++++++++++++++-------- src/commandline.h | 6 +++--- src/spawn.cpp | 9 +++++++-- 3 files changed, 49 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/commandline.cpp b/src/commandline.cpp index c31b726f..596ece68 100644 --- a/src/commandline.cpp +++ b/src/commandline.cpp @@ -2,6 +2,7 @@ #include "env.h" #include "organizercore.h" #include "shared/util.h" +#include "shared/error_report.h" #include #include @@ -251,7 +252,7 @@ std::optional CommandLine::run(OrganizerCore& organizer) const return 1; } } else if (m_command) { - return m_command->runPostOrganizer(); + return m_command->runPostOrganizer(organizer); } return {}; @@ -483,7 +484,7 @@ std::optional Command::runPreOrganizer() return {}; } -std::optional Command::runPostOrganizer() +std::optional Command::runPostOrganizer(OrganizerCore&) { return {}; } @@ -655,13 +656,43 @@ Command::Meta ExeCommand::meta() const return {"exe", "launches a configured executable"}; } -std::optional ExeCommand::runPostOrganizer() +std::optional ExeCommand::runPostOrganizer(OrganizerCore& organizer) { - const auto exe = vm()["exe-name"].as(); - const auto args = vm()["arguments"].as(); - const auto cwd = vm()["cwd"].as(); + const auto exe = QString::fromStdString(vm()["exe-name"].as()); - std::cout << "not implemented\n"; + const auto& exes = *organizer.executablesList(); + + auto itor = exes.find(exe); + if (itor == exes.end()) { + MOShared::criticalOnTop(QObject::tr("Executable '%1' not found.").arg(exe)); + return 1; + } + + try { + // make sure MO doesn't exit even if locking is disabled, ForceWait and + // PreventExit will do that + auto p = organizer.processRunner(); + + p.setFromExecutable(*itor); + + if (vm().count("arguments")) { + p.setArguments(QString::fromStdString(vm()["arguments"].as())); + } + + if (vm().count("cwd")) { + p.setCurrentDirectory(QString::fromStdString(vm()["cwd"].as())); + } + + p.setWaitForCompletion(ProcessRunner::ForceWait, UILocker::PreventExit); + p.run(); + + return 0; + } + catch (const std::exception &e) { + reportError( + QObject::tr("failed to start shortcut: %1").arg(e.what())); + return 1; + } return 0; } @@ -677,7 +708,7 @@ Command::Meta RunCommand::meta() const return {"run", "launches an arbitrary program"}; } -std::optional RunCommand::runPostOrganizer() +std::optional RunCommand::runPostOrganizer(OrganizerCore&) { std::cout << "not implemented\n"; return {}; diff --git a/src/commandline.h b/src/commandline.h index 14a453b2..d2cfbfa1 100644 --- a/src/commandline.h +++ b/src/commandline.h @@ -60,7 +60,7 @@ public: // // virtual std::optional runPreOrganizer(); - virtual std::optional runPostOrganizer(); + virtual std::optional runPostOrganizer(OrganizerCore& organizer); protected: // meta information about this command, returned by derived classes @@ -160,7 +160,7 @@ protected: po::options_description getInternalOptions() const override; po::positional_options_description getPositional() const override; Meta meta() const override; - std::optional runPostOrganizer() override; + std::optional runPostOrganizer(OrganizerCore& organizer) override; }; @@ -171,7 +171,7 @@ class RunCommand : public Command protected: po::options_description getOptions() const; Meta meta() const override; - std::optional runPostOrganizer() override; + std::optional runPostOrganizer(OrganizerCore& organizer) override; }; diff --git a/src/spawn.cpp b/src/spawn.cpp index a9ecb61e..68526165 100644 --- a/src/spawn.cpp +++ b/src/spawn.cpp @@ -164,9 +164,14 @@ QString makeContent(const SpawnParameters& sp, DWORD code) } else if (code == ERROR_FILE_NOT_FOUND) { return QObject::tr("The file '%1' does not exist.") .arg(QDir::toNativeSeparators(sp.binary.absoluteFilePath())); - } else { - return QString::fromStdWString(formatSystemMessage(code)); + } else if (code == ERROR_DIRECTORY) { + if (!sp.currentDirectory.exists()) { + return QObject::tr("The working directory '%1' does not exist.") + .arg(QDir::toNativeSeparators(sp.currentDirectory.absolutePath())); + } } + + return QString::fromStdWString(formatSystemMessage(code)); } QMessageBox::StandardButton badSteamReg( -- cgit v1.3.1