diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-10-29 00:10:11 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-10-29 00:10:11 -0400 |
| commit | ce38e987910b4badb4c40844786449458b2d3229 (patch) | |
| tree | fda30efcbfd2ebd70bd8348f19e76a8941f67e40 /MediaBrowser.Common.Implementations | |
| parent | 9c6da95d6a5dce333fb66a58d73f7655f3a4d6ce (diff) | |
move common dependencies
Diffstat (limited to 'MediaBrowser.Common.Implementations')
12 files changed, 12 insertions, 1362 deletions
diff --git a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs index 3b1499419..4b9d78c9c 100644 --- a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs +++ b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs @@ -17,8 +17,6 @@ using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Updates; -using ServiceStack; -using SimpleInjector; using System; using System.Collections.Generic; using System.IO; @@ -41,7 +39,7 @@ namespace MediaBrowser.Common.Implementations /// Class BaseApplicationHost /// </summary> /// <typeparam name="TApplicationPathsType">The type of the T application paths type.</typeparam> - public abstract class BaseApplicationHost<TApplicationPathsType> : IApplicationHost, IDependencyContainer + public abstract class BaseApplicationHost<TApplicationPathsType> : IApplicationHost where TApplicationPathsType : class, IApplicationPaths { /// <summary> @@ -85,11 +83,6 @@ namespace MediaBrowser.Common.Implementations protected TApplicationPathsType ApplicationPaths { get; private set; } /// <summary> - /// The container - /// </summary> - protected readonly Container Container = new Container(); - - /// <summary> /// The json serializer /// </summary> public IJsonSerializer JsonSerializer { get; private set; } @@ -223,15 +216,6 @@ namespace MediaBrowser.Common.Implementations /// <returns>Task.</returns> public virtual async Task Init(IProgress<double> progress) { - try - { - // https://github.com/ServiceStack/ServiceStack/blob/master/tests/ServiceStack.WebHost.IntegrationTests/Web.config#L4 - Licensing.RegisterLicense("1001-e1JlZjoxMDAxLE5hbWU6VGVzdCBCdXNpbmVzcyxUeXBlOkJ1c2luZXNzLEhhc2g6UHVNTVRPclhvT2ZIbjQ5MG5LZE1mUTd5RUMzQnBucTFEbTE3TDczVEF4QUNMT1FhNXJMOWkzVjFGL2ZkVTE3Q2pDNENqTkQyUktRWmhvUVBhYTBiekJGUUZ3ZE5aZHFDYm9hL3lydGlwUHI5K1JsaTBYbzNsUC85cjVJNHE5QVhldDN6QkE4aTlvdldrdTgyTk1relY2eis2dFFqTThYN2lmc0JveHgycFdjPSxFeHBpcnk6MjAxMy0wMS0wMX0="); - } - catch - { - // Failing under mono - } progress.Report(1); JsonSerializer = CreateJsonSerializer(); @@ -328,10 +312,7 @@ namespace MediaBrowser.Common.Implementations return builder; } - protected virtual IJsonSerializer CreateJsonSerializer() - { - return new JsonSerializer(FileSystemManager, LogManager.GetLogger("JsonSerializer")); - } + protected abstract IJsonSerializer CreateJsonSerializer(); private void SetHttpLimit() { @@ -424,8 +405,6 @@ namespace MediaBrowser.Common.Implementations /// </summary> protected virtual void FindParts() { - RegisterModules(); - ConfigurationManager.AddParts(GetExports<IConfigurationFactory>()); Plugins = GetExports<IPlugin>().Select(LoadPlugin).Where(i => i != null).ToArray(); } @@ -525,25 +504,6 @@ namespace MediaBrowser.Common.Implementations return Task.FromResult(true); } - private void RegisterModules() - { - var moduleTypes = GetExportTypes<IDependencyModule>(); - - foreach (var type in moduleTypes) - { - try - { - var instance = Activator.CreateInstance(type) as IDependencyModule; - if (instance != null) - instance.BindDependencies(this); - } - catch (Exception ex) - { - Logger.ErrorException("Error setting up dependency bindings for " + type.Name, ex); - } - } - } - /// <summary> /// Gets a list of types within an assembly /// This will handle situations that would normally throw an exception - such as a type within the assembly that depends on some other non-existant reference @@ -584,43 +544,14 @@ namespace MediaBrowser.Common.Implementations /// </summary> /// <param name="type">The type.</param> /// <returns>System.Object.</returns> - public object CreateInstance(Type type) - { - try - { - return Container.GetInstance(type); - } - catch (Exception ex) - { - Logger.ErrorException("Error creating {0}", ex, type.FullName); - - throw; - } - } + public abstract object CreateInstance(Type type); /// <summary> /// Creates the instance safe. /// </summary> /// <param name="type">The type.</param> /// <returns>System.Object.</returns> - protected object CreateInstanceSafe(Type type) - { - try - { - return Container.GetInstance(type); - } - catch (Exception ex) - { - Logger.ErrorException("Error creating {0}", ex, type.FullName); - // Don't blow up in release mode - return null; - } - } - - void IDependencyContainer.RegisterSingleInstance<T>(T obj, bool manageLifetime) - { - RegisterSingleInstance(obj, manageLifetime); - } + protected abstract object CreateInstanceSafe(Type type); /// <summary> /// Registers the specified obj. @@ -628,68 +559,30 @@ namespace MediaBrowser.Common.Implementations /// <typeparam name="T"></typeparam> /// <param name="obj">The obj.</param> /// <param name="manageLifetime">if set to <c>true</c> [manage lifetime].</param> - protected void RegisterSingleInstance<T>(T obj, bool manageLifetime = true) - where T : class - { - Container.RegisterSingleton(obj); - - if (manageLifetime) - { - var disposable = obj as IDisposable; - - if (disposable != null) - { - DisposableParts.Add(disposable); - } - } - } - - void IDependencyContainer.RegisterSingleInstance<T>(Func<T> func) - { - RegisterSingleInstance(func); - } + protected abstract void RegisterSingleInstance<T>(T obj, bool manageLifetime = true) + where T : class; /// <summary> /// Registers the single instance. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="func">The func.</param> - protected void RegisterSingleInstance<T>(Func<T> func) - where T : class - { - Container.RegisterSingleton(func); - } - - void IDependencyContainer.Register(Type typeInterface, Type typeImplementation) - { - Container.Register(typeInterface, typeImplementation); - } + protected abstract void RegisterSingleInstance<T>(Func<T> func) + where T : class; /// <summary> /// Resolves this instance. /// </summary> /// <typeparam name="T"></typeparam> /// <returns>``0.</returns> - public T Resolve<T>() - { - return (T)Container.GetRegistration(typeof(T), true).GetInstance(); - } + public abstract T Resolve<T>(); /// <summary> /// Resolves this instance. /// </summary> /// <typeparam name="T"></typeparam> /// <returns>``0.</returns> - public T TryResolve<T>() - { - var result = Container.GetRegistration(typeof(T), false); - - if (result == null) - { - return default(T); - } - return (T)result.GetInstance(); - } + public abstract T TryResolve<T>(); /// <summary> /// Loads the assembly. diff --git a/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs b/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs index dd7a10b1a..7c1302ff6 100644 --- a/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs +++ b/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs @@ -11,7 +11,6 @@ using System.Linq; using System.Threading; using MediaBrowser.Model.IO; using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.IO; namespace MediaBrowser.Common.Implementations.Configuration { diff --git a/MediaBrowser.Common.Implementations/Devices/DeviceId.cs b/MediaBrowser.Common.Implementations/Devices/DeviceId.cs index a43697c7b..40bbe8713 100644 --- a/MediaBrowser.Common.Implementations/Devices/DeviceId.cs +++ b/MediaBrowser.Common.Implementations/Devices/DeviceId.cs @@ -3,7 +3,6 @@ using MediaBrowser.Model.Logging; using System; using System.IO; using System.Text; -using MediaBrowser.Common.IO; using MediaBrowser.Model.IO; namespace MediaBrowser.Common.Implementations.Devices diff --git a/MediaBrowser.Common.Implementations/IO/LnkShortcutHandler.cs b/MediaBrowser.Common.Implementations/IO/LnkShortcutHandler.cs deleted file mode 100644 index 441e6939f..000000000 --- a/MediaBrowser.Common.Implementations/IO/LnkShortcutHandler.cs +++ /dev/null @@ -1,399 +0,0 @@ -using System; -using System.IO; -using System.Runtime.InteropServices; -using System.Security; -using System.Text; -using MediaBrowser.Model.IO; - -namespace MediaBrowser.Common.Implementations.IO -{ - public class LnkShortcutHandler :IShortcutHandler - { - public string Extension - { - get { return ".lnk"; } - } - - public string Resolve(string shortcutPath) - { - var link = new ShellLink(); - ((IPersistFile)link).Load(shortcutPath, NativeMethods.STGM_READ); - // ((IShellLinkW)link).Resolve(hwnd, 0) - var sb = new StringBuilder(NativeMethods.MAX_PATH); - WIN32_FIND_DATA data; - ((IShellLinkW)link).GetPath(sb, sb.Capacity, out data, 0); - return sb.ToString(); - } - - public void Create(string shortcutPath, string targetPath) - { - throw new NotImplementedException(); - } - } - - /// <summary> - /// Class NativeMethods - /// </summary> - [SuppressUnmanagedCodeSecurity] - public static class NativeMethods - { - /// <summary> - /// The MA x_ PATH - /// </summary> - public const int MAX_PATH = 260; - /// <summary> - /// The MA x_ ALTERNATE - /// </summary> - public const int MAX_ALTERNATE = 14; - /// <summary> - /// The INVALI d_ HANDL e_ VALUE - /// </summary> - public static IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); - /// <summary> - /// The STG m_ READ - /// </summary> - public const uint STGM_READ = 0; - } - - /// <summary> - /// Struct FILETIME - /// </summary> - [StructLayout(LayoutKind.Sequential)] - public struct FILETIME - { - /// <summary> - /// The dw low date time - /// </summary> - public uint dwLowDateTime; - /// <summary> - /// The dw high date time - /// </summary> - public uint dwHighDateTime; - } - - /// <summary> - /// Struct WIN32_FIND_DATA - /// </summary> - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - public struct WIN32_FIND_DATA - { - /// <summary> - /// The dw file attributes - /// </summary> - public FileAttributes dwFileAttributes; - /// <summary> - /// The ft creation time - /// </summary> - public FILETIME ftCreationTime; - /// <summary> - /// The ft last access time - /// </summary> - public FILETIME ftLastAccessTime; - /// <summary> - /// The ft last write time - /// </summary> - public FILETIME ftLastWriteTime; - /// <summary> - /// The n file size high - /// </summary> - public int nFileSizeHigh; - /// <summary> - /// The n file size low - /// </summary> - public int nFileSizeLow; - /// <summary> - /// The dw reserved0 - /// </summary> - public int dwReserved0; - /// <summary> - /// The dw reserved1 - /// </summary> - public int dwReserved1; - - /// <summary> - /// The c file name - /// </summary> - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NativeMethods.MAX_PATH)] - public string cFileName; - - /// <summary> - /// This will always be null when FINDEX_INFO_LEVELS = basic - /// </summary> - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NativeMethods.MAX_ALTERNATE)] - public string cAlternate; - - /// <summary> - /// Gets or sets the path. - /// </summary> - /// <value>The path.</value> - public string Path { get; set; } - - /// <summary> - /// Returns a <see cref="System.String" /> that represents this instance. - /// </summary> - /// <returns>A <see cref="System.String" /> that represents this instance.</returns> - public override string ToString() - { - return Path ?? string.Empty; - } - } - - /// <summary> - /// Enum SLGP_FLAGS - /// </summary> - [Flags] - public enum SLGP_FLAGS - { - /// <summary> - /// Retrieves the standard short (8.3 format) file name - /// </summary> - SLGP_SHORTPATH = 0x1, - /// <summary> - /// Retrieves the Universal Naming Convention (UNC) path name of the file - /// </summary> - SLGP_UNCPRIORITY = 0x2, - /// <summary> - /// Retrieves the raw path name. A raw path is something that might not exist and may include environment variables that need to be expanded - /// </summary> - SLGP_RAWPATH = 0x4 - } - /// <summary> - /// Enum SLR_FLAGS - /// </summary> - [Flags] - public enum SLR_FLAGS - { - /// <summary> - /// Do not display a dialog box if the link cannot be resolved. When SLR_NO_UI is set, - /// the high-order word of fFlags can be set to a time-out value that specifies the - /// maximum amount of time to be spent resolving the link. The function returns if the - /// link cannot be resolved within the time-out duration. If the high-order word is set - /// to zero, the time-out duration will be set to the default value of 3,000 milliseconds - /// (3 seconds). To specify a value, set the high word of fFlags to the desired time-out - /// duration, in milliseconds. - /// </summary> - SLR_NO_UI = 0x1, - /// <summary> - /// Obsolete and no longer used - /// </summary> - SLR_ANY_MATCH = 0x2, - /// <summary> - /// If the link object has changed, update its path and list of identifiers. - /// If SLR_UPDATE is set, you do not need to call IPersistFile::IsDirty to determine - /// whether or not the link object has changed. - /// </summary> - SLR_UPDATE = 0x4, - /// <summary> - /// Do not update the link information - /// </summary> - SLR_NOUPDATE = 0x8, - /// <summary> - /// Do not execute the search heuristics - /// </summary> - SLR_NOSEARCH = 0x10, - /// <summary> - /// Do not use distributed link tracking - /// </summary> - SLR_NOTRACK = 0x20, - /// <summary> - /// Disable distributed link tracking. By default, distributed link tracking tracks - /// removable media across multiple devices based on the volume name. It also uses the - /// Universal Naming Convention (UNC) path to track remote file systems whose drive letter - /// has changed. Setting SLR_NOLINKINFO disables both types of tracking. - /// </summary> - SLR_NOLINKINFO = 0x40, - /// <summary> - /// Call the Microsoft Windows Installer - /// </summary> - SLR_INVOKE_MSI = 0x80 - } - - /// <summary> - /// The IShellLink interface allows Shell links to be created, modified, and resolved - /// </summary> - [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("000214F9-0000-0000-C000-000000000046")] - public interface IShellLinkW - { - /// <summary> - /// Retrieves the path and file name of a Shell link object - /// </summary> - /// <param name="pszFile">The PSZ file.</param> - /// <param name="cchMaxPath">The CCH max path.</param> - /// <param name="pfd">The PFD.</param> - /// <param name="fFlags">The f flags.</param> - void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out WIN32_FIND_DATA pfd, SLGP_FLAGS fFlags); - /// <summary> - /// Retrieves the list of item identifiers for a Shell link object - /// </summary> - /// <param name="ppidl">The ppidl.</param> - void GetIDList(out IntPtr ppidl); - /// <summary> - /// Sets the pointer to an item identifier list (PIDL) for a Shell link object. - /// </summary> - /// <param name="pidl">The pidl.</param> - void SetIDList(IntPtr pidl); - /// <summary> - /// Retrieves the description string for a Shell link object - /// </summary> - /// <param name="pszName">Name of the PSZ.</param> - /// <param name="cchMaxName">Name of the CCH max.</param> - void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName); - /// <summary> - /// Sets the description for a Shell link object. The description can be any application-defined string - /// </summary> - /// <param name="pszName">Name of the PSZ.</param> - void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName); - /// <summary> - /// Retrieves the name of the working directory for a Shell link object - /// </summary> - /// <param name="pszDir">The PSZ dir.</param> - /// <param name="cchMaxPath">The CCH max path.</param> - void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath); - /// <summary> - /// Sets the name of the working directory for a Shell link object - /// </summary> - /// <param name="pszDir">The PSZ dir.</param> - void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir); - /// <summary> - /// Retrieves the command-line arguments associated with a Shell link object - /// </summary> - /// <param name="pszArgs">The PSZ args.</param> - /// <param name="cchMaxPath">The CCH max path.</param> - void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath); - /// <summary> - /// Sets the command-line arguments for a Shell link object - /// </summary> - /// <param name="pszArgs">The PSZ args.</param> - void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs); - /// <summary> - /// Retrieves the hot key for a Shell link object - /// </summary> - /// <param name="pwHotkey">The pw hotkey.</param> - void GetHotkey(out short pwHotkey); - /// <summary> - /// Sets a hot key for a Shell link object - /// </summary> - /// <param name="wHotkey">The w hotkey.</param> - void SetHotkey(short wHotkey); - /// <summary> - /// Retrieves the show command for a Shell link object - /// </summary> - /// <param name="piShowCmd">The pi show CMD.</param> - void GetShowCmd(out int piShowCmd); - /// <summary> - /// Sets the show command for a Shell link object. The show command sets the initial show state of the window. - /// </summary> - /// <param name="iShowCmd">The i show CMD.</param> - void SetShowCmd(int iShowCmd); - /// <summary> - /// Retrieves the location (path and index) of the icon for a Shell link object - /// </summary> - /// <param name="pszIconPath">The PSZ icon path.</param> - /// <param name="cchIconPath">The CCH icon path.</param> - /// <param name="piIcon">The pi icon.</param> - void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, - int cchIconPath, out int piIcon); - /// <summary> - /// Sets the location (path and index) of the icon for a Shell link object - /// </summary> - /// <param name="pszIconPath">The PSZ icon path.</param> - /// <param name="iIcon">The i icon.</param> - void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon); - /// <summary> - /// Sets the relative path to the Shell link object - /// </summary> - /// <param name="pszPathRel">The PSZ path rel.</param> - /// <param name="dwReserved">The dw reserved.</param> - void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved); - /// <summary> - /// Attempts to find the target of a Shell link, even if it has been moved or renamed - /// </summary> - /// <param name="hwnd">The HWND.</param> - /// <param name="fFlags">The f flags.</param> - void Resolve(IntPtr hwnd, SLR_FLAGS fFlags); - /// <summary> - /// Sets the path and file name of a Shell link object - /// </summary> - /// <param name="pszFile">The PSZ file.</param> - void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile); - - } - - /// <summary> - /// Interface IPersist - /// </summary> - [ComImport, Guid("0000010c-0000-0000-c000-000000000046"), - InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - public interface IPersist - { - /// <summary> - /// Gets the class ID. - /// </summary> - /// <param name="pClassID">The p class ID.</param> - [PreserveSig] - void GetClassID(out Guid pClassID); - } - - /// <summary> - /// Interface IPersistFile - /// </summary> - [ComImport, Guid("0000010b-0000-0000-C000-000000000046"), - InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - public interface IPersistFile : IPersist - { - /// <summary> - /// Gets the class ID. - /// </summary> - /// <param name="pClassID">The p class ID.</param> - new void GetClassID(out Guid pClassID); - /// <summary> - /// Determines whether this instance is dirty. - /// </summary> - [PreserveSig] - int IsDirty(); - - /// <summary> - /// Loads the specified PSZ file name. - /// </summary> - /// <param name="pszFileName">Name of the PSZ file.</param> - /// <param name="dwMode">The dw mode.</param> - [PreserveSig] - void Load([In, MarshalAs(UnmanagedType.LPWStr)] - string pszFileName, uint dwMode); - - /// <summary> - /// Saves the specified PSZ file name. - /// </summary> - /// <param name="pszFileName">Name of the PSZ file.</param> - /// <param name="remember">if set to <c>true</c> [remember].</param> - [PreserveSig] - void Save([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName, - [In, MarshalAs(UnmanagedType.Bool)] bool remember); - - /// <summary> - /// Saves the completed. - /// </summary> - /// <param name="pszFileName">Name of the PSZ file.</param> - [PreserveSig] - void SaveCompleted([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName); - - /// <summary> - /// Gets the cur file. - /// </summary> - /// <param name="ppszFileName">Name of the PPSZ file.</param> - [PreserveSig] - void GetCurFile([In, MarshalAs(UnmanagedType.LPWStr)] string ppszFileName); - } - - // CLSID_ShellLink from ShlGuid.h - /// <summary> - /// Class ShellLink - /// </summary> - [ - ComImport, - Guid("00021401-0000-0000-C000-000000000046") - ] - public class ShellLink - { - } -} diff --git a/MediaBrowser.Common.Implementations/IO/ManagedFileSystem.cs b/MediaBrowser.Common.Implementations/IO/ManagedFileSystem.cs index ffb1e4234..8b027d41a 100644 --- a/MediaBrowser.Common.Implementations/IO/ManagedFileSystem.cs +++ b/MediaBrowser.Common.Implementations/IO/ManagedFileSystem.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text; using MediaBrowser.Common.IO; using MediaBrowser.Model.IO; -using Patterns.Logging; +using MediaBrowser.Model.Logging; namespace MediaBrowser.Common.Implementations.IO { diff --git a/MediaBrowser.Common.Implementations/IO/WindowsFileSystem.cs b/MediaBrowser.Common.Implementations/IO/WindowsFileSystem.cs index e8f8de8ae..db386c682 100644 --- a/MediaBrowser.Common.Implementations/IO/WindowsFileSystem.cs +++ b/MediaBrowser.Common.Implementations/IO/WindowsFileSystem.cs @@ -1,4 +1,4 @@ -using Patterns.Logging; +using MediaBrowser.Model.Logging; namespace MediaBrowser.Common.Implementations.IO { @@ -7,7 +7,6 @@ namespace MediaBrowser.Common.Implementations.IO public WindowsFileSystem(ILogger logger) : base(logger, true, true) { - AddShortcutHandler(new LnkShortcutHandler()); EnableFileSystemRequestConcat = false; } } diff --git a/MediaBrowser.Common.Implementations/Logging/LogHelper.cs b/MediaBrowser.Common.Implementations/Logging/LogHelper.cs deleted file mode 100644 index 8080c2111..000000000 --- a/MediaBrowser.Common.Implementations/Logging/LogHelper.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Text; - -namespace MediaBrowser.Common.Implementations.Logging -{ - /// <summary> - /// Class LogHelper - /// </summary> - public static class LogHelper - { - /// <summary> - /// Gets the log message. - /// </summary> - /// <param name="exception">The exception.</param> - /// <returns>StringBuilder.</returns> - public static StringBuilder GetLogMessage(Exception exception) - { - if (exception == null) - { - throw new ArgumentNullException("exception"); - } - - var messageText = new StringBuilder(); - - messageText.AppendLine(exception.Message); - - messageText.AppendLine(exception.GetType().FullName); - - LogExceptionData(messageText, exception); - - messageText.AppendLine(exception.StackTrace ?? "No Stack Trace Available"); - - // Log the InnerExceptions, if any - AppendInnerExceptions(messageText, exception); - - messageText.AppendLine(string.Empty); - - return messageText; - } - - /// <summary> - /// Appends the inner exceptions. - /// </summary> - /// <param name="messageText">The message text.</param> - /// <param name="e">The e.</param> - private static void AppendInnerExceptions(StringBuilder messageText, Exception e) - { - var aggregate = e as AggregateException; - - if (aggregate != null && aggregate.InnerExceptions != null) - { - foreach (var ex in aggregate.InnerExceptions) - { - AppendInnerException(messageText, ex); - AppendInnerExceptions(messageText, ex); - } - } - - else if (e.InnerException != null) - { - AppendInnerException(messageText, e.InnerException); - AppendInnerExceptions(messageText, e.InnerException); - } - } - - /// <summary> - /// Appends the inner exception. - /// </summary> - /// <param name="messageText">The message text.</param> - /// <param name="e">The e.</param> - private static void AppendInnerException(StringBuilder messageText, Exception e) - { - messageText.AppendLine("InnerException: " + e.GetType().FullName); - messageText.AppendLine(e.Message); - - LogExceptionData(messageText, e); - - if (e.StackTrace != null) - { - messageText.AppendLine(e.StackTrace); - } - } - - /// <summary> - /// Logs the exception data. - /// </summary> - /// <param name="messageText">The message text.</param> - /// <param name="e">The e.</param> - private static void LogExceptionData(StringBuilder messageText, Exception e) - { - foreach (var key in e.Data.Keys) - { - messageText.AppendLine(key + ": " + e.Data[key]); - } - } - } -} diff --git a/MediaBrowser.Common.Implementations/Logging/NLogger.cs b/MediaBrowser.Common.Implementations/Logging/NLogger.cs deleted file mode 100644 index 11f41261a..000000000 --- a/MediaBrowser.Common.Implementations/Logging/NLogger.cs +++ /dev/null @@ -1,224 +0,0 @@ -using MediaBrowser.Model.Logging; -using System; -using System.Text; - -namespace MediaBrowser.Common.Implementations.Logging -{ - /// <summary> - /// Class NLogger - /// </summary> - public class NLogger : ILogger - { - /// <summary> - /// The _logger - /// </summary> - private readonly NLog.Logger _logger; - - private readonly ILogManager _logManager; - - /// <summary> - /// The _lock object - /// </summary> - private static readonly object LockObject = new object(); - - /// <summary> - /// Initializes a new instance of the <see cref="NLogger" /> class. - /// </summary> - /// <param name="name">The name.</param> - /// <param name="logManager">The log manager.</param> - public NLogger(string name, ILogManager logManager) - { - _logManager = logManager; - lock (LockObject) - { - _logger = NLog.LogManager.GetLogger(name); - } - } - - /// <summary> - /// Infoes the specified message. - /// </summary> - /// <param name="message">The message.</param> - /// <param name="paramList">The param list.</param> - public void Info(string message, params object[] paramList) - { - _logger.Info(message, paramList); - } - - /// <summary> - /// Errors the specified message. - /// </summary> - /// <param name="message">The message.</param> - /// <param name="paramList">The param list.</param> - public void Error(string message, params object[] paramList) - { - _logger.Error(message, paramList); - } - - /// <summary> - /// Warns the specified message. - /// </summary> - /// <param name="message">The message.</param> - /// <param name="paramList">The param list.</param> - public void Warn(string message, params object[] paramList) - { - _logger.Warn(message, paramList); - } - - /// <summary> - /// Debugs the specified message. - /// </summary> - /// <param name="message">The message.</param> - /// <param name="paramList">The param list.</param> - public void Debug(string message, params object[] paramList) - { - if (_logManager.LogSeverity == LogSeverity.Info) - { - return; - } - - _logger.Debug(message, paramList); - } - - /// <summary> - /// Logs the exception. - /// </summary> - /// <param name="message">The message.</param> - /// <param name="exception">The exception.</param> - /// <param name="paramList">The param list.</param> - /// <exception cref="System.NotImplementedException"></exception> - public void ErrorException(string message, Exception exception, params object[] paramList) - { - LogException(LogSeverity.Error, message, exception, paramList); - } - - /// <summary> - /// Logs the exception. - /// </summary> - /// <param name="level">The level.</param> - /// <param name="message">The message.</param> - /// <param name="exception">The exception.</param> - /// <param name="paramList">The param list.</param> - private void LogException(LogSeverity level, string message, Exception exception, params object[] paramList) - { - message = FormatMessage(message, paramList).Replace(Environment.NewLine, ". "); - - var messageText = LogHelper.GetLogMessage(exception); - - var prefix = _logManager.ExceptionMessagePrefix; - - if (!string.IsNullOrWhiteSpace(prefix)) - { - messageText.Insert(0, prefix); - } - - LogMultiline(message, level, messageText); - } - - /// <summary> - /// Formats the message. - /// </summary> - /// <param name="message">The message.</param> - /// <param name="paramList">The param list.</param> - /// <returns>System.String.</returns> - private static string FormatMessage(string message, params object[] paramList) - { - if (paramList != null) - { - for (var i = 0; i < paramList.Length; i++) - { - var obj = paramList[i]; - - message = message.Replace("{" + i + "}", (obj == null ? "null" : obj.ToString())); - } - } - - return message; - } - - /// <summary> - /// Logs the multiline. - /// </summary> - /// <param name="message">The message.</param> - /// <param name="severity">The severity.</param> - /// <param name="additionalContent">Content of the additional.</param> - public void LogMultiline(string message, LogSeverity severity, StringBuilder additionalContent) - { - if (severity == LogSeverity.Debug && _logManager.LogSeverity == LogSeverity.Info) - { - return; - } - - additionalContent.Insert(0, message + Environment.NewLine); - - const char tabChar = '\t'; - - var text = additionalContent.ToString() - .Replace(Environment.NewLine, Environment.NewLine + tabChar) - .TrimEnd(tabChar); - - if (text.EndsWith(Environment.NewLine)) - { - text = text.Substring(0, text.LastIndexOf(Environment.NewLine, StringComparison.OrdinalIgnoreCase)); - } - - _logger.Log(GetLogLevel(severity), text); - } - - /// <summary> - /// Gets the log level. - /// </summary> - /// <param name="severity">The severity.</param> - /// <returns>NLog.LogLevel.</returns> - private NLog.LogLevel GetLogLevel(LogSeverity severity) - { - switch (severity) - { - case LogSeverity.Debug: - return NLog.LogLevel.Debug; - case LogSeverity.Error: - return NLog.LogLevel.Error; - case LogSeverity.Warn: - return NLog.LogLevel.Warn; - case LogSeverity.Fatal: - return NLog.LogLevel.Fatal; - case LogSeverity.Info: - return NLog.LogLevel.Info; - default: - throw new ArgumentException("Unknown LogSeverity: " + severity.ToString()); - } - } - - /// <summary> - /// Logs the specified severity. - /// </summary> - /// <param name="severity">The severity.</param> - /// <param name="message">The message.</param> - /// <param name="paramList">The param list.</param> - public void Log(LogSeverity severity, string message, params object[] paramList) - { - _logger.Log(GetLogLevel(severity), message, paramList); - } - - /// <summary> - /// Fatals the specified message. - /// </summary> - /// <param name="message">The message.</param> - /// <param name="paramList">The param list.</param> - public void Fatal(string message, params object[] paramList) - { - _logger.Fatal(message, paramList); - } - - /// <summary> - /// Fatals the exception. - /// </summary> - /// <param name="message">The message.</param> - /// <param name="exception">The exception.</param> - /// <param name="paramList">The param list.</param> - public void FatalException(string message, Exception exception, params object[] paramList) - { - LogException(LogSeverity.Fatal, message, exception, paramList); - } - } -} diff --git a/MediaBrowser.Common.Implementations/Logging/NlogManager.cs b/MediaBrowser.Common.Implementations/Logging/NlogManager.cs deleted file mode 100644 index 1bbcccd88..000000000 --- a/MediaBrowser.Common.Implementations/Logging/NlogManager.cs +++ /dev/null @@ -1,264 +0,0 @@ -using MediaBrowser.Model.Logging; -using NLog; -using NLog.Config; -using NLog.Targets; -using NLog.Targets.Wrappers; -using System; -using System.IO; -using System.Linq; - -namespace MediaBrowser.Common.Implementations.Logging -{ - /// <summary> - /// Class NlogManager - /// </summary> - public class NlogManager : ILogManager - { - /// <summary> - /// Occurs when [logger loaded]. - /// </summary> - public event EventHandler LoggerLoaded; - /// <summary> - /// Gets or sets the log directory. - /// </summary> - /// <value>The log directory.</value> - private string LogDirectory { get; set; } - /// <summary> - /// Gets or sets the log file prefix. - /// </summary> - /// <value>The log file prefix.</value> - private string LogFilePrefix { get; set; } - /// <summary> - /// Gets the log file path. - /// </summary> - /// <value>The log file path.</value> - public string LogFilePath { get; private set; } - - /// <summary> - /// Gets or sets the exception message prefix. - /// </summary> - /// <value>The exception message prefix.</value> - public string ExceptionMessagePrefix { get; set; } - - /// <summary> - /// Initializes a new instance of the <see cref="NlogManager" /> class. - /// </summary> - /// <param name="logDirectory">The log directory.</param> - /// <param name="logFileNamePrefix">The log file name prefix.</param> - public NlogManager(string logDirectory, string logFileNamePrefix) - { - LogDirectory = logDirectory; - LogFilePrefix = logFileNamePrefix; - - LogManager.Configuration = new LoggingConfiguration (); - } - - private LogSeverity _severity = LogSeverity.Debug; - public LogSeverity LogSeverity - { - get - { - return _severity; - } - set - { - var changed = _severity != value; - - _severity = value; - - if (changed) - { - UpdateLogLevel(value); - } - } - } - - private void UpdateLogLevel(LogSeverity newLevel) - { - var level = GetLogLevel(newLevel); - - var rules = LogManager.Configuration.LoggingRules; - - foreach (var rule in rules) - { - if (!rule.IsLoggingEnabledForLevel(level)) - { - rule.EnableLoggingForLevel(level); - } - foreach (var lev in rule.Levels.ToArray()) - { - if (lev < level) - { - rule.DisableLoggingForLevel(lev); - } - } - } - } - - /// <summary> - /// Adds the file target. - /// </summary> - /// <param name="path">The path.</param> - /// <param name="level">The level.</param> - private void AddFileTarget(string path, LogSeverity level) - { - RemoveTarget("ApplicationLogFileWrapper"); - - var wrapper = new AsyncTargetWrapper (); - wrapper.Name = "ApplicationLogFileWrapper"; - - var logFile = new FileTarget - { - FileName = path, - Layout = "${longdate} ${level} ${logger}: ${message}" - }; - - logFile.Name = "ApplicationLogFile"; - - wrapper.WrappedTarget = logFile; - - AddLogTarget(wrapper, level); - } - - /// <summary> - /// Adds the log target. - /// </summary> - /// <param name="target">The target.</param> - /// <param name="level">The level.</param> - public void AddLogTarget(Target target, LogSeverity level) - { - var config = LogManager.Configuration; - config.AddTarget(target.Name, target); - - var rule = new LoggingRule("*", GetLogLevel(level), target); - config.LoggingRules.Add(rule); - - LogManager.Configuration = config; - } - - /// <summary> - /// Removes the target. - /// </summary> - /// <param name="name">The name.</param> - public void RemoveTarget(string name) - { - var config = LogManager.Configuration; - - var target = config.FindTargetByName(name); - - if (target != null) - { - foreach (var rule in config.LoggingRules.ToList()) - { - var contains = rule.Targets.Contains(target); - - rule.Targets.Remove(target); - - if (contains) - { - config.LoggingRules.Remove(rule); - } - } - - config.RemoveTarget(name); - LogManager.Configuration = config; - } - } - - /// <summary> - /// Gets the logger. - /// </summary> - /// <param name="name">The name.</param> - /// <returns>ILogger.</returns> - public Model.Logging.ILogger GetLogger(string name) - { - return new NLogger(name, this); - } - - /// <summary> - /// Gets the log level. - /// </summary> - /// <param name="severity">The severity.</param> - /// <returns>LogLevel.</returns> - /// <exception cref="System.ArgumentException">Unrecognized LogSeverity</exception> - private LogLevel GetLogLevel(LogSeverity severity) - { - switch (severity) - { - case LogSeverity.Debug: - return LogLevel.Debug; - case LogSeverity.Error: - return LogLevel.Error; - case LogSeverity.Fatal: - return LogLevel.Fatal; - case LogSeverity.Info: - return LogLevel.Info; - case LogSeverity.Warn: - return LogLevel.Warn; - default: - throw new ArgumentException("Unrecognized LogSeverity"); - } - } - - /// <summary> - /// Reloads the logger. - /// </summary> - /// <param name="level">The level.</param> - public void ReloadLogger(LogSeverity level) - { - LogFilePath = Path.Combine(LogDirectory, LogFilePrefix + "-" + decimal.Round(DateTime.Now.Ticks / 10000000) + ".txt"); - - Directory.CreateDirectory(Path.GetDirectoryName(LogFilePath)); - - AddFileTarget(LogFilePath, level); - - LogSeverity = level; - - if (LoggerLoaded != null) - { - try - { - LoggerLoaded(this, EventArgs.Empty); - } - catch (Exception ex) - { - GetLogger("Logger").ErrorException("Error in LoggerLoaded event", ex); - } - } - } - - /// <summary> - /// Flushes this instance. - /// </summary> - public void Flush() - { - LogManager.Flush(); - } - - - public void AddConsoleOutput() - { - RemoveTarget("ConsoleTargetWrapper"); - - var wrapper = new AsyncTargetWrapper (); - wrapper.Name = "ConsoleTargetWrapper"; - - var target = new ConsoleTarget() - { - Layout = "${level}, ${logger}, ${message}", - Error = false - }; - - target.Name = "ConsoleTarget"; - - wrapper.WrappedTarget = target; - - AddLogTarget(wrapper, LogSeverity); - } - - public void RemoveConsoleOutput() - { - RemoveTarget("ConsoleTargetWrapper"); - } - } -} diff --git a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj index ce776b245..4b3fe3dba 100644 --- a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj +++ b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj @@ -45,26 +45,12 @@ <RunPostBuildEvent>Always</RunPostBuildEvent> </PropertyGroup> <ItemGroup> - <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL"> - <HintPath>..\packages\NLog.4.3.10\lib\net45\NLog.dll</HintPath> - <Private>True</Private> - </Reference> - <Reference Include="Patterns.Logging"> - <HintPath>..\packages\Patterns.Logging.1.0.0.2\lib\portable-net45+sl4+wp71+win8+wpa81\Patterns.Logging.dll</HintPath> - </Reference> - <Reference Include="SimpleInjector, Version=3.2.4.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL"> - <HintPath>..\packages\SimpleInjector.3.2.4\lib\net45\SimpleInjector.dll</HintPath> - <Private>True</Private> - </Reference> <Reference Include="System" /> <Reference Include="System.Configuration" /> <Reference Include="System.Core" /> <Reference Include="Microsoft.CSharp" /> <Reference Include="System.Net" /> <Reference Include="System.Xml" /> - <Reference Include="ServiceStack.Text"> - <HintPath>..\ThirdParty\ServiceStack.Text\ServiceStack.Text.dll</HintPath> - </Reference> </ItemGroup> <ItemGroup> <Compile Include="..\SharedVersion.cs"> @@ -79,12 +65,8 @@ <Compile Include="HttpClientManager\HttpClientInfo.cs" /> <Compile Include="HttpClientManager\HttpClientManager.cs" /> <Compile Include="IO\IsoManager.cs" /> - <Compile Include="IO\LnkShortcutHandler.cs" /> <Compile Include="IO\ManagedFileSystem.cs" /> <Compile Include="IO\WindowsFileSystem.cs" /> - <Compile Include="Logging\LogHelper.cs" /> - <Compile Include="Logging\NLogger.cs" /> - <Compile Include="Logging\NlogManager.cs" /> <Compile Include="Networking\BaseNetworkManager.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="ScheduledTasks\DailyTrigger.cs" /> @@ -102,7 +84,6 @@ <Compile Include="Security\PluginSecurityManager.cs" /> <Compile Include="Security\RegRecord.cs" /> <Compile Include="Security\SuppporterInfoResponse.cs" /> - <Compile Include="Serialization\JsonSerializer.cs" /> <Compile Include="Serialization\XmlSerializer.cs" /> <Compile Include="Updates\GithubUpdater.cs" /> <Compile Include="Updates\InstallationManager.cs" /> @@ -117,9 +98,6 @@ <Name>MediaBrowser.Model</Name> </ProjectReference> </ItemGroup> - <ItemGroup> - <None Include="packages.config" /> - </ItemGroup> <ItemGroup /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <PropertyGroup> diff --git a/MediaBrowser.Common.Implementations/Serialization/JsonSerializer.cs b/MediaBrowser.Common.Implementations/Serialization/JsonSerializer.cs deleted file mode 100644 index 98d2967ac..000000000 --- a/MediaBrowser.Common.Implementations/Serialization/JsonSerializer.cs +++ /dev/null @@ -1,228 +0,0 @@ -using MediaBrowser.Model.Serialization; -using System; -using System.IO; -using MediaBrowser.Common.IO; -using MediaBrowser.Model.IO; -using MediaBrowser.Model.Logging; - -namespace MediaBrowser.Common.Implementations.Serialization -{ - /// <summary> - /// Provides a wrapper around third party json serialization. - /// </summary> - public class JsonSerializer : IJsonSerializer - { - private readonly IFileSystem _fileSystem; - private readonly ILogger _logger; - - public JsonSerializer(IFileSystem fileSystem, ILogger logger) - { - _fileSystem = fileSystem; - _logger = logger; - Configure(); - } - - /// <summary> - /// Serializes to stream. - /// </summary> - /// <param name="obj">The obj.</param> - /// <param name="stream">The stream.</param> - /// <exception cref="System.ArgumentNullException">obj</exception> - public void SerializeToStream(object obj, Stream stream) - { - if (obj == null) - { - throw new ArgumentNullException("obj"); - } - - if (stream == null) - { - throw new ArgumentNullException("stream"); - } - - ServiceStack.Text.JsonSerializer.SerializeToStream(obj, obj.GetType(), stream); - } - - /// <summary> - /// Serializes to file. - /// </summary> - /// <param name="obj">The obj.</param> - /// <param name="file">The file.</param> - /// <exception cref="System.ArgumentNullException">obj</exception> - public void SerializeToFile(object obj, string file) - { - if (obj == null) - { - throw new ArgumentNullException("obj"); - } - - if (string.IsNullOrEmpty(file)) - { - throw new ArgumentNullException("file"); - } - - using (Stream stream = _fileSystem.GetFileStream(file, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read)) - { - SerializeToStream(obj, stream); - } - } - - private Stream OpenFile(string path) - { - _logger.Debug("Deserializing file {0}", path); - return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 131072); - } - - /// <summary> - /// Deserializes from file. - /// </summary> - /// <param name="type">The type.</param> - /// <param name="file">The file.</param> - /// <returns>System.Object.</returns> - /// <exception cref="System.ArgumentNullException">type</exception> - public object DeserializeFromFile(Type type, string file) - { - if (type == null) - { - throw new ArgumentNullException("type"); - } - - if (string.IsNullOrEmpty(file)) - { - throw new ArgumentNullException("file"); - } - - using (Stream stream = OpenFile(file)) - { - return DeserializeFromStream(stream, type); - } - } - - /// <summary> - /// Deserializes from file. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="file">The file.</param> - /// <returns>``0.</returns> - /// <exception cref="System.ArgumentNullException">file</exception> - public T DeserializeFromFile<T>(string file) - where T : class - { - if (string.IsNullOrEmpty(file)) - { - throw new ArgumentNullException("file"); - } - - using (Stream stream = OpenFile(file)) - { - return DeserializeFromStream<T>(stream); - } - } - - /// <summary> - /// Deserializes from stream. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="stream">The stream.</param> - /// <returns>``0.</returns> - /// <exception cref="System.ArgumentNullException">stream</exception> - public T DeserializeFromStream<T>(Stream stream) - { - if (stream == null) - { - throw new ArgumentNullException("stream"); - } - - return ServiceStack.Text.JsonSerializer.DeserializeFromStream<T>(stream); - } - - /// <summary> - /// Deserializes from string. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="text">The text.</param> - /// <returns>``0.</returns> - /// <exception cref="System.ArgumentNullException">text</exception> - public T DeserializeFromString<T>(string text) - { - if (string.IsNullOrEmpty(text)) - { - throw new ArgumentNullException("text"); - } - - return ServiceStack.Text.JsonSerializer.DeserializeFromString<T>(text); - } - - /// <summary> - /// Deserializes from stream. - /// </summary> - /// <param name="stream">The stream.</param> - /// <param name="type">The type.</param> - /// <returns>System.Object.</returns> - /// <exception cref="System.ArgumentNullException">stream</exception> - public object DeserializeFromStream(Stream stream, Type type) - { - if (stream == null) - { - throw new ArgumentNullException("stream"); - } - - if (type == null) - { - throw new ArgumentNullException("type"); - } - - return ServiceStack.Text.JsonSerializer.DeserializeFromStream(type, stream); - } - - /// <summary> - /// Configures this instance. - /// </summary> - private void Configure() - { - ServiceStack.Text.JsConfig.DateHandler = ServiceStack.Text.DateHandler.ISO8601; - ServiceStack.Text.JsConfig.ExcludeTypeInfo = true; - ServiceStack.Text.JsConfig.IncludeNullValues = false; - ServiceStack.Text.JsConfig.AlwaysUseUtc = true; - ServiceStack.Text.JsConfig.AssumeUtc = true; - } - - /// <summary> - /// Deserializes from string. - /// </summary> - /// <param name="json">The json.</param> - /// <param name="type">The type.</param> - /// <returns>System.Object.</returns> - /// <exception cref="System.ArgumentNullException">json</exception> - public object DeserializeFromString(string json, Type type) - { - if (string.IsNullOrEmpty(json)) - { - throw new ArgumentNullException("json"); - } - - if (type == null) - { - throw new ArgumentNullException("type"); - } - - return ServiceStack.Text.JsonSerializer.DeserializeFromString(json, type); - } - - /// <summary> - /// Serializes to string. - /// </summary> - /// <param name="obj">The obj.</param> - /// <returns>System.String.</returns> - /// <exception cref="System.ArgumentNullException">obj</exception> - public string SerializeToString(object obj) - { - if (obj == null) - { - throw new ArgumentNullException("obj"); - } - - return ServiceStack.Text.JsonSerializer.SerializeToString(obj, obj.GetType()); - } - } -} diff --git a/MediaBrowser.Common.Implementations/packages.config b/MediaBrowser.Common.Implementations/packages.config deleted file mode 100644 index 4eacd0d72..000000000 --- a/MediaBrowser.Common.Implementations/packages.config +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<packages> - <package id="NLog" version="4.3.10" targetFramework="net46" /> - <package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" /> - <package id="SimpleInjector" version="3.2.4" targetFramework="net46" /> -</packages>
\ No newline at end of file |
