// Copyright Epic Games, Inc. All Rights Reserved. namespace AndroidZenServerPlugin; using System.Runtime.InteropServices; public static class ZenServerAdapter { private static ConsoleRedirector? ConsoleRedirector; private static AndroidPortForwarder? AndroidPortForwarder; [UnmanagedCallersOnly(EntryPoint = "StartAndroidPortForwarder")] private static unsafe void StartAndroidPortForwarder(delegate* LogCallback, void* UsrPtr, IntPtr ADBExecutablePtr, uint Port) { ConsoleRedirector?.Dispose(); ConsoleRedirector = new ConsoleRedirector((Level, Line) => { IntPtr LinePtr = Marshal.StringToHGlobalAnsi(Line); try { LogCallback(UsrPtr, LogLevelToInt(Level), (char*)LinePtr); } finally { Marshal.FreeHGlobal(LinePtr); } }); string ADBExecutable = Marshal.PtrToStringAnsi(ADBExecutablePtr) ?? string.Empty; AndroidPortForwarder?.Dispose(); AndroidPortForwarder = new AndroidPortForwarder(); AndroidPortForwarder.StartMonitor(ADBExecutable, Port); } [UnmanagedCallersOnly(EntryPoint = "StopAndroidPortForwarder")] private static void StopAndroidPortForwarder() { AndroidPortForwarder?.Dispose(); AndroidPortForwarder = null; ConsoleRedirector?.Dispose(); ConsoleRedirector = null; } private static int LogLevelToInt(ConsoleRedirector.LogLevel Level) { return Level switch { ConsoleRedirector.LogLevel.Info => 0, ConsoleRedirector.LogLevel.Error => 1, _ => 0 }; } }