summaryrefslogtreecommitdiff
path: root/Assembly_Firstpass/Steamworks/ISteamMatchmakingRulesResponse.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assembly_Firstpass/Steamworks/ISteamMatchmakingRulesResponse.cs')
-rw-r--r--Assembly_Firstpass/Steamworks/ISteamMatchmakingRulesResponse.cs102
1 files changed, 102 insertions, 0 deletions
diff --git a/Assembly_Firstpass/Steamworks/ISteamMatchmakingRulesResponse.cs b/Assembly_Firstpass/Steamworks/ISteamMatchmakingRulesResponse.cs
new file mode 100644
index 0000000..b29b777
--- /dev/null
+++ b/Assembly_Firstpass/Steamworks/ISteamMatchmakingRulesResponse.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace Steamworks;
+
+public class ISteamMatchmakingRulesResponse
+{
+ public delegate void RulesResponded(string pchRule, string pchValue);
+
+ public delegate void RulesFailedToRespond();
+
+ public delegate void RulesRefreshComplete();
+
+ [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ public delegate void InternalRulesResponded(IntPtr pchRule, IntPtr pchValue);
+
+ [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ public delegate void InternalRulesFailedToRespond();
+
+ [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ public delegate void InternalRulesRefreshComplete();
+
+ [StructLayout(LayoutKind.Sequential)]
+ private class VTable
+ {
+ [NonSerialized]
+ [MarshalAs(UnmanagedType.FunctionPtr)]
+ public InternalRulesResponded m_VTRulesResponded;
+
+ [NonSerialized]
+ [MarshalAs(UnmanagedType.FunctionPtr)]
+ public InternalRulesFailedToRespond m_VTRulesFailedToRespond;
+
+ [NonSerialized]
+ [MarshalAs(UnmanagedType.FunctionPtr)]
+ public InternalRulesRefreshComplete m_VTRulesRefreshComplete;
+ }
+
+ private VTable m_VTable;
+
+ private IntPtr m_pVTable;
+
+ private GCHandle m_pGCHandle;
+
+ private RulesResponded m_RulesResponded;
+
+ private RulesFailedToRespond m_RulesFailedToRespond;
+
+ private RulesRefreshComplete m_RulesRefreshComplete;
+
+ public ISteamMatchmakingRulesResponse(RulesResponded onRulesResponded, RulesFailedToRespond onRulesFailedToRespond, RulesRefreshComplete onRulesRefreshComplete)
+ {
+ if (onRulesResponded == null || onRulesFailedToRespond == null || onRulesRefreshComplete == null)
+ {
+ throw new ArgumentNullException();
+ }
+ m_RulesResponded = onRulesResponded;
+ m_RulesFailedToRespond = onRulesFailedToRespond;
+ m_RulesRefreshComplete = onRulesRefreshComplete;
+ m_VTable = new VTable
+ {
+ m_VTRulesResponded = InternalOnRulesResponded,
+ m_VTRulesFailedToRespond = InternalOnRulesFailedToRespond,
+ m_VTRulesRefreshComplete = InternalOnRulesRefreshComplete
+ };
+ m_pVTable = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VTable)));
+ Marshal.StructureToPtr(m_VTable, m_pVTable, fDeleteOld: false);
+ m_pGCHandle = GCHandle.Alloc(m_pVTable, GCHandleType.Pinned);
+ }
+
+ ~ISteamMatchmakingRulesResponse()
+ {
+ if (m_pVTable != IntPtr.Zero)
+ {
+ Marshal.FreeHGlobal(m_pVTable);
+ }
+ if (m_pGCHandle.IsAllocated)
+ {
+ m_pGCHandle.Free();
+ }
+ }
+
+ private void InternalOnRulesResponded(IntPtr pchRule, IntPtr pchValue)
+ {
+ m_RulesResponded(InteropHelp.PtrToStringUTF8(pchRule), InteropHelp.PtrToStringUTF8(pchValue));
+ }
+
+ private void InternalOnRulesFailedToRespond()
+ {
+ m_RulesFailedToRespond();
+ }
+
+ private void InternalOnRulesRefreshComplete()
+ {
+ m_RulesRefreshComplete();
+ }
+
+ public static explicit operator IntPtr(ISteamMatchmakingRulesResponse that)
+ {
+ return that.m_pGCHandle.AddrOfPinnedObject();
+ }
+}