summaryrefslogtreecommitdiffstats
path: root/mmc_updater/src/ProcessUtils.h
diff options
context:
space:
mode:
authorAndrew <forkk@forkk.net>2013-12-09 12:04:05 -0600
committerAndrew <forkk@forkk.net>2013-12-09 12:04:05 -0600
commit7f52bed9e3f559adcbcf3f3c1c7ac2251964db8c (patch)
tree52097b57dc7d18ec4e35ef3a8e554af2d91545e8 /mmc_updater/src/ProcessUtils.h
parent9410dd042ea62224fa3e0eb3b525abbdf0c316ee (diff)
parent220e07aef4a34dca9f31ae0c5bb994e5c594125d (diff)
downloadMultiMC-7f52bed9e3f559adcbcf3f3c1c7ac2251964db8c.tar
MultiMC-7f52bed9e3f559adcbcf3f3c1c7ac2251964db8c.tar.gz
MultiMC-7f52bed9e3f559adcbcf3f3c1c7ac2251964db8c.tar.lz
MultiMC-7f52bed9e3f559adcbcf3f3c1c7ac2251964db8c.tar.xz
MultiMC-7f52bed9e3f559adcbcf3f3c1c7ac2251964db8c.zip
Merge branch 'feature_updater' into develop
Diffstat (limited to 'mmc_updater/src/ProcessUtils.h')
-rw-r--r--mmc_updater/src/ProcessUtils.h97
1 files changed, 97 insertions, 0 deletions
diff --git a/mmc_updater/src/ProcessUtils.h b/mmc_updater/src/ProcessUtils.h
new file mode 100644
index 00000000..9fa10815
--- /dev/null
+++ b/mmc_updater/src/ProcessUtils.h
@@ -0,0 +1,97 @@
+#pragma once
+
+#include "Platform.h"
+
+#include <list>
+#include <string>
+
+/** A set of functions to get information about the current
+ * process and launch new processes.
+ */
+class ProcessUtils
+{
+ public:
+ enum Errors
+ {
+ /** Status code returned by runElevated() if launching
+ * the elevated process fails.
+ */
+ RunElevatedFailed = 255,
+ /** Status code returned by runSync() if the application
+ * cannot be started.
+ */
+ RunFailed = -8,
+ /** Status code returned by runSync() if waiting for
+ * the application to exit and reading its status code fails.
+ */
+ WaitFailed = -1
+ };
+
+ static PLATFORM_PID currentProcessId();
+
+ /** Returns the absolute path to the main binary for
+ * the current process.
+ */
+ static std::string currentProcessPath();
+
+ /** Start a process and wait for it to finish before
+ * returning its exit code.
+ *
+ * Returns -1 if the process cannot be started.
+ */
+ static int runSync(const std::string& executable,
+ const std::list<std::string>& args);
+
+ /** Start a process and return without waiting for
+ * it to finish.
+ */
+ static void runAsync(const std::string& executable,
+ const std::list<std::string>& args);
+
+ /** Run a process with administrative privileges and return the
+ * status code of the process, or 0 on Windows.
+ *
+ * Returns RunElevatedFailed if the elevated process could
+ * not be started.
+ */
+ static int runElevated(const std::string& executable,
+ const std::list<std::string>& args,
+ const std::string& task);
+
+ /** Wait for a process to exit.
+ * Returns true if the process was found and has exited or false
+ * otherwise.
+ */
+ static bool waitForProcess(PLATFORM_PID pid);
+
+#ifdef PLATFORM_WINDOWS
+ /** Convert a unicode command line returned by GetCommandLineW()
+ * to a standard (argc,argv) pair. The resulting argv array and each
+ * element of argv must be freed using free()
+ */
+ static void convertWindowsCommandLine(LPCWSTR commandLine, int& argc, char**& argv);
+#endif
+
+ private:
+ enum RunMode
+ {
+ RunSync,
+ RunAsync
+ };
+ static int runElevatedLinux(const std::string& executable,
+ const std::list<std::string>& args,
+ const std::string& task);
+ static int runElevatedMac(const std::string& executable,
+ const std::list<std::string>& args);
+ static int runElevatedWindows(const std::string& executable,
+ const std::list<std::string>& args);
+
+ static PLATFORM_PID runAsyncUnix(const std::string& executable,
+ const std::list<std::string>& args);
+ static int runWindows(const std::string& executable,
+ const std::list<std::string>& args,
+ RunMode runMode);
+ static int runSyncUnix(const std::string& executable,
+ const std::list<std::string>& args);
+};
+