aboutsummaryrefslogtreecommitdiff
path: root/steamworks-sys/src/lib.cpp
blob: 9994909e330bda4fc3695661db76787a89f9ee48 (plain) (blame)
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
#include <steam_api.h>

class RustSteamCallback final : CCallbackBase {
public:
  RustSteamCallback(int parameter_size, void *userdata,
                    void (*run_func)(void *, void *), void (*dealloc)(void *),
                    int callback_id)
      : parameter_size(parameter_size), userdata(userdata), run_func(run_func),
        dealloc(dealloc) {
    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 *);
};

extern "C" void *register_rust_steam_callback(int parameter_size,
                                              void *userdata,
                                              void (*run_func)(void *, void *),
                                              void (*dealloc)(void *),
                                              int callback_id) {
  return new RustSteamCallback(parameter_size, userdata, run_func, dealloc,
                               callback_id);
}

extern "C" void unregister_rust_steam_callback(void *ty) {
  RustSteamCallback *cb = static_cast<RustSteamCallback *>(ty);
  delete cb;
}

class RustSteamCallResult 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);
  }

  virtual void Run(void *pvParam) {
    run_func(userdata, pvParam, false);
    delete this;
  }

  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;
    }
  }

  virtual int GetCallbackSizeBytes() { return parameter_size; }

private:
  int parameter_size;
  void *userdata;
  void (*run_func)(void *, void *, bool);
  void (*dealloc)(void *);
  SteamAPICall_t api_call;
};

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 unregister_rust_steam_call_result(void *ty) {
  RustSteamCallResult *cb = static_cast<RustSteamCallResult *>(ty);
  delete cb;
}

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(); }