diff options
| author | Scetch <[email protected]> | 2018-03-10 14:27:22 -0500 |
|---|---|---|
| committer | Matthew Collins <[email protected]> | 2018-03-16 21:33:25 +0000 |
| commit | e3f9fbbbd057713cad6921e45a95200a7e86ab02 (patch) | |
| tree | 1b386cbb6cd3610980f3cb295cd307f182545d47 /steamworks-sys | |
| parent | Replace Cow<str> with String in the API (diff) | |
| download | steamworks-rs-e3f9fbbbd057713cad6921e45a95200a7e86ab02.tar.xz steamworks-rs-e3f9fbbbd057713cad6921e45a95200a7e86ab02.zip | |
Cleanup callback handling.
Diffstat (limited to 'steamworks-sys')
| -rw-r--r-- | steamworks-sys/src/lib.cpp | 146 | ||||
| -rw-r--r-- | steamworks-sys/src/lib.rs | 39 |
2 files changed, 60 insertions, 125 deletions
diff --git a/steamworks-sys/src/lib.cpp b/steamworks-sys/src/lib.cpp index bed54e6..226c31a 100644 --- a/steamworks-sys/src/lib.cpp +++ b/steamworks-sys/src/lib.cpp @@ -2,118 +2,62 @@ #include <steam_gameserver.h> #include <stdint.h> -class RustSteamCallback final : CCallbackBase { -public: - RustSteamCallback(int parameter_size, void *userdata, - void (*run_func)(void *, void *), void (*dealloc)(void *), - int callback_id, int game_server) - : parameter_size(parameter_size), userdata(userdata), run_func(run_func), - dealloc(dealloc) { - if (game_server) { - m_nCallbackFlags |= k_ECallbackFlagsGameServer; - } - SteamAPI_RegisterCallback(this, callback_id); - } - ~RustSteamCallback() { - SteamAPI_UnregisterCallback(this); - dealloc(userdata); - } - - virtual void Run(void *pvParam) { run_func(userdata, pvParam); } - - virtual void Run(void *pvParam, bool, SteamAPICall_t) { Run(pvParam); } - - virtual int GetCallbackSizeBytes() { return parameter_size; } - -private: - int parameter_size; - void *userdata; - void (*run_func)(void *, void *); - void (*dealloc)(void *); +struct CallbackData { + int param_size; + void* userdata; + void (*run)(void*, void*, void*); + void (*run_extra)(void*, void*, void*, bool, SteamAPICall_t); + void (*dealloc)(void*, void*); }; -extern "C" void *register_rust_steam_callback(int parameter_size, - void *userdata, - void (*run_func)(void *, void *), - void (*dealloc)(void *), - int callback_id, - int game_server - ) { - return new RustSteamCallback(parameter_size, userdata, run_func, dealloc, - callback_id, game_server); -} - -extern "C" void unregister_rust_steam_callback(void *ty) { - RustSteamCallback *cb = static_cast<RustSteamCallback *>(ty); - delete cb; -} - -class RustSteamCallResult final : CCallbackBase { +class RustCallbackBase final : CCallbackBase { public: - RustSteamCallResult(int parameter_size, void *userdata, - void (*run_func)(void *, void *, bool), - void (*dealloc)(void *), SteamAPICall_t api_call, - int callback_id) - : parameter_size(parameter_size), userdata(userdata), run_func(run_func), - dealloc(dealloc), api_call(api_call) { - m_iCallback = callback_id; - SteamAPI_RegisterCallResult(this, api_call); - } - ~RustSteamCallResult() { - SteamAPI_UnregisterCallResult(this, api_call); - dealloc(userdata); - } + RustCallbackBase(uint8 flags, int callback, CallbackData data) : data(data) { + m_nCallbackFlags = flags; + m_iCallback = callback; + } - virtual void Run(void *pvParam) { - run_func(userdata, pvParam, false); - delete this; - } + ~RustCallbackBase() { + data.dealloc(this, data.userdata); + } - virtual void Run(void *pvParam, bool ioError, SteamAPICall_t steam_api_call) { - if (api_call == steam_api_call) { - run_func(userdata, pvParam, ioError); - delete this; + void Run(void* pvParam) { + data.run(this, data.userdata, pvParam); } - } - virtual int GetCallbackSizeBytes() { return parameter_size; } + void Run(void* pvParam, bool bIOFailure, SteamAPICall_t hSteamAPICall) { + data.run_extra(this, data.userdata, pvParam, bIOFailure, hSteamAPICall); + } + int GetCallbackSizeBytes() { + return data.param_size; + } private: - int parameter_size; - void *userdata; - void (*run_func)(void *, void *, bool); - void (*dealloc)(void *); - SteamAPICall_t api_call; + CallbackData data; }; -CCallResult<RustSteamCallResult, NumberOfCurrentPlayers_t> call_result; - -extern "C" void *register_rust_steam_call_result( - int parameter_size, void *userdata, void (*run_func)(void *, void *, bool), - void (*dealloc)(void *), SteamAPICall_t api_call, int callback_id) { - return new RustSteamCallResult(parameter_size, userdata, run_func, dealloc, - api_call, callback_id); -} +extern "C" { + void* create_rust_callback(uint8 flags, int id, CallbackData data) { + return new RustCallbackBase(flags, id, data); + } -extern "C" void unregister_rust_steam_call_result(void *ty) { - RustSteamCallResult *cb = static_cast<RustSteamCallResult *>(ty); - delete cb; -} + void delete_rust_callback(void* callback) { + RustCallbackBase* cb = static_cast<RustCallbackBase*>(callback); + delete cb; + } -extern "C" int steam_rust_game_server_init( - uint32_t ip, uint16_t steam_port, uint16_t game_port, - uint16_t query_port, EServerMode server_mode, const char* version -) { - return SteamGameServer_Init(ip, steam_port, game_port, query_port, server_mode, version); -} + int steam_rust_game_server_init(uint32_t ip, uint16_t steam_port, uint16_t game_port, + uint16_t query_port, EServerMode server_mode, const char* version) + { + return SteamGameServer_Init(ip, steam_port, game_port, query_port, server_mode, version); + } -extern "C" ISteamClient *steam_rust_get_client() { return SteamClient(); } -extern "C" ISteamMatchmaking *steam_rust_get_matchmaking() { - return SteamMatchmaking(); -} -extern "C" ISteamUtils *steam_rust_get_utils() { return SteamUtils(); } -extern "C" ISteamApps *steam_rust_get_apps() { return SteamApps(); } -extern "C" ISteamFriends *steam_rust_get_friends() { return SteamFriends(); } -extern "C" ISteamUser *steam_rust_get_user() { return SteamUser(); } -extern "C" ISteamGameServer *steam_rust_get_server() { return SteamGameServer(); } -extern "C" ISteamApps *steam_rust_get_server_apps() { return SteamGameServerApps(); }
\ No newline at end of file + ISteamClient* steam_rust_get_client() { return SteamClient(); } + ISteamMatchmaking* steam_rust_get_matchmaking() { return SteamMatchmaking(); } + ISteamUtils* steam_rust_get_utils() { return SteamUtils(); } + ISteamApps* steam_rust_get_apps() { return SteamApps(); } + ISteamFriends* steam_rust_get_friends() { return SteamFriends(); } + ISteamUser* steam_rust_get_user() { return SteamUser(); } + ISteamGameServer* steam_rust_get_server() { return SteamGameServer(); } + ISteamApps* steam_rust_get_server_apps() { return SteamGameServerApps(); } +}
\ No newline at end of file diff --git a/steamworks-sys/src/lib.rs b/steamworks-sys/src/lib.rs index 768cddc..b796f77 100644 --- a/steamworks-sys/src/lib.rs +++ b/steamworks-sys/src/lib.rs @@ -41,7 +41,6 @@ pub enum PersonaState { Max, } - #[repr(C)] pub enum LobbyType { Private = 0, @@ -235,32 +234,19 @@ pub enum SResult { LimitedUserAccount = 112, } +#[repr(C)] +pub struct CallbackData { + pub param_size: c_int, + pub userdata: *mut c_void, + pub run: unsafe extern "C" fn(*mut c_void, *mut c_void, *mut c_void), + pub run_extra: unsafe extern "C" fn(*mut c_void, *mut c_void, *mut c_void, bool, SteamAPICall), + pub dealloc: unsafe extern "C" fn(*mut c_void, *mut c_void), +} extern "C" { // Helpers from lib.cpp - - pub fn register_rust_steam_callback( - parameter_size: c_int, - userdata: *mut c_void, - run_func: extern "C" fn (*mut c_void, *mut c_void), - dealloc: extern "C" fn (*mut c_void), - callback_id: c_int, - game_server: c_int, - ) -> *mut c_void; - pub fn unregister_rust_steam_callback( - ty: *mut c_void, - ); - pub fn register_rust_steam_call_result( - parameter_size: c_int, - userdata: *mut c_void, - run_func: extern "C" fn (*mut c_void, *mut c_void, bool), - dealloc: extern "C" fn (*mut c_void), - api_call: SteamAPICall, - callback_id: c_int, - ) -> *mut c_void; - pub fn unregister_rust_steam_call_result( - ty: *mut c_void, - ); + pub fn create_rust_callback(flags: u8, id: c_int, data: CallbackData) -> *mut c_void; + pub fn delete_rust_callback(cb: *mut c_void); pub fn steam_rust_get_client() -> *mut ISteamClient; pub fn steam_rust_get_matchmaking() -> *mut ISteamMatchmaking; @@ -272,11 +258,16 @@ extern "C" { pub fn steam_rust_get_server_apps() -> *mut ISteamApps; pub fn steam_rust_game_server_init(ip: u32, steam_port: u16, game_port: u16, query_port: u16, server_mode: ServerMode, version: *const c_char) -> c_int; + // pub fn SteamAPI_Init() -> u8; pub fn SteamAPI_Shutdown(); pub fn SteamAPI_RunCallbacks(); + pub fn SteamAPI_RegisterCallback(pCallback: *mut c_void, id: c_int); + pub fn SteamAPI_UnregisterCallback(pCallback: *mut c_void); + pub fn SteamAPI_RegisterCallResult(pCallback: *mut c_void, api_call: SteamAPICall); + pub fn SteamAPI_UnregisterCallResult(pCallback: *mut c_void, api_call: SteamAPICall); pub fn SteamGameServer_Shutdown(); pub fn SteamGameServer_RunCallbacks(); |