1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
#ifndef PROCESSRUNNER_H
#define PROCESSRUNNER_H
#include "spawn.h"
#include <executableinfo.h>
class OrganizerCore;
class ILockedWaitingForProcess;
class IUserInterface;
class Executable;
class MOShortcut;
class SpawnedProcess
{
public:
SpawnedProcess(HANDLE handle, spawn::SpawnParameters sp);
SpawnedProcess(const SpawnedProcess&) = delete;
SpawnedProcess& operator=(const SpawnedProcess&) = delete;
SpawnedProcess(SpawnedProcess&& other);
SpawnedProcess& operator=(SpawnedProcess&& other);
~SpawnedProcess();
HANDLE releaseHandle();
void wait();
private:
HANDLE m_handle;
spawn::SpawnParameters m_parameters;
void destroy();
};
class ProcessRunner
{
public:
ProcessRunner(OrganizerCore& core);
void setUserInterface(IUserInterface* ui);
bool runFile(QWidget* parent, const QFileInfo& targetInfo);
bool runExecutableFile(
const QFileInfo &binary, const QString &arguments,
const QDir ¤tDirectory, const QString &steamAppID={},
const QString &customOverwrite={},
const QList<MOBase::ExecutableForcedLoadSetting> &forcedLibraries={},
bool refresh=true);
bool runExecutable(const Executable& exe, bool refresh=true);
bool runShortcut(const MOShortcut& shortcut);
HANDLE runExecutableOrExecutableFile(
const QString &executable, const QStringList &args, const QString &cwd,
const QString &profile, const QString &forcedCustomOverwrite = "",
bool ignoreCustomOverwrite = false);
bool waitForApplication(HANDLE processHandle, LPDWORD exitCode = nullptr);
bool waitForAllUSVFSProcessesWithLock();
private:
OrganizerCore& m_core;
IUserInterface* m_ui;
HANDLE spawnAndWait(
const QFileInfo &binary, const QString &arguments,
const QString &profileName,
const QDir ¤tDirectory,
const QString &steamAppID,
const QString &customOverwrite,
const QList<MOBase::ExecutableForcedLoadSetting> &forcedLibraries={},
LPDWORD exitCode = nullptr);
SpawnedProcess spawn(spawn::SpawnParameters sp);
void withLock(std::function<void (ILockedWaitingForProcess*)> f);
bool waitForProcessCompletionWithLock(HANDLE handle, LPDWORD exitCode);
bool waitForProcessCompletion(
HANDLE handle, LPDWORD exitCode, ILockedWaitingForProcess* uilock);
bool waitForAllUSVFSProcesses(ILockedWaitingForProcess* uilock);
};
#endif // PROCESSRUNNER_H
|