diff options
23 files changed, 188 insertions, 612 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/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/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 diff --git a/MediaBrowser.Common.Implementations/Logging/LogHelper.cs b/MediaBrowser.Model/Logging/LogHelper.cs index 8080c2111..5b8090d30 100644 --- a/MediaBrowser.Common.Implementations/Logging/LogHelper.cs +++ b/MediaBrowser.Model/Logging/LogHelper.cs @@ -1,7 +1,7 @@ using System; using System.Text; -namespace MediaBrowser.Common.Implementations.Logging +namespace MediaBrowser.Model.Logging { /// <summary> /// Class LogHelper diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index dca74298e..912decfa3 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -142,6 +142,7 @@ <Compile Include="IO\IShortcutHandler.cs" /> <Compile Include="IO\StreamDefaults.cs" /> <Compile Include="Globalization\ILocalizationManager.cs" /> + <Compile Include="Logging\LogHelper.cs" /> <Compile Include="MediaInfo\LiveStreamRequest.cs" /> <Compile Include="MediaInfo\LiveStreamResponse.cs" /> <Compile Include="MediaInfo\PlaybackInfoRequest.cs" /> diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index e0570ffc4..3046fc395 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -10,8 +10,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Common.IO; -using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Providers; diff --git a/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs b/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs index e34df6b62..c47b6ab93 100644 --- a/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs +++ b/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs @@ -93,44 +93,19 @@ namespace MediaBrowser.Providers.MediaInfo return; } - var failHistoryPath = Path.Combine(_config.ApplicationPaths.CachePath, "subtitlehistory.json"); - var history = GetHistory(failHistoryPath); - var numComplete = 0; - var hasChanges = false; foreach (var video in videos) { - DateTime lastAttempt; - if (history.TryGetValue(video.Id.ToString("N"), out lastAttempt)) - { - if ((DateTime.UtcNow - lastAttempt).TotalDays <= 7) - { - continue; - } - } - try { - var shouldRetry = await DownloadSubtitles(video, options, cancellationToken).ConfigureAwait(false); - - if (shouldRetry) - { - history[video.Id.ToString("N")] = DateTime.UtcNow; - } - else - { - history.Remove(video.Id.ToString("N")); - } + await DownloadSubtitles(video, options, cancellationToken).ConfigureAwait(false); } catch (Exception ex) { _logger.ErrorException("Error downloading subtitles for {0}", ex, video.Path); - history[video.Id.ToString("N")] = DateTime.UtcNow; } - hasChanges = true; - // Update progress numComplete++; double percent = numComplete; @@ -138,29 +113,6 @@ namespace MediaBrowser.Providers.MediaInfo progress.Report(100 * percent); } - - if (hasChanges) - { - _json.SerializeToFile(history, failHistoryPath); - } - } - - private Dictionary<string,DateTime> GetHistory(string path) - { - try - { - var result = _json.DeserializeFromFile<Dictionary<string, DateTime>>(path); - - if (result != null) - { - return result; - } - } - catch - { - } - - return new Dictionary<string, DateTime>(); } private async Task<bool> DownloadSubtitles(Video video, SubtitleOptions options, CancellationToken cancellationToken) diff --git a/MediaBrowser.Common.Implementations/Logging/NLogger.cs b/MediaBrowser.Server.Implementations/Logging/NLogger.cs index 11f41261a..11f41261a 100644 --- a/MediaBrowser.Common.Implementations/Logging/NLogger.cs +++ b/MediaBrowser.Server.Implementations/Logging/NLogger.cs diff --git a/MediaBrowser.Common.Implementations/Logging/NlogManager.cs b/MediaBrowser.Server.Implementations/Logging/NlogManager.cs index 1bbcccd88..1bbcccd88 100644 --- a/MediaBrowser.Common.Implementations/Logging/NlogManager.cs +++ b/MediaBrowser.Server.Implementations/Logging/NlogManager.cs diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index 854a9cecb..ec1fbb479 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -61,6 +61,10 @@ <HintPath>..\packages\Microsoft.IO.RecyclableMemoryStream.1.1.0.0\lib\net45\Microsoft.IO.RecyclableMemoryStream.dll</HintPath> <Private>True</Private> </Reference> + <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> @@ -272,6 +276,8 @@ <Compile Include="LiveTv\TunerHosts\SatIp\TransmissionMode.cs" /> <Compile Include="LiveTv\TunerHosts\SatIp\Utils.cs" /> <Compile Include="Localization\LocalizationManager.cs" /> + <Compile Include="Logging\NLogger.cs" /> + <Compile Include="Logging\NlogManager.cs" /> <Compile Include="Logging\PatternsLogger.cs" /> <Compile Include="MediaEncoder\EncodingManager.cs" /> <Compile Include="Notifications\IConfigurableNotificationService.cs" /> @@ -281,6 +287,7 @@ <Compile Include="Persistence\IDbConnector.cs" /> <Compile Include="Persistence\MediaStreamColumns.cs" /> <Compile Include="Reflection\AssemblyInfo.cs" /> + <Compile Include="Serialization\JsonSerializer.cs" /> <Compile Include="Social\SharingManager.cs" /> <Compile Include="Social\SharingRepository.cs" /> <Compile Include="Sorting\StartDateComparer.cs" /> diff --git a/MediaBrowser.Common.Implementations/Serialization/JsonSerializer.cs b/MediaBrowser.Server.Implementations/Serialization/JsonSerializer.cs index 98d2967ac..b9a03242c 100644 --- a/MediaBrowser.Common.Implementations/Serialization/JsonSerializer.cs +++ b/MediaBrowser.Server.Implementations/Serialization/JsonSerializer.cs @@ -1,11 +1,10 @@ -using MediaBrowser.Model.Serialization; -using System; +using System; using System.IO; -using MediaBrowser.Common.IO; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Serialization; -namespace MediaBrowser.Common.Implementations.Serialization +namespace MediaBrowser.Server.Implementations.Serialization { /// <summary> /// Provides a wrapper around third party json serialization. diff --git a/MediaBrowser.Server.Implementations/packages.config b/MediaBrowser.Server.Implementations/packages.config index 522d2bbfd..223b61b2b 100644 --- a/MediaBrowser.Server.Implementations/packages.config +++ b/MediaBrowser.Server.Implementations/packages.config @@ -5,6 +5,7 @@ <package id="Interfaces.IO" version="1.0.0.5" targetFramework="net45" />
<package id="MediaBrowser.Naming" version="1.0.0.55" targetFramework="net45" />
<package id="Microsoft.IO.RecyclableMemoryStream" version="1.1.0.0" targetFramework="net46" />
+ <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" />
<package id="SocketHttpListener" version="1.0.0.40" targetFramework="net45" />
diff --git a/MediaBrowser.Server.Mono/Program.cs b/MediaBrowser.Server.Mono/Program.cs index adfed72ab..f970f68db 100644 --- a/MediaBrowser.Server.Mono/Program.cs +++ b/MediaBrowser.Server.Mono/Program.cs @@ -77,7 +77,7 @@ namespace MediaBrowser.Server.Mono // Allow all https requests ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; }); - var fileSystem = new ManagedFileSystem(new PatternsLogger(logManager.GetLogger("FileSystem")), false, false); + var fileSystem = new ManagedFileSystem(logManager.GetLogger("FileSystem"), false, false); fileSystem.AddShortcutHandler(new MbLinkShortcutHandler(fileSystem)); var nativeApp = new NativeApp(options, logManager.GetLogger("App")); diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs index b6e7bb5e9..3ef63fd94 100644 --- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs +++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs @@ -103,10 +103,10 @@ using MediaBrowser.Common.Implementations.Networking; using MediaBrowser.Common.Implementations.Serialization; using MediaBrowser.Common.Implementations.Updates; using MediaBrowser.Common.IO; +using MediaBrowser.Common.Plugins; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; -using MediaBrowser.Controller.Extensions; using MediaBrowser.Controller.IO; using MediaBrowser.Model.Activity; using MediaBrowser.Model.Globalization; @@ -119,15 +119,18 @@ using MediaBrowser.Model.Social; using MediaBrowser.Model.Xml; using MediaBrowser.Server.Implementations.Archiving; using MediaBrowser.Server.Implementations.Reflection; +using MediaBrowser.Server.Implementations.Serialization; using MediaBrowser.Server.Implementations.Xml; using OpenSubtitlesHandler; +using ServiceStack; +using StringExtensions = MediaBrowser.Controller.Extensions.StringExtensions; namespace MediaBrowser.Server.Startup.Common { /// <summary> /// Class CompositionRoot /// </summary> - public class ApplicationHost : BaseApplicationHost<ServerApplicationPaths>, IServerApplicationHost + public class ApplicationHost : BaseApplicationHost<ServerApplicationPaths>, IServerApplicationHost, IDependencyContainer { /// <summary> /// Gets the server configuration manager. @@ -235,6 +238,11 @@ namespace MediaBrowser.Server.Startup.Common internal INativeApp NativeApp { get; set; } /// <summary> + /// The container + /// </summary> + protected readonly SimpleInjector.Container Container = new SimpleInjector.Container(); + + /// <summary> /// Initializes a new instance of the <see cref="ApplicationHost" /> class. /// </summary> /// <param name="applicationPaths">The application paths.</param> @@ -399,7 +407,17 @@ namespace MediaBrowser.Server.Startup.Common protected override IJsonSerializer CreateJsonSerializer() { - var result = base.CreateJsonSerializer(); + try + { + // https://github.com/ServiceStack/ServiceStack/blob/master/tests/ServiceStack.WebHost.IntegrationTests/Web.config#L4 + Licensing.RegisterLicense("1001-e1JlZjoxMDAxLE5hbWU6VGVzdCBCdXNpbmVzcyxUeXBlOkJ1c2luZXNzLEhhc2g6UHVNTVRPclhvT2ZIbjQ5MG5LZE1mUTd5RUMzQnBucTFEbTE3TDczVEF4QUNMT1FhNXJMOWkzVjFGL2ZkVTE3Q2pDNENqTkQyUktRWmhvUVBhYTBiekJGUUZ3ZE5aZHFDYm9hL3lydGlwUHI5K1JsaTBYbzNsUC85cjVJNHE5QVhldDN6QkE4aTlvdldrdTgyTk1relY2eis2dFFqTThYN2lmc0JveHgycFdjPSxFeHBpcnk6MjAxMy0wMS0wMX0="); + } + catch + { + // Failing under mono + } + + var result = new JsonSerializer(FileSystemManager, LogManager.GetLogger("JsonSerializer")); ServiceStack.Text.JsConfig<Movie>.ExcludePropertyNames = new[] { "ShortOverview" }; ServiceStack.Text.JsConfig<Movie>.ExcludePropertyNames = new[] { "Taglines" }; @@ -1010,6 +1028,8 @@ namespace MediaBrowser.Server.Startup.Common ConfigurationManager.SaveConfiguration(); } + RegisterModules(); + base.FindParts(); HttpServer.Init(GetExports<IService>(false)); @@ -1686,5 +1706,135 @@ namespace MediaBrowser.Server.Startup.Common { NativeApp.EnableLoopback(appName); } + + 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> + /// Creates an instance of type and resolves all constructor dependancies + /// </summary> + /// <param name="type">The type.</param> + /// <returns>System.Object.</returns> + public override object CreateInstance(Type type) + { + try + { + return Container.GetInstance(type); + } + catch (Exception ex) + { + Logger.ErrorException("Error creating {0}", ex, type.FullName); + + throw; + } + } + + /// <summary> + /// Creates the instance safe. + /// </summary> + /// <param name="type">The type.</param> + /// <returns>System.Object.</returns> + protected override 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); + } + + /// <summary> + /// Registers the specified obj. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="obj">The obj.</param> + /// <param name="manageLifetime">if set to <c>true</c> [manage lifetime].</param> + protected override void RegisterSingleInstance<T>(T obj, bool manageLifetime = true) + { + 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); + } + + /// <summary> + /// Registers the single instance. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="func">The func.</param> + protected override void RegisterSingleInstance<T>(Func<T> func) + { + Container.RegisterSingleton(func); + } + + void IDependencyContainer.Register(Type typeInterface, Type typeImplementation) + { + Container.Register(typeInterface, typeImplementation); + } + + /// <summary> + /// Resolves this instance. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns>``0.</returns> + public override T Resolve<T>() + { + return (T)Container.GetRegistration(typeof(T), true).GetInstance(); + } + + /// <summary> + /// Resolves this instance. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns>``0.</returns> + public override T TryResolve<T>() + { + var result = Container.GetRegistration(typeof(T), false); + + if (result == null) + { + return default(T); + } + return (T)result.GetInstance(); + } + } } diff --git a/MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj b/MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj index 042366e88..c0ef484c9 100644 --- a/MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj +++ b/MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj @@ -48,6 +48,10 @@ <SpecificVersion>False</SpecificVersion> <HintPath>..\ThirdParty\ServiceStack.Text\ServiceStack.Text.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" /> diff --git a/MediaBrowser.Server.Startup.Common/packages.config b/MediaBrowser.Server.Startup.Common/packages.config index a3235d0ca..49eee1536 100644 --- a/MediaBrowser.Server.Startup.Common/packages.config +++ b/MediaBrowser.Server.Startup.Common/packages.config @@ -2,4 +2,5 @@ <packages> <package id="Mono.Posix" version="4.0.0.0" targetFramework="net45" /> <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 diff --git a/MediaBrowser.ServerApplication/MainStartup.cs b/MediaBrowser.ServerApplication/MainStartup.cs index 5c6f6aec2..9287be3e2 100644 --- a/MediaBrowser.ServerApplication/MainStartup.cs +++ b/MediaBrowser.ServerApplication/MainStartup.cs @@ -308,9 +308,9 @@ namespace MediaBrowser.ServerApplication /// <param name="options">The options.</param> private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, bool runService, StartupOptions options) { - var fileSystem = new WindowsFileSystem(new PatternsLogger(logManager.GetLogger("FileSystem"))); + var fileSystem = new WindowsFileSystem(logManager.GetLogger("FileSystem")); + fileSystem.AddShortcutHandler(new LnkShortcutHandler()); fileSystem.AddShortcutHandler(new MbLinkShortcutHandler(fileSystem)); - //fileSystem.AddShortcutHandler(new LnkShortcutHandler(fileSystem)); var nativeApp = new WindowsApp(fileSystem, _logger) { diff --git a/MediaBrowser.ServerApplication/Native/LnkShortcutHandler.cs b/MediaBrowser.ServerApplication/Native/LnkShortcutHandler.cs index 128ca2df8..91ff7033e 100644 --- a/MediaBrowser.ServerApplication/Native/LnkShortcutHandler.cs +++ b/MediaBrowser.ServerApplication/Native/LnkShortcutHandler.cs @@ -7,7 +7,7 @@ using MediaBrowser.Model.IO; namespace MediaBrowser.ServerApplication.Native { - public class LnkShortcutHandler : IShortcutHandler + public class LnkShortcutHandler :IShortcutHandler { public string Extension { |
