summaryrefslogtreecommitdiffstats
path: root/samples/OpenIdOfflineProvider/TextLogProvider.cs
blob: c927a434b72ef38c41251f06b9f267037fbd1ee5 (plain)
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
namespace DotNetOpenAuth.OpenIdOfflineProvider {
	using System;
	using System.IO;
	using System.Text.RegularExpressions;
	using System.Threading;

	using DotNetOpenAuth.Logging;

	/// <summary>
	/// Sends logging events to a <see cref="TextWriter"/>.
	/// </summary>
	/// <remarks>
	/// <para>
	/// An Appender that writes to a <see cref="TextWriter"/>.
	/// </para>
	/// <para>
	/// This appender may be used stand alone if initialized with an appropriate
	/// writer, however it is typically used as a base class for an appender that
	/// can open a <see cref="TextWriter"/> to write to.
	/// </para>
	/// </remarks>
	/// <author>Nicko Cadell</author>
	/// <author>Gert Driesen</author>
	/// <author>Douglas de la Torre</author>
	internal class TextWriterLogProvider : ILogProvider {
		private readonly TextBoxTextWriter _writer;

		private static bool _providerIsAvailableOverride = true;

		internal TextWriterLogProvider(TextBoxTextWriter writer) {
			_writer = writer;
		}

		/// <summary>
		/// Gets or sets a value indicating whether [provider is available override]. Used in tests.
		/// </summary>
		/// <value>
		/// <c>true</c> if [provider is available override]; otherwise, <c>false</c>.
		/// </value>
		public static bool ProviderIsAvailableOverride {
			get { return _providerIsAvailableOverride; }
			set { _providerIsAvailableOverride = value; }
		}

		public ILog GetLogger(string name) {
			return new TextWriterLogger(_writer);
		}

		public class TextWriterLogger : ILog {
			private readonly int _skipLevel;
			private TextWriter _writer;
			private ITextWriterFormatter _textWriterFormatter;
			private IDateTimeProvider _dateTimeProvider;

			internal TextWriterLogger(TextBoxTextWriter writer) {
				_writer = writer;
				_skipLevel = 1;
				this.DateTimeProvider = new UtcDateTimeProvider();
				this.TextWriterFormatter = new DefaultTextWriterFormatter();
			}

			public TextWriter Writer {
				get {
					return _writer;
				}

				set {
					_writer = value;
				}
			}

			public ITextWriterFormatter TextWriterFormatter {
				get {
					return _textWriterFormatter;
				}
				set {
					if (value == null)
						throw new ArgumentNullException();
					_textWriterFormatter = value;
				}
			}

			public IDateTimeProvider DateTimeProvider {
				get {
					return _dateTimeProvider;
				}
				set {
					if (value == null)
						throw new ArgumentNullException();
					_dateTimeProvider = value;
				}
			}
			public bool Log(LogLevel logLevel, Func<string> messageFunc, Exception exception) {
				if (messageFunc == null) {
					//nothing to log..
					return true;
				}
				string[] lines = Regex.Split(messageFunc(), "\r\n|\r|\n");
				foreach (var line in lines) {
					this.TextWriterFormatter.WriteText(_writer, logLevel, this.DateTimeProvider.GetCurrentDateTime(), line);
				}
				_writer.Flush();
				return true;
			}
			public interface IDateTimeProvider {
				DateTime GetCurrentDateTime();
			}
			public interface ITextWriterFormatter {
				void WriteText(TextWriter writer, LogLevel level, DateTime dateTime, string text);
			}
			public class DefaultTextWriterFormatter : ITextWriterFormatter {
				public void WriteText(TextWriter writer, LogLevel level, DateTime dateTime, string text) {
					string sLevel;
					switch (level) {
						case LogLevel.Info:
						default:
							sLevel = "I";
							break;

						case LogLevel.Debug:
							sLevel = "D";
							break;

						case LogLevel.Warn:
							sLevel = "W";
							break;

						case LogLevel.Error:
							sLevel = "E";
							break;
					}

					writer.WriteLine("{0}:{1} {2} [{4}]: {3}",
						sLevel, dateTime.ToShortDateString(), dateTime.ToLongTimeString(),
						text, Thread.CurrentThread.GetHashCode());
				}
			}
			public class UtcDateTimeProvider : IDateTimeProvider {
				public DateTime GetCurrentDateTime() {
					return DateTime.UtcNow;
				}
			}
		}
	}
}