summaryrefslogtreecommitdiff
path: root/src/processrunner.h
blob: d9423893e510ebfdfb30cc23228a3cb3f8cc9d83 (plain)
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 &currentDirectory, 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 &currentDirectory,
    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