diff options
Diffstat (limited to 'Assembly_Firstpass/Steamworks/ISteamMatchmakingServerListResponse.cs')
-rw-r--r-- | Assembly_Firstpass/Steamworks/ISteamMatchmakingServerListResponse.cs | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/Assembly_Firstpass/Steamworks/ISteamMatchmakingServerListResponse.cs b/Assembly_Firstpass/Steamworks/ISteamMatchmakingServerListResponse.cs new file mode 100644 index 0000000..367aa45 --- /dev/null +++ b/Assembly_Firstpass/Steamworks/ISteamMatchmakingServerListResponse.cs @@ -0,0 +1,123 @@ +using System; +using System.Runtime.InteropServices; + +namespace Steamworks; + +public class ISteamMatchmakingServerListResponse +{ + public delegate void ServerResponded(HServerListRequest hRequest, int iServer); + + public delegate void ServerFailedToRespond(HServerListRequest hRequest, int iServer); + + public delegate void RefreshComplete(HServerListRequest hRequest, EMatchMakingServerResponse response); + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + private delegate void InternalServerResponded(HServerListRequest hRequest, int iServer); + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + private delegate void InternalServerFailedToRespond(HServerListRequest hRequest, int iServer); + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + private delegate void InternalRefreshComplete(HServerListRequest hRequest, EMatchMakingServerResponse response); + + [StructLayout(LayoutKind.Sequential)] + private class VTable + { + [NonSerialized] + [MarshalAs(UnmanagedType.FunctionPtr)] + public InternalServerResponded m_VTServerResponded; + + [NonSerialized] + [MarshalAs(UnmanagedType.FunctionPtr)] + public InternalServerFailedToRespond m_VTServerFailedToRespond; + + [NonSerialized] + [MarshalAs(UnmanagedType.FunctionPtr)] + public InternalRefreshComplete m_VTRefreshComplete; + } + + private VTable m_VTable; + + private IntPtr m_pVTable; + + private GCHandle m_pGCHandle; + + private ServerResponded m_ServerResponded; + + private ServerFailedToRespond m_ServerFailedToRespond; + + private RefreshComplete m_RefreshComplete; + + public ISteamMatchmakingServerListResponse(ServerResponded onServerResponded, ServerFailedToRespond onServerFailedToRespond, RefreshComplete onRefreshComplete) + { + if (onServerResponded == null || onServerFailedToRespond == null || onRefreshComplete == null) + { + throw new ArgumentNullException(); + } + m_ServerResponded = onServerResponded; + m_ServerFailedToRespond = onServerFailedToRespond; + m_RefreshComplete = onRefreshComplete; + m_VTable = new VTable + { + m_VTServerResponded = InternalOnServerResponded, + m_VTServerFailedToRespond = InternalOnServerFailedToRespond, + m_VTRefreshComplete = InternalOnRefreshComplete + }; + m_pVTable = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VTable))); + Marshal.StructureToPtr(m_VTable, m_pVTable, fDeleteOld: false); + m_pGCHandle = GCHandle.Alloc(m_pVTable, GCHandleType.Pinned); + } + + ~ISteamMatchmakingServerListResponse() + { + if (m_pVTable != IntPtr.Zero) + { + Marshal.FreeHGlobal(m_pVTable); + } + if (m_pGCHandle.IsAllocated) + { + m_pGCHandle.Free(); + } + } + + private void InternalOnServerResponded(HServerListRequest hRequest, int iServer) + { + try + { + m_ServerResponded(hRequest, iServer); + } + catch (Exception e) + { + CallbackDispatcher.ExceptionHandler(e); + } + } + + private void InternalOnServerFailedToRespond(HServerListRequest hRequest, int iServer) + { + try + { + m_ServerFailedToRespond(hRequest, iServer); + } + catch (Exception e) + { + CallbackDispatcher.ExceptionHandler(e); + } + } + + private void InternalOnRefreshComplete(HServerListRequest hRequest, EMatchMakingServerResponse response) + { + try + { + m_RefreshComplete(hRequest, response); + } + catch (Exception e) + { + CallbackDispatcher.ExceptionHandler(e); + } + } + + public static explicit operator IntPtr(ISteamMatchmakingServerListResponse that) + { + return that.m_pGCHandle.AddrOfPinnedObject(); + } +} |