From 767cdc1f6f6a63ce997fc9476911e2c361f9d402 Mon Sep 17 00:00:00 2001 From: LukePulverenti Date: Wed, 20 Feb 2013 20:33:05 -0500 Subject: Pushing missing changes --- .../Api/Logging/LogFileWebSocketListener.cs | 134 +++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 MediaBrowser.Common/Api/Logging/LogFileWebSocketListener.cs (limited to 'MediaBrowser.Common/Api/Logging/LogFileWebSocketListener.cs') diff --git a/MediaBrowser.Common/Api/Logging/LogFileWebSocketListener.cs b/MediaBrowser.Common/Api/Logging/LogFileWebSocketListener.cs new file mode 100644 index 000000000..335b77e0f --- /dev/null +++ b/MediaBrowser.Common/Api/Logging/LogFileWebSocketListener.cs @@ -0,0 +1,134 @@ +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Kernel; +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.IO; +using System.Linq; +using System.Threading.Tasks; + +namespace MediaBrowser.Common.Api.Logging +{ + /// + /// Class ScheduledTasksWebSocketListener + /// + [Export(typeof(IWebSocketListener))] + public class LogFileWebSocketListener : BasePeriodicWebSocketListener, LogFileWebSocketState> + { + /// + /// Gets the name. + /// + /// The name. + protected override string Name + { + get { return "LogFile"; } + } + + /// + /// Initializes the specified kernel. + /// + /// The kernel. + public override void Initialize(IKernel kernel) + { + base.Initialize(kernel); + + kernel.LoggerLoaded += kernel_LoggerLoaded; + } + + /// + /// Gets the data to send. + /// + /// The state. + /// IEnumerable{System.String}. + protected override async Task> GetDataToSend(LogFileWebSocketState state) + { + if (!string.Equals(Kernel.LogFilePath, state.LastLogFilePath)) + { + state.LastLogFilePath = Kernel.LogFilePath; + state.StartLine = 0; + } + + var lines = await GetLogLines(state.LastLogFilePath, state.StartLine).ConfigureAwait(false); + + state.StartLine += lines.Count; + + return lines; + } + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected override void Dispose(bool dispose) + { + if (dispose) + { + Kernel.LoggerLoaded -= kernel_LoggerLoaded; + } + base.Dispose(dispose); + } + + /// + /// Handles the LoggerLoaded event of the kernel control. + /// + /// The source of the event. + /// The instance containing the event data. + void kernel_LoggerLoaded(object sender, EventArgs e) + { + // Reset the startline for each connection whenever the logger reloads + lock (ActiveConnections) + { + foreach (var connection in ActiveConnections) + { + connection.Item4.StartLine = 0; + } + } + } + + /// + /// Gets the log lines. + /// + /// The log file path. + /// The start line. + /// Task{IEnumerable{System.String}}. + internal static async Task> GetLogLines(string logFilePath, int startLine) + { + var lines = new List(); + + using (var fs = new FileStream(logFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, StreamDefaults.DefaultFileStreamBufferSize, true)) + { + using (var reader = new StreamReader(fs)) + { + while (!reader.EndOfStream) + { + lines.Add(await reader.ReadLineAsync().ConfigureAwait(false)); + } + } + } + + if (startLine > 0) + { + lines = lines.Skip(startLine).ToList(); + } + + return lines; + } + } + + /// + /// Class LogFileWebSocketState + /// + public class LogFileWebSocketState + { + /// + /// Gets or sets the last log file path. + /// + /// The last log file path. + public string LastLogFilePath { get; set; } + /// + /// Gets or sets the start line. + /// + /// The start line. + public int StartLine { get; set; } + } +} -- cgit v1.2.3