using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
namespace OpenVIII
{
///
/// Attempt at a log class.
///
public class Log : TextWriter
{
#region Fields
private FileStream _fs;
private StreamWriter _log;
#endregion Fields
#region Constructors
public Log()
{
_fs = new FileStream("log.txt", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
_log = new StreamWriter(_fs, System.Text.Encoding.UTF8)
{ AutoFlush = true };
}
#endregion Constructors
#region Destructors
~Log()
{
Dispose(true);
}
#endregion Destructors
#region Properties
///
/// If Disabled the log.txt will be empty. and Async writes will be null.
///
public bool Enabled { get; set; } = true;
public override System.Text.Encoding Encoding => _log.Encoding;
#endregion Properties
#region Methods
[ComVisible(false)]
public override void Close() => _log.Close();
[ComVisible(false)]
public override void Flush() => _log.Flush();
public override void Write(char value)
{
if (Enabled) _log.Write(value);
else Debug.Write(value);
}
public override void Write(char[] buffer, int index, int count)
{
if (Enabled) _log.Write(buffer, index, count);
else Debug.Write(new string(buffer.Skip(index).Take(count).ToArray()));
}
public override void Write(string value)
{
if (Enabled) _log.Write(value);
else Debug.Write(value);
}
public override void Write(char[] buffer)
{
if (Enabled) _log.Write(buffer);
else Debug.Write(buffer);
}
[ComVisible(false)]
public override Task WriteAsync(char value) => !Enabled ? null : _log.WriteAsync(value);
[ComVisible(false)]
public override Task WriteAsync(string value) => !Enabled ? null : _log.WriteAsync(value);
[ComVisible(false)]
public override Task WriteAsync(char[] buffer, int index, int count) => !Enabled ? null : _log.WriteAsync(buffer, index, count);
public override void WriteLine(string value) => base.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:{Task.CurrentId}:{value}");
[ComVisible(false)]
public override Task WriteLineAsync() => !Enabled ? null : _log.WriteLineAsync();
[ComVisible(false)]
public override Task WriteLineAsync(char value) => !Enabled ? null : _log.WriteLineAsync(value);
[ComVisible(false)]
public override Task WriteLineAsync(string value) => !Enabled ? null : _log.WriteLineAsync(value);
[ComVisible(false)]
public override Task WriteLineAsync(char[] buffer, int index, int count) => !Enabled ? null : _log.WriteLineAsync(buffer, index, count);
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
//log?.Close();
//log?.Dispose();
_log = null;
_fs?.Close();
_fs?.Dispose();
_fs = null;
}
#endregion Methods
}
}