using System; namespace StardewModdingAPI.Framework.Logging { /// Manages console output interception. internal class ConsoleInterceptionManager : IDisposable { /********* ** Fields *********/ /// The intercepting console writer. private readonly InterceptingTextWriter Output; /********* ** Accessors *********/ /// The event raised when a message is written to the console directly. public event Action OnMessageIntercepted; /********* ** Public methods *********/ /// Construct an instance. public ConsoleInterceptionManager() { // redirect output through interceptor this.Output = new InterceptingTextWriter(Console.Out); this.Output.OnMessageIntercepted += line => this.OnMessageIntercepted?.Invoke(line); Console.SetOut(this.Output); } /// Get an exclusive lock and write to the console output without interception. /// The action to perform within the exclusive write block. public void ExclusiveWriteWithoutInterception(Action action) { lock (Console.Out) { try { this.Output.ShouldIntercept = false; action(); } finally { this.Output.ShouldIntercept = true; } } } /// Release all resources. public void Dispose() { Console.SetOut(this.Output.Out); this.Output.Dispose(); } } }