// Copyright Epic Games, Inc. All Rights Reserved. using System; using System.Runtime.InteropServices; namespace EpicGames.UBA.Impl { internal class ServerImpl : IServer { nint _handle = IntPtr.Zero; readonly ILogger _logger; #region DllImport [DllImport("UbaHost", CharSet = CharSet.Auto)] static extern nint NetworkServer_Create(nint logger, int workerCount, int sendSize, int receiveTimeoutSeconds, byte useQuic); [DllImport("UbaHost", CharSet = CharSet.Auto)] static extern void NetworkServer_Destroy(nint server); // Server Imports [DllImport("UbaHost", CharSet = CharSet.Auto)] static extern byte NetworkServer_StartListen(nint server, int port, string ip, string crypto); [DllImport("UbaHost", CharSet = CharSet.Auto)] static extern byte NetworkServer_AddClient(nint server, string ip, int port, string crypto); [DllImport("UbaHost", CharSet = CharSet.Auto)] static extern byte NetworkServer_AddNamedConnection(nint server, string name); [DllImport("UbaHost", CharSet = CharSet.Auto)] static extern byte NetworkServer_Stop(nint server); const int DEFAULT_PORT = 1345; #endregion public ServerImpl(int maxWorkers, int sendSize, ILogger logger, bool useQuic) { _logger = logger; int receiveTimeoutSeconds = 10 * 60; // 10 minutes. This should never happen _handle = NetworkServer_Create(_logger.GetHandle(), maxWorkers, sendSize, receiveTimeoutSeconds, (byte)(useQuic?1:0)); } #region IDisposable ~ServerImpl() => Dispose(false); /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { } if (_handle != IntPtr.Zero) { NetworkServer_Destroy(_handle); _handle = IntPtr.Zero; } } #endregion #region IServer /// public nint GetHandle() => _handle; /// public bool StartServer(string ip = "", int port = -1, string crypto = "") => NetworkServer_StartListen(_handle, port > 0 ? port : DEFAULT_PORT, ip, crypto) != 0; /// public void StopServer() => NetworkServer_Stop(_handle); /// public bool AddClient(string ip, int port, string crypto = "") => NetworkServer_AddClient(_handle, ip, port, crypto) != 0; /// public bool AddNamedConnection(string name) => NetworkServer_AddNamedConnection(_handle, name) != 0; #endregion } }