forked from GodotSteam/GodotSteam
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgodotsteam_loader.cpp
323 lines (277 loc) · 12.2 KB
/
godotsteam_loader.cpp
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
#include "godotsteam.h"
void *steam_library_handle = nullptr;
typedef ESteamAPIInitResult (*SteamInternal_SteamAPI_Init_t)(const char*, SteamErrMsg*);
SteamInternal_SteamAPI_Init_t pointer_SteamInternal_SteamAPI_Init = nullptr;
typedef HSteamUser (*SteamAPI_GetHSteamUser_t)();
SteamAPI_GetHSteamUser_t pointer_SteamAPI_GetHSteamUser = nullptr;
typedef bool (*SteamAPI_IsSteamRunning_t)();
SteamAPI_IsSteamRunning_t pointer_SteamAPI_IsSteamRunning = nullptr;
typedef void (*SteamAPI_RegisterCallResult_t)(class CCallbackBase *pCallback, SteamAPICall_t hAPICall);
SteamAPI_RegisterCallResult_t pointer_SteamAPI_RegisterCallResult = nullptr;
typedef void (*SteamAPI_RegisterCallback_t)(class CCallbackBase *pCallback, int iCallback);
SteamAPI_RegisterCallback_t pointer_SteamAPI_RegisterCallback = nullptr;
typedef void (*SteamAPI_RunCallbacks_t)();
SteamAPI_RunCallbacks_t pointer_SteamAPI_RunCallbacks = nullptr;
typedef void (*SteamAPI_UnregisterCallResult_t)(class CCallbackBase *pCallback, SteamAPICall_t hAPICall);
SteamAPI_UnregisterCallResult_t pointer_SteamAPI_UnregisterCallResult = nullptr;
typedef void (*SteamAPI_UnregisterCallback_t)(class CCallbackBase *pCallback);
SteamAPI_UnregisterCallback_t pointer_SteamAPI_UnregisterCallback = nullptr;
typedef HSteamUser (*SteamGameServer_GetHSteamUser_t)();
SteamGameServer_GetHSteamUser_t pointer_SteamGameServer_GetHSteamUser = nullptr;
typedef void* (*SteamInternal_ContextInit_t)(void*);
SteamInternal_ContextInit_t pointer_SteamInternal_ContextInit = nullptr;
typedef bool (*SteamAPI_RestartAppIfNecessary_t)(uint32);
SteamAPI_RestartAppIfNecessary_t pointer_SteamAPI_RestartAppIfNecessary = nullptr;
typedef void* (*SteamInternal_FindOrCreateGameServerInterface_t)(HSteamUser, const char *);
SteamInternal_FindOrCreateGameServerInterface_t pointer_SteamInternal_FindOrCreateGameServerInterface = nullptr;
typedef void* (*SteamInternal_FindOrCreateUserInterface_t)(HSteamUser, const char *);
SteamInternal_FindOrCreateUserInterface_t pointer_SteamInternal_FindOrCreateUserInterface = nullptr;
typedef void (*SteamAPI_Shutdown_t)();
SteamAPI_Shutdown_t pointer_SteamAPI_Shutdown = nullptr;
bool tried_loading_steam_dll = false;
void try_load_steam_dll() {
if (tried_loading_steam_dll) {
return;
}
tried_loading_steam_dll = true;
String path;
if (OS::get_singleton()->has_feature("linuxbsd")) {
path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("libsteam_api.so");
if (!FileAccess::exists(path)) {
path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("../lib").path_join("libsteam_api.so");
if (!FileAccess::exists(path)) {
return;
}
}
} else if (OS::get_singleton()->has_feature("windows")) {
if (OS::get_singleton()->has_feature("64")) {
path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("steam_api64.dll");
} else {
path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("steam_api.dll");
}
if (!FileAccess::exists(path)) {
return;
}
} else if (OS::get_singleton()->has_feature("macos")) {
path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("libsteam_api.dylib");
if (!FileAccess::exists(path)) {
path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("../Frameworks").path_join("libsteam_api.dylib");
if (!FileAccess::exists(path)) {
return;
}
}
} else {
return;
}
Error err = OS::get_singleton()->open_dynamic_library(path, steam_library_handle);
if (err != OK) {
steam_library_handle = nullptr;
return;
}
print_verbose("Loaded SteamAPI library");
// Load init function
void *symbol_handle = nullptr;
err = OS::get_singleton()->get_dynamic_library_symbol_handle(steam_library_handle, "SteamInternal_SteamAPI_Init", symbol_handle, true);
if (err != OK) {
ERR_PRINT("Cannot load function SteamInternal_SteamAPI_Init");
return;
} else {
pointer_SteamInternal_SteamAPI_Init = reinterpret_cast<ESteamAPIInitResult (*)(const char*, SteamErrMsg*)>(symbol_handle);
}
// Load SteamAPI_GetHSteamUser function
err = OS::get_singleton()->get_dynamic_library_symbol_handle(steam_library_handle, "SteamAPI_GetHSteamUser", symbol_handle, true);
if (err != OK) {
ERR_PRINT("Cannot load function SteamAPI_GetHSteamUser");
return;
} else {
pointer_SteamAPI_GetHSteamUser = reinterpret_cast<HSteamUser (*)()>(symbol_handle);
}
// Load SteamAPI_IsSteamRunning function
err = OS::get_singleton()->get_dynamic_library_symbol_handle(steam_library_handle, "SteamAPI_IsSteamRunning", symbol_handle, true);
if (err != OK) {
ERR_PRINT("Cannot load function SteamAPI_IsSteamRunning");
return;
} else {
pointer_SteamAPI_IsSteamRunning = reinterpret_cast<bool (*)()>(symbol_handle);
}
// Load SteamAPI_RegisterCallResult function
err = OS::get_singleton()->get_dynamic_library_symbol_handle(steam_library_handle, "SteamAPI_RegisterCallResult", symbol_handle, true);
if (err != OK) {
ERR_PRINT("Cannot load function SteamAPI_RegisterCallResult");
return;
} else {
pointer_SteamAPI_RegisterCallResult = reinterpret_cast<void (*)(class CCallbackBase*, SteamAPICall_t)>(symbol_handle);
}
// Load SteamAPI_RegisterCallback function
err = OS::get_singleton()->get_dynamic_library_symbol_handle(steam_library_handle, "SteamAPI_RegisterCallback", symbol_handle, true);
if (err != OK) {
ERR_PRINT("Cannot load function SteamAPI_RegisterCallback");
return;
} else {
pointer_SteamAPI_RegisterCallback = reinterpret_cast<void (*)(class CCallbackBase*, int)>(symbol_handle);
}
// Load SteamAPI_RunCallbacks function
err = OS::get_singleton()->get_dynamic_library_symbol_handle(steam_library_handle, "SteamAPI_RunCallbacks", symbol_handle, true);
if (err != OK) {
ERR_PRINT("Cannot load function SteamAPI_RunCallbacks");
return;
} else {
pointer_SteamAPI_RunCallbacks = reinterpret_cast<void (*)()>(symbol_handle);
}
// Load SteamAPI_UnregisterCallResult
err = OS::get_singleton()->get_dynamic_library_symbol_handle(steam_library_handle, "SteamAPI_UnregisterCallResult", symbol_handle, true);
if (err != OK) {
ERR_PRINT("Cannot load function SteamAPI_UnregisterCallResult");
return;
} else {
pointer_SteamAPI_UnregisterCallResult = reinterpret_cast<void (*)(class CCallbackBase*, SteamAPICall_t)>(symbol_handle);
}
// Load SteamAPI_UnregisterCallback
err = OS::get_singleton()->get_dynamic_library_symbol_handle(steam_library_handle, "SteamAPI_UnregisterCallback", symbol_handle, true);
if (err != OK) {
ERR_PRINT("Cannot load function SteamAPI_UnregisterCallback");
return;
} else {
pointer_SteamAPI_UnregisterCallback = reinterpret_cast<void (*)(class CCallbackBase*)>(symbol_handle);
}
// Load SteamGameServer_GetHSteamUser
err = OS::get_singleton()->get_dynamic_library_symbol_handle(steam_library_handle, "SteamGameServer_GetHSteamUser", symbol_handle, true);
if (err != OK) {
ERR_PRINT("Cannot load function SteamGameServer_GetHSteamUser");
return;
} else {
pointer_SteamGameServer_GetHSteamUser = reinterpret_cast<HSteamUser (*)()>(symbol_handle);
}
// Load SteamInternal_ContextInit
err = OS::get_singleton()->get_dynamic_library_symbol_handle(steam_library_handle, "SteamInternal_ContextInit", symbol_handle, true);
if (err != OK) {
ERR_PRINT("Cannot load function SteamInternal_ContextInit");
return;
} else {
pointer_SteamInternal_ContextInit = reinterpret_cast<void *(*)(void*)>(symbol_handle);
}
// Load SteamAPI_RestartAppIfNecessary
err = OS::get_singleton()->get_dynamic_library_symbol_handle(steam_library_handle, "SteamAPI_RestartAppIfNecessary", symbol_handle, true);
if (err != OK) {
ERR_PRINT("Cannot load function SteamAPI_RestartAppIfNecessary");
return;
} else {
pointer_SteamAPI_RestartAppIfNecessary = reinterpret_cast<bool (*)(uint32)>(symbol_handle);
}
// Load SteamInternal_FindOrCreateGameServerInterface
err = OS::get_singleton()->get_dynamic_library_symbol_handle(steam_library_handle, "SteamInternal_FindOrCreateGameServerInterface", symbol_handle, true);
if (err != OK) {
ERR_PRINT("Cannot load function SteamInternal_FindOrCreateGameServerInterface");
return;
} else {
pointer_SteamInternal_FindOrCreateGameServerInterface = reinterpret_cast<void *(*)(HSteamUser, const char *)>(symbol_handle);
}
// Load SteamInternal_FindOrCreateUserInterface
err = OS::get_singleton()->get_dynamic_library_symbol_handle(steam_library_handle, "SteamInternal_FindOrCreateUserInterface", symbol_handle, true);
if (err != OK) {
ERR_PRINT("Cannot load function SteamInternal_FindOrCreateUserInterface");
return;
} else {
pointer_SteamInternal_FindOrCreateUserInterface = reinterpret_cast<void *(*)(HSteamUser, const char *)>(symbol_handle);
}
// Load SteamAPI_Shutdown
err = OS::get_singleton()->get_dynamic_library_symbol_handle(steam_library_handle, "SteamAPI_Shutdown", symbol_handle, true);
if (err != OK) {
ERR_PRINT("Cannot load function SteamAPI_Shutdown");
return;
} else {
pointer_SteamAPI_Shutdown = reinterpret_cast<void (*)()>(symbol_handle);
}
}
S_API ESteamAPIInitResult S_CALLTYPE SteamInternal_SteamAPI_Init( const char *pszInternalCheckInterfaceVersions, SteamErrMsg *pOutErrMsg ) {
try_load_steam_dll();
if (pointer_SteamInternal_SteamAPI_Init != nullptr) {
return pointer_SteamInternal_SteamAPI_Init(pszInternalCheckInterfaceVersions, pOutErrMsg);
}
return ESteamAPIInitResult::k_ESteamAPIInitResult_FailedGeneric;
}
S_API HSteamUser S_CALLTYPE SteamAPI_GetHSteamUser() {
try_load_steam_dll();
if (pointer_SteamAPI_GetHSteamUser != nullptr) {
return pointer_SteamAPI_GetHSteamUser();
}
return 0;
}
S_API bool S_CALLTYPE SteamAPI_IsSteamRunning() {
try_load_steam_dll();
if (pointer_SteamAPI_IsSteamRunning != nullptr) {
return pointer_SteamAPI_IsSteamRunning();
}
return false;
}
S_API void S_CALLTYPE SteamAPI_RegisterCallResult ( class CCallbackBase *pCallback, SteamAPICall_t hAPICall ) {
try_load_steam_dll();
if (pointer_SteamAPI_RegisterCallResult != nullptr) {
pointer_SteamAPI_RegisterCallResult(pCallback, hAPICall);
}
}
S_API void S_CALLTYPE SteamAPI_RegisterCallback( class CCallbackBase *pCallback, int iCallback ) {
try_load_steam_dll();
if (pointer_SteamAPI_RegisterCallback != nullptr) {
pointer_SteamAPI_RegisterCallback(pCallback, iCallback);
}
}
S_API void S_CALLTYPE SteamAPI_RunCallbacks() {
try_load_steam_dll();
if (pointer_SteamAPI_RunCallbacks != nullptr) {
pointer_SteamAPI_RunCallbacks();
}
}
S_API void S_CALLTYPE SteamAPI_UnregisterCallResult( class CCallbackBase *pCallback, SteamAPICall_t hAPICall ) {
try_load_steam_dll();
if (pointer_SteamAPI_UnregisterCallResult != nullptr) {
pointer_SteamAPI_UnregisterCallResult(pCallback, hAPICall);
}
}
S_API void S_CALLTYPE SteamAPI_UnregisterCallback( class CCallbackBase *pCallback ) {
try_load_steam_dll();
if (pointer_SteamAPI_UnregisterCallback != nullptr) {
pointer_SteamAPI_UnregisterCallback(pCallback);
}
}
S_API HSteamUser S_CALLTYPE SteamGameServer_GetHSteamUser() {
try_load_steam_dll();
if (pointer_SteamGameServer_GetHSteamUser != nullptr) {
return pointer_SteamGameServer_GetHSteamUser();
}
return 0;
}
S_API void *S_CALLTYPE SteamInternal_ContextInit( void *pContextInitData ) {
try_load_steam_dll();
if (pointer_SteamInternal_ContextInit != nullptr) {
return pointer_SteamInternal_ContextInit(pContextInitData);
}
return nullptr;
}
S_API bool S_CALLTYPE SteamAPI_RestartAppIfNecessary( uint32 unOwnAppID ) {
try_load_steam_dll();
if (pointer_SteamAPI_RestartAppIfNecessary != nullptr) {
return pointer_SteamAPI_RestartAppIfNecessary(unOwnAppID);
}
return false;
}
S_API void *S_CALLTYPE SteamInternal_FindOrCreateGameServerInterface( HSteamUser hSteamUser, const char *pszVersion ) {
try_load_steam_dll();
if (pointer_SteamInternal_FindOrCreateGameServerInterface != nullptr) {
return pointer_SteamInternal_FindOrCreateGameServerInterface(hSteamUser, pszVersion);
}
return nullptr;
}
S_API void *S_CALLTYPE SteamInternal_FindOrCreateUserInterface( HSteamUser hSteamUser, const char *pszVersion ) {
try_load_steam_dll();
if (pointer_SteamInternal_FindOrCreateUserInterface != nullptr) {
return pointer_SteamInternal_FindOrCreateUserInterface(hSteamUser, pszVersion);
}
return nullptr;
}
S_API void S_CALLTYPE SteamAPI_Shutdown() {
try_load_steam_dll();
if (pointer_SteamAPI_Shutdown != nullptr) {
pointer_SteamAPI_Shutdown();
}
}