forked from nkast/MonoGame
-
-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathConsoleAsyncLogger.cs
164 lines (139 loc) · 4.77 KB
/
ConsoleAsyncLogger.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
// Copyright (C)2022 Nick Kastellanos
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework.Content.Pipeline;
namespace Microsoft.Xna.Framework.Content.Pipeline.Builder
{
internal class ConsoleAsyncLogger : ConsoleLogger
{
private ConsoleLogger _logger;
Queue<ICmd> _commandQueue = new Queue<ICmd>();
private bool _immediate = false;
public bool Immediate
{
get { return _immediate; }
set
{
if (value != _immediate)
{
if (_immediate) Flush();
_immediate = value;
}
}
}
public ConsoleAsyncLogger(ConsoleLogger logger)
{
this._logger = logger;
}
//public override string LoggerRootDirectory
//{
// get { return _logger.LoggerRootDirectory; }
// set { throw new InvalidOperationException(); }
//}
public override void LogImportantMessage(string message, params object[] messageArgs)
{
Enqueue(new LogImportantMessageCmd(message, messageArgs));
}
public override void LogMessage(string message, params object[] messageArgs)
{
Enqueue(new LogMessageCmd(message, messageArgs));
}
public override void LogWarning(string helpLink, ContentIdentity contentIdentity, string message, params object[] messageArgs)
{
Enqueue(new LogWarningCmd(helpLink, contentIdentity, message, messageArgs));
}
public override void PushFile(string filename)
{
Enqueue(new PushFileCmd(filename));
}
public override void PopFile()
{
Enqueue(new PopFileCmd());
}
public override void Indent()
{
Enqueue(new IndentCmd());
}
public override void Unindent()
{
Enqueue(new UnindentCmd());
}
private void Enqueue(ICmd cmd)
{
_commandQueue.Enqueue(cmd);
if (Immediate) Flush();
}
internal void Flush()
{
while(_commandQueue.Count>0)
{
var cmd = _commandQueue.Dequeue();
cmd.Execute(_logger);
}
}
#region command queue
interface ICmd
{
void Execute(ConsoleLogger reciever);
}
class LogImportantMessageCmd : ICmd
{
private string message;
private object[] messageArgs;
public LogImportantMessageCmd(string message, object[] messageArgs)
{
this.message = message;
this.messageArgs = messageArgs;
}
public void Execute(ConsoleLogger reciever) { reciever.LogImportantMessage(message, messageArgs); }
}
class LogMessageCmd : ICmd
{
private string message;
private object[] messageArgs;
public LogMessageCmd(string message, object[] messageArgs)
{
this.message = message;
this.messageArgs = messageArgs;
}
public void Execute(ConsoleLogger reciever) { reciever.LogMessage(message, messageArgs); }
}
class LogWarningCmd : ICmd
{
private string helpLink;
private ContentIdentity contentIdentity;
private string message;
private object[] messageArgs;
public LogWarningCmd(string helpLink, ContentIdentity contentIdentity, string message, object[] messageArgs)
{
this.helpLink = helpLink;
this.contentIdentity = contentIdentity;
this.message = message;
this.messageArgs = messageArgs;
}
public void Execute(ConsoleLogger reciever) { reciever.LogWarning(helpLink, contentIdentity, message, messageArgs); }
}
class PushFileCmd: ICmd
{
private string filename;
public PushFileCmd(string filename) { this.filename = filename; }
public void Execute(ConsoleLogger reciever) { reciever.PushFile(filename); }
}
class PopFileCmd : ICmd
{
public PopFileCmd() { }
public void Execute(ConsoleLogger reciever) { reciever.PopFile(); }
}
class IndentCmd : ICmd
{
public IndentCmd() { }
public void Execute(ConsoleLogger reciever) { reciever.Indent(); }
}
class UnindentCmd : ICmd
{
public UnindentCmd() { }
public void Execute(ConsoleLogger reciever) { reciever.Unindent(); }
}
#endregion
}
}