summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2021-01-10 23:08:07 -0500
committerisanae <14251494+isanae@users.noreply.github.com>2021-01-18 08:20:07 -0500
commitaa7a552654ba3b218b87397dedc9e5a66d2f6701 (patch)
treefc3807b35268f2c6b3d8297cd6d46ad065dae805
parente4ae41e3a29fc3e4714e1c3f8c9f071768d17b68 (diff)
implemented exe command
better error when cwd doesn't exist
-rw-r--r--src/commandline.cpp47
-rw-r--r--src/commandline.h6
-rw-r--r--src/spawn.cpp9
3 files changed, 49 insertions, 13 deletions
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 <log.h>
#include <report.h>
@@ -251,7 +252,7 @@ std::optional<int> 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<int> Command::runPreOrganizer()
return {};
}
-std::optional<int> Command::runPostOrganizer()
+std::optional<int> Command::runPostOrganizer(OrganizerCore&)
{
return {};
}
@@ -655,13 +656,43 @@ Command::Meta ExeCommand::meta() const
return {"exe", "launches a configured executable"};
}
-std::optional<int> ExeCommand::runPostOrganizer()
+std::optional<int> ExeCommand::runPostOrganizer(OrganizerCore& organizer)
{
- const auto exe = vm()["exe-name"].as<std::string>();
- const auto args = vm()["arguments"].as<std::string>();
- const auto cwd = vm()["cwd"].as<std::string>();
+ const auto exe = QString::fromStdString(vm()["exe-name"].as<std::string>());
- 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<std::string>()));
+ }
+
+ if (vm().count("cwd")) {
+ p.setCurrentDirectory(QString::fromStdString(vm()["cwd"].as<std::string>()));
+ }
+
+ 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<int> RunCommand::runPostOrganizer()
+std::optional<int> 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<int> runPreOrganizer();
- virtual std::optional<int> runPostOrganizer();
+ virtual std::optional<int> 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<int> runPostOrganizer() override;
+ std::optional<int> runPostOrganizer(OrganizerCore& organizer) override;
};
@@ -171,7 +171,7 @@ class RunCommand : public Command
protected:
po::options_description getOptions() const;
Meta meta() const override;
- std::optional<int> runPostOrganizer() override;
+ std::optional<int> 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(