aboutsummaryrefslogtreecommitdiff
path: root/steamworks-sys
diff options
context:
space:
mode:
authorScetch <[email protected]>2018-03-10 14:27:22 -0500
committerMatthew Collins <[email protected]>2018-03-16 21:33:25 +0000
commite3f9fbbbd057713cad6921e45a95200a7e86ab02 (patch)
tree1b386cbb6cd3610980f3cb295cd307f182545d47 /steamworks-sys
parentReplace Cow<str> with String in the API (diff)
downloadsteamworks-rs-e3f9fbbbd057713cad6921e45a95200a7e86ab02.tar.xz
steamworks-rs-e3f9fbbbd057713cad6921e45a95200a7e86ab02.zip
Cleanup callback handling.
Diffstat (limited to 'steamworks-sys')
-rw-r--r--steamworks-sys/src/lib.cpp146
-rw-r--r--steamworks-sys/src/lib.rs39
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();