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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/*
* mptWine.h
* ---------
* Purpose: Wine stuff.
* Notes : (currently none)
* Authors: OpenMPT Devs
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
*/
#pragma once
#include "openmpt/all/BuildSettings.hpp"
#include "mptOS.h"
#include "mpt/library/library.hpp"
#include "openmpt/base/FlagSet.hpp"
#include <map>
#include <optional>
#include <string>
#include <vector>
OPENMPT_NAMESPACE_BEGIN
#if MPT_OS_WINDOWS
namespace mpt
{
namespace Wine
{
class Exception
: public std::runtime_error
{
public:
Exception(const std::string &text)
: std::runtime_error(text)
{
return;
}
};
typedef void (*ExecutePosixCommandProgress)(void *userdata);
enum ExecuteProgressResult
{
ExecuteProgressContinueWaiting = 0,
ExecuteProgressAsyncCancel = -1,
};
typedef ExecuteProgressResult (*ExecutePosixShellScriptProgress)(void *userdata);
enum ExecFlags
{
ExecFlagNone = 0,
ExecFlagSilent = 1<<0, // do not show a terminal window
ExecFlagInteractive = 1<<1, // allow interaction (prevents stdout and stderr capturing and implies !silent)
ExecFlagAsync = 1<<2, // do not wait for the script to finish
ExecFlagProgressWindow = 1<<3, // not implemented by mptOS
ExecFlagSplitOutput = 1<<4, // split stdout and stderr (implies silent)
ExecFlagsDefault = ExecFlagNone
};
MPT_DECLARE_ENUM(ExecFlags)
struct ExecResult
{
int exitcode;
std::string output;
std::string error;
std::map<std::string, std::vector<char> > filetree;
static ExecResult Error()
{
ExecResult result;
result.exitcode = -1;
return result;
}
};
class Context
{
protected:
mpt::OS::Wine::VersionContext m_VersionContext;
std::shared_ptr<std::optional<mpt::library>> m_Kernel32;
private:
LPWSTR (*CDECL wine_get_dos_file_name)(LPCSTR str);
LPSTR (*CDECL wine_get_unix_file_name)(LPCWSTR str);
protected:
std::string m_Uname_m;
std::string m_HOME;
std::string m_XDG_DATA_HOME;
std::string m_XDG_CACHE_HOME;
std::string m_XDG_CONFIG_HOME;
public:
Context(mpt::OS::Wine::VersionContext versionContext);
public:
std::string EscapePosixShell(std::string line);
std::string PathToPosix(mpt::PathString windowsPath);
mpt::PathString PathToWindows(std::string hostPath);
ExecResult ExecutePosixShellScript(std::string script, FlagSet<ExecFlags> flags, std::map<std::string, std::vector<char> > filetree, std::string title, ExecutePosixCommandProgress progress, ExecutePosixShellScriptProgress progressCancel, void *userdata);
int ExecutePosixShellCommand(std::string command, std::string & output, std::string & error);
std::string PathToPosixCanonical(mpt::PathString windowsPath);
std::string GetPosixEnvVar(std::string var, std::string def = std::string());
public:
mpt::OS::Wine::VersionContext VersionContext() const { return m_VersionContext; }
std::shared_ptr<std::optional<mpt::library>> Kernel32() const { return m_Kernel32; }
std::string Uname_m() const { return m_Uname_m; }
std::string HOME() const { return m_HOME; }
std::string XDG_DATA_HOME() const { return m_XDG_DATA_HOME; }
std::string XDG_CACHE_HOME() const { return m_XDG_CACHE_HOME; }
std::string XDG_CONFIG_HOME() const { return m_XDG_CONFIG_HOME; }
};
} // namespace Wine
} // namespace mpt
#endif // MPT_OS_WINDOWS
OPENMPT_NAMESPACE_END
|