// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved. using System; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Security; using System.Runtime.InteropServices; using System.Runtime.InteropServices.Marshalling; namespace FlaxEngine { internal partial class DebugLogHandler : ILogHandler { /// /// Occurs on sending a log message. /// public event LogDelegate SendLog; /// /// Occurs on sending a log message. /// public event LogExceptionDelegate SendExceptionLog; /// public void LogWrite(LogType logType, string message) { Internal_LogWrite(logType, message); } /// public void LogException(Exception exception, Object context) { Internal_LogException(exception, Object.GetUnmanagedPtr(context)); SendExceptionLog?.Invoke(exception, context); } /// public void Log(LogType logType, Object context, string message) { if (message == null) return; #if BUILD_RELEASE string stackTrace = null; #else string stackTrace = Environment.StackTrace; #endif Internal_Log(logType, message, Object.GetUnmanagedPtr(context), stackTrace); SendLog?.Invoke(logType, message, context, stackTrace); } internal static void Internal_SendLog(LogType logType, string message, string stackTrace) { if (message == null) return; var logger = Debug.Logger; if (logger.IsLogTypeAllowed(logType)) { Internal_Log(logType, message, IntPtr.Zero, stackTrace); ((DebugLogHandler)logger.LogHandler).SendLog?.Invoke(logType, message, null, stackTrace); } } internal static void Internal_SendLogException(Exception exception) { Debug.Logger.LogException(exception); } [LibraryImport("FlaxEngine", EntryPoint = "DebugLogHandlerInternal_LogWrite", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] internal static partial void Internal_LogWrite(LogType level, string msg); [LibraryImport("FlaxEngine", EntryPoint = "DebugLogHandlerInternal_Log", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] internal static partial void Internal_Log(LogType level, string msg, IntPtr obj, string stackTrace); [LibraryImport("FlaxEngine", EntryPoint = "DebugLogHandlerInternal_LogException", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] internal static partial void Internal_LogException([MarshalUsing(typeof(Interop.ExceptionMarshaller))] Exception exception, IntPtr obj); [SecuritySafeCritical] public static string Internal_GetStackTrace() { var stackTrace = new StackTrace(1, true); return stackTrace.ToString(); } } }