diff options
| author | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-23 10:32:54 -0500 |
|---|---|---|
| committer | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-23 10:32:54 -0500 |
| commit | 33ed929b526acbda696f00f5966917ebd6a9ded2 (patch) | |
| tree | 18e75812ce71274a3e02f800536e8c144f4e5c45 /MediaBrowser.Common | |
| parent | 02634588710f65ce952d0229d7da6b9c9d341492 (diff) | |
| parent | e30b96217333cadb78dcc0a47545afd145c683a7 (diff) | |
Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
Conflicts:
MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.Api.dll
MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.ApiInteraction.Javascript.dll
MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.Server.Sqlite.dll
MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.Server.WorldWeatherOnline.dll
MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.WebDashboard.dll
Diffstat (limited to 'MediaBrowser.Common')
26 files changed, 394 insertions, 676 deletions
diff --git a/MediaBrowser.Common/IO/FileSystem.cs b/MediaBrowser.Common/IO/FileSystem.cs deleted file mode 100644 index 3d65167bd7..0000000000 --- a/MediaBrowser.Common/IO/FileSystem.cs +++ /dev/null @@ -1,336 +0,0 @@ -using MediaBrowser.Common.Win32; -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; - -namespace MediaBrowser.Common.IO -{ - /// <summary> - /// Class FileSystem - /// </summary> - public static class FileSystem - { - /// <summary> - /// Gets information about a path - /// </summary> - /// <param name="path">The path.</param> - /// <returns>System.Nullable{WIN32_FIND_DATA}.</returns> - /// <exception cref="System.ArgumentNullException">path</exception> - /// <exception cref="System.IO.IOException">GetFileData failed for + path</exception> - public static WIN32_FIND_DATA? GetFileData(string path) - { - if (string.IsNullOrEmpty(path)) - { - throw new ArgumentNullException("path"); - } - - WIN32_FIND_DATA data; - var handle = NativeMethods.FindFirstFileEx(path, FINDEX_INFO_LEVELS.FindExInfoBasic, out data, - FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, FindFirstFileExFlags.NONE); - - var getFilename = false; - - if (handle == NativeMethods.INVALID_HANDLE_VALUE && !Path.HasExtension(path)) - { - if (!path.EndsWith("*", StringComparison.OrdinalIgnoreCase)) - { - NativeMethods.FindClose(handle); - - handle = NativeMethods.FindFirstFileEx(Path.Combine(path, "*"), FINDEX_INFO_LEVELS.FindExInfoBasic, out data, - FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, FindFirstFileExFlags.NONE); - - getFilename = true; - } - } - - if (handle == IntPtr.Zero) - { - throw new IOException("GetFileData failed for " + path); - } - - NativeMethods.FindClose(handle); - - // According to MSDN documentation, this will default to 1601 for paths that don't exist. - if (data.CreationTimeUtc.Year == 1601) - { - return null; - } - - if (getFilename) - { - data.cFileName = Path.GetFileName(path); - } - - data.Path = path; - return data; - } - - /// <summary> - /// Gets all files within a folder - /// </summary> - /// <param name="path">The path.</param> - /// <param name="searchPattern">The search pattern.</param> - /// <returns>IEnumerable{WIN32_FIND_DATA}.</returns> - public static IEnumerable<WIN32_FIND_DATA> GetFiles(string path, string searchPattern = "*") - { - return GetFileSystemEntries(path, searchPattern, includeDirectories: false); - } - - /// <summary> - /// Gets all sub-directories within a folder - /// </summary> - /// <param name="path">The path.</param> - /// <returns>IEnumerable{WIN32_FIND_DATA}.</returns> - public static IEnumerable<WIN32_FIND_DATA> GetDirectories(string path) - { - return GetFileSystemEntries(path, includeFiles: false); - } - - /// <summary> - /// Gets all file system entries within a foler - /// </summary> - /// <param name="path">The path.</param> - /// <param name="searchPattern">The search pattern.</param> - /// <param name="includeFiles">if set to <c>true</c> [include files].</param> - /// <param name="includeDirectories">if set to <c>true</c> [include directories].</param> - /// <returns>IEnumerable{WIN32_FIND_DATA}.</returns> - /// <exception cref="System.ArgumentNullException">path</exception> - /// <exception cref="System.IO.IOException">GetFileSystemEntries failed</exception> - public static IEnumerable<WIN32_FIND_DATA> GetFileSystemEntries(string path, string searchPattern = "*", bool includeFiles = true, bool includeDirectories = true) - { - if (string.IsNullOrEmpty(path)) - { - throw new ArgumentNullException("path"); - } - - var lpFileName = Path.Combine(path, searchPattern); - - WIN32_FIND_DATA lpFindFileData; - var handle = NativeMethods.FindFirstFileEx(lpFileName, FINDEX_INFO_LEVELS.FindExInfoBasic, out lpFindFileData, - FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, FindFirstFileExFlags.FIND_FIRST_EX_LARGE_FETCH); - - if (handle == IntPtr.Zero) - { - var hr = Marshal.GetLastWin32Error(); - if (hr != 2 && hr != 0x12) - { - throw new IOException("GetFileSystemEntries failed"); - } - yield break; - } - - if (IncludeInFindFileOutput(lpFindFileData.cFileName, lpFindFileData.dwFileAttributes, includeFiles, includeDirectories)) - { - lpFindFileData.Path = Path.Combine(path, lpFindFileData.cFileName); - - yield return lpFindFileData; - } - - while (NativeMethods.FindNextFile(handle, out lpFindFileData) != IntPtr.Zero) - { - if (IncludeInFindFileOutput(lpFindFileData.cFileName, lpFindFileData.dwFileAttributes, includeFiles, includeDirectories)) - { - lpFindFileData.Path = Path.Combine(path, lpFindFileData.cFileName); - yield return lpFindFileData; - } - } - - NativeMethods.FindClose(handle); - } - - /// <summary> - /// Includes the in find file output. - /// </summary> - /// <param name="cFileName">Name of the c file.</param> - /// <param name="attributes">The attributes.</param> - /// <param name="includeFiles">if set to <c>true</c> [include files].</param> - /// <param name="includeDirectories">if set to <c>true</c> [include directories].</param> - /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> - public static bool IncludeInFindFileOutput(string cFileName, FileAttributes attributes, bool includeFiles, bool includeDirectories) - { - if (cFileName.Equals(".", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - if (cFileName.Equals("..", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - if (!includeFiles && !attributes.HasFlag(FileAttributes.Directory)) - { - return false; - } - - if (!includeDirectories && attributes.HasFlag(FileAttributes.Directory)) - { - return false; - } - - return true; - } - - /// <summary> - /// The space char - /// </summary> - private const char SpaceChar = ' '; - /// <summary> - /// The invalid file name chars - /// </summary> - private static readonly char[] InvalidFileNameChars = Path.GetInvalidFileNameChars(); - - /// <summary> - /// Takes a filename and removes invalid characters - /// </summary> - /// <param name="filename">The filename.</param> - /// <returns>System.String.</returns> - /// <exception cref="System.ArgumentNullException">filename</exception> - public static string GetValidFilename(string filename) - { - if (string.IsNullOrEmpty(filename)) - { - throw new ArgumentNullException("filename"); - } - - foreach (var c in InvalidFileNameChars) - { - filename = filename.Replace(c, SpaceChar); - } - - return filename; - } - - /// <summary> - /// Resolves the shortcut. - /// </summary> - /// <param name="filename">The filename.</param> - /// <returns>System.String.</returns> - /// <exception cref="System.ArgumentNullException">filename</exception> - public static string ResolveShortcut(string filename) - { - if (string.IsNullOrEmpty(filename)) - { - throw new ArgumentNullException("filename"); - } - - var link = new ShellLink(); - ((IPersistFile)link).Load(filename, NativeMethods.STGM_READ); - // TODO: if I can get hold of the hwnd call resolve first. This handles moved and renamed files. - // ((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(); - } - - /// <summary> - /// Creates a shortcut file pointing to a specified path - /// </summary> - /// <param name="shortcutPath">The shortcut path.</param> - /// <param name="target">The target.</param> - /// <exception cref="System.ArgumentNullException">shortcutPath</exception> - public static void CreateShortcut(string shortcutPath, string target) - { - if (string.IsNullOrEmpty(shortcutPath)) - { - throw new ArgumentNullException("shortcutPath"); - } - - if (string.IsNullOrEmpty(target)) - { - throw new ArgumentNullException("target"); - } - - var link = new ShellLink(); - - ((IShellLinkW)link).SetPath(target); - - ((IPersistFile)link).Save(shortcutPath, true); - } - - /// <summary> - /// Determines whether the specified filename is shortcut. - /// </summary> - /// <param name="filename">The filename.</param> - /// <returns><c>true</c> if the specified filename is shortcut; otherwise, <c>false</c>.</returns> - /// <exception cref="System.ArgumentNullException">filename</exception> - public static bool IsShortcut(string filename) - { - if (string.IsNullOrEmpty(filename)) - { - throw new ArgumentNullException("filename"); - } - - return string.Equals(Path.GetExtension(filename), ".lnk", StringComparison.OrdinalIgnoreCase); - } - - /// <summary> - /// Copies all. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <exception cref="System.ArgumentNullException">source</exception> - /// <exception cref="System.ArgumentException">The source and target directories are the same</exception> - public static void CopyAll(string source, string target) - { - if (string.IsNullOrEmpty(source)) - { - throw new ArgumentNullException("source"); - } - if (string.IsNullOrEmpty(target)) - { - throw new ArgumentNullException("target"); - } - - if (source.Equals(target, StringComparison.OrdinalIgnoreCase)) - { - throw new ArgumentException("The source and target directories are the same"); - } - - // Check if the target directory exists, if not, create it. - if (!Directory.Exists(target)) - { - Directory.CreateDirectory(target); - } - - foreach (var file in Directory.EnumerateFiles(source)) - { - File.Copy(file, Path.Combine(target, Path.GetFileName(file)), true); - } - - // Copy each subdirectory using recursion. - foreach (var dir in Directory.EnumerateDirectories(source)) - { - CopyAll(dir, Path.Combine(target, Path.GetFileName(dir))); - } - } - - /// <summary> - /// Parses the ini file. - /// </summary> - /// <param name="path">The path.</param> - /// <returns>NameValueCollection.</returns> - public static NameValueCollection ParseIniFile(string path) - { - var values = new NameValueCollection(); - - foreach (var line in File.ReadAllLines(path)) - { - var data = line.Split('='); - - if (data.Length < 2) continue; - - var key = data[0]; - - var value = data.Length == 2 ? data[1] : string.Join(string.Empty, data, 1, data.Length - 1); - - values[key] = value; - } - - return values; - } - } -} diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs index 2b39864089..2b9550496b 100644 --- a/MediaBrowser.Common/Kernel/BaseKernel.cs +++ b/MediaBrowser.Common/Kernel/BaseKernel.cs @@ -1,7 +1,5 @@ using MediaBrowser.Common.Events; using MediaBrowser.Common.IO; -using MediaBrowser.Common.Localization; -using MediaBrowser.Common.Mef; using MediaBrowser.Common.Net; using MediaBrowser.Common.Plugins; using MediaBrowser.Common.ScheduledTasks; @@ -11,8 +9,6 @@ using MediaBrowser.Model.Logging; using MediaBrowser.Model.System; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; -using System.ComponentModel.Composition.Hosting; using System.Diagnostics; using System.IO; using System.Linq; @@ -183,37 +179,15 @@ namespace MediaBrowser.Common.Kernel /// Gets the list of currently loaded plugins /// </summary> /// <value>The plugins.</value> - [ImportMany(typeof(IPlugin))] public IEnumerable<IPlugin> Plugins { get; protected set; } /// <summary> - /// Gets the list of Scheduled Tasks - /// </summary> - /// <value>The scheduled tasks.</value> - [ImportMany(typeof(IScheduledTask))] - public IEnumerable<IScheduledTask> ScheduledTasks { get; private set; } - - /// <summary> /// Gets the web socket listeners. /// </summary> /// <value>The web socket listeners.</value> - [ImportMany(typeof(IWebSocketListener))] public IEnumerable<IWebSocketListener> WebSocketListeners { get; private set; } /// <summary> - /// Gets the list of Localized string files - /// </summary> - /// <value>The string files.</value> - [ImportMany(typeof(LocalizedStringData))] - public IEnumerable<LocalizedStringData> StringFiles { get; private set; } - - /// <summary> - /// Gets the MEF CompositionContainer - /// </summary> - /// <value>The composition container.</value> - private CompositionContainer CompositionContainer { get; set; } - - /// <summary> /// The _HTTP manager /// </summary> /// <value>The HTTP manager.</value> @@ -226,25 +200,17 @@ namespace MediaBrowser.Common.Kernel public TcpManager TcpManager { get; private set; } /// <summary> - /// Gets the task manager. - /// </summary> - /// <value>The task manager.</value> - public TaskManager TaskManager { get; private set; } - - /// <summary> - /// Gets the iso manager. - /// </summary> - /// <value>The iso manager.</value> - public IIsoManager IsoManager { get; private set; } - - /// <summary> /// Gets the rest services. /// </summary> /// <value>The rest services.</value> - [ImportMany(typeof(IRestfulService))] public IEnumerable<IRestfulService> RestServices { get; private set; } /// <summary> + /// The disposable parts + /// </summary> + private readonly List<IDisposable> _disposableParts = new List<IDisposable>(); + + /// <summary> /// The _protobuf serializer initialized /// </summary> private bool _protobufSerializerInitialized; @@ -265,7 +231,7 @@ namespace MediaBrowser.Common.Kernel get { // Lazy load - LazyInitializer.EnsureInitialized(ref _protobufSerializer, ref _protobufSerializerInitialized, ref _protobufSerializerSyncLock, () => DynamicProtobufSerializer.Create(Assemblies)); + LazyInitializer.EnsureInitialized(ref _protobufSerializer, ref _protobufSerializerInitialized, ref _protobufSerializerSyncLock, () => DynamicProtobufSerializer.Create(AllTypes)); return _protobufSerializer; } private set @@ -336,29 +302,35 @@ namespace MediaBrowser.Common.Kernel protected IApplicationHost ApplicationHost { get; private set; } /// <summary> + /// Gets or sets the task manager. + /// </summary> + /// <value>The task manager.</value> + protected ITaskManager TaskManager { get; set; } + + /// <summary> /// Gets the assemblies. /// </summary> /// <value>The assemblies.</value> - public Assembly[] Assemblies { get; private set; } + protected Assembly[] Assemblies { get; private set; } + + /// <summary> + /// Gets all types. + /// </summary> + /// <value>All types.</value> + public Type[] AllTypes { get; private set; } /// <summary> /// Initializes a new instance of the <see cref="BaseKernel{TApplicationPathsType}" /> class. /// </summary> /// <param name="appHost">The app host.</param> - /// <param name="isoManager">The iso manager.</param> /// <param name="logger">The logger.</param> /// <exception cref="System.ArgumentNullException">isoManager</exception> - protected BaseKernel(IApplicationHost appHost, IIsoManager isoManager, ILogger logger) + protected BaseKernel(IApplicationHost appHost, ILogger logger) { if (appHost == null) { throw new ArgumentNullException("appHost"); } - - if (isoManager == null) - { - throw new ArgumentNullException("isoManager"); - } if (logger == null) { @@ -366,7 +338,6 @@ namespace MediaBrowser.Common.Kernel } ApplicationHost = appHost; - IsoManager = isoManager; Logger = logger; } @@ -419,7 +390,7 @@ namespace MediaBrowser.Common.Kernel await OnConfigurationLoaded().ConfigureAwait(false); DisposeTaskManager(); - TaskManager = new TaskManager(this, Logger); + TaskManager = new TaskManager(Logger); Logger.Info("Loading Plugins"); await ReloadComposableParts().ConfigureAwait(false); @@ -460,25 +431,82 @@ namespace MediaBrowser.Common.Kernel Assemblies = GetComposablePartAssemblies().ToArray(); - CompositionContainer = MefUtils.GetSafeCompositionContainer(Assemblies.Select(i => new AssemblyCatalog(i))); - - ComposeExportedValues(CompositionContainer); + AllTypes = Assemblies.SelectMany(GetTypes).ToArray(); - CompositionContainer.ComposeParts(this); + ComposeParts(AllTypes); await OnComposablePartsLoaded().ConfigureAwait(false); + } + + /// <summary> + /// Composes the parts. + /// </summary> + /// <param name="allTypes">All types.</param> + private void ComposeParts(IEnumerable<Type> allTypes) + { + var concreteTypes = allTypes.Where(t => t.IsClass && !t.IsAbstract && !t.IsInterface && !t.IsGenericType).ToArray(); + + RegisterExportedValues(); + + FindParts(concreteTypes); + } + + /// <summary> + /// Composes the parts with ioc container. + /// </summary> + /// <param name="allTypes">All types.</param> + protected virtual void FindParts(Type[] allTypes) + { + RestServices = GetExports<IRestfulService>(allTypes); + WebSocketListeners = GetExports<IWebSocketListener>(allTypes); + Plugins = GetExports<IPlugin>(allTypes); + + var tasks = GetExports<IScheduledTask>(allTypes, false); + + TaskManager.AddTasks(tasks); + } + + /// <summary> + /// Gets the exports. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="allTypes">All types.</param> + /// <param name="manageLiftime">if set to <c>true</c> [manage liftime].</param> + /// <returns>IEnumerable{``0}.</returns> + protected IEnumerable<T> GetExports<T>(Type[] allTypes, bool manageLiftime = true) + { + var currentType = typeof(T); + + Logger.Info("Composing instances of " + currentType.Name); - CompositionContainer.Catalog.Dispose(); + var parts = allTypes.Where(currentType.IsAssignableFrom).Select(Instantiate).Cast<T>().ToArray(); + + if (manageLiftime) + { + _disposableParts.AddRange(parts.OfType<IDisposable>()); + } + + return parts; + } + + /// <summary> + /// Instantiates the specified type. + /// </summary> + /// <param name="type">The type.</param> + /// <returns>System.Object.</returns> + private object Instantiate(Type type) + { + return ApplicationHost.CreateInstance(type); } /// <summary> /// Composes the exported values. /// </summary> /// <param name="container">The container.</param> - protected virtual void ComposeExportedValues(CompositionContainer container) + protected virtual void RegisterExportedValues() { - container.ComposeExportedValue("logger", Logger); - container.ComposeExportedValue("appHost", ApplicationHost); + ApplicationHost.Register<IKernel>(this); + ApplicationHost.Register(TaskManager); } /// <summary> @@ -546,6 +574,31 @@ namespace MediaBrowser.Common.Kernel } /// <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 + /// </summary> + /// <param name="assembly">The assembly.</param> + /// <returns>IEnumerable{Type}.</returns> + /// <exception cref="System.ArgumentNullException">assembly</exception> + private static IEnumerable<Type> GetTypes(Assembly assembly) + { + if (assembly == null) + { + throw new ArgumentNullException("assembly"); + } + + try + { + return assembly.GetTypes(); + } + catch (ReflectionTypeLoadException ex) + { + // If it fails we can still get a list of the Types it was able to resolve + return ex.Types.Where(t => t != null); + } + } + + /// <summary> /// Fires after MEF finishes finding composable parts within plugin assemblies /// </summary> /// <returns>Task.</returns> @@ -553,11 +606,6 @@ namespace MediaBrowser.Common.Kernel { return Task.Run(() => { - foreach (var task in ScheduledTasks) - { - task.Initialize(this, Logger); - } - // Start-up each plugin Parallel.ForEach(Plugins, plugin => { @@ -608,22 +656,11 @@ namespace MediaBrowser.Common.Kernel { DisposeTcpManager(); DisposeTaskManager(); - DisposeIsoManager(); DisposeHttpManager(); DisposeComposableParts(); - } - } - /// <summary> - /// Disposes the iso manager. - /// </summary> - private void DisposeIsoManager() - { - if (IsoManager != null) - { - IsoManager.Dispose(); - IsoManager = null; + _disposableParts.Clear(); } } @@ -668,9 +705,9 @@ namespace MediaBrowser.Common.Kernel /// </summary> protected virtual void DisposeComposableParts() { - if (CompositionContainer != null) + foreach (var part in _disposableParts) { - CompositionContainer.Dispose(); + part.Dispose(); } } diff --git a/MediaBrowser.Common/Kernel/IApplicationHost.cs b/MediaBrowser.Common/Kernel/IApplicationHost.cs index 63c63eb3d7..ae2e716670 100644 --- a/MediaBrowser.Common/Kernel/IApplicationHost.cs +++ b/MediaBrowser.Common/Kernel/IApplicationHost.cs @@ -43,5 +43,33 @@ namespace MediaBrowser.Common.Kernel /// </summary> /// <returns>Task.</returns> Task UpdateApplication(CancellationToken cancellationToken, IProgress<double> progress); + + /// <summary> + /// Creates an instance of type and resolves all constructor dependancies + /// </summary> + /// <param name="type">The type.</param> + /// <returns>System.Object.</returns> + object CreateInstance(Type type); + + /// <summary> + /// Registers a service that other classes can use as a dependancy. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="obj">The obj.</param> + void Register<T>(T obj) where T : class; + + /// <summary> + /// Resolves this instance. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns>``0.</returns> + T Resolve<T>(); + + /// <summary> + /// Resolves this instance. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns>``0.</returns> + T TryResolve<T>(); } } diff --git a/MediaBrowser.Common/Kernel/IKernel.cs b/MediaBrowser.Common/Kernel/IKernel.cs index c0e650fc77..1685f1f648 100644 --- a/MediaBrowser.Common/Kernel/IKernel.cs +++ b/MediaBrowser.Common/Kernel/IKernel.cs @@ -1,12 +1,10 @@ using MediaBrowser.Common.Net; using MediaBrowser.Common.Plugins; -using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Common.Serialization; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.System; using System; using System.Collections.Generic; -using System.Reflection; using System.Threading.Tasks; namespace MediaBrowser.Common.Kernel @@ -70,12 +68,6 @@ namespace MediaBrowser.Common.Kernel SystemInfo GetSystemInfo(); /// <summary> - /// Gets the scheduled tasks. - /// </summary> - /// <value>The scheduled tasks.</value> - IEnumerable<IScheduledTask> ScheduledTasks { get; } - - /// <summary> /// Reloads the logger. /// </summary> void ReloadLogger(); @@ -134,12 +126,6 @@ namespace MediaBrowser.Common.Kernel TcpManager TcpManager { get; } /// <summary> - /// Gets the task manager. - /// </summary> - /// <value>The task manager.</value> - TaskManager TaskManager { get; } - - /// <summary> /// Gets the web socket listeners. /// </summary> /// <value>The web socket listeners.</value> @@ -161,12 +147,6 @@ namespace MediaBrowser.Common.Kernel event EventHandler<EventArgs> ConfigurationUpdated; /// <summary> - /// Gets the assemblies. - /// </summary> - /// <value>The assemblies.</value> - Assembly[] Assemblies { get; } - - /// <summary> /// Gets the rest services. /// </summary> /// <value>The rest services.</value> diff --git a/MediaBrowser.Common/Localization/LocalizedStringData.cs b/MediaBrowser.Common/Localization/LocalizedStringData.cs deleted file mode 100644 index a507c7b6be..0000000000 --- a/MediaBrowser.Common/Localization/LocalizedStringData.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.IO; -using System.Xml.Serialization; - -namespace MediaBrowser.Common.Localization -{ - /// <summary> - /// Class LocalizedStringData - /// </summary> - public class LocalizedStringData - { - /// <summary> - /// The this version - /// </summary> - [XmlIgnore] - public string ThisVersion = "1.0000"; - /// <summary> - /// The prefix - /// </summary> - [XmlIgnore] - public string Prefix = ""; - /// <summary> - /// The file name - /// </summary> - public string FileName; //this is public so it will serialize and we know where to save ourselves - /// <summary> - /// The version - /// </summary> - public string Version = ""; //this will get saved so we can check it against us for changes - - /// <summary> - /// Saves this instance. - /// </summary> - public void Save() - { - Save(FileName); - } - - /// <summary> - /// Saves the specified file. - /// </summary> - /// <param name="file">The file.</param> - public void Save(string file) - { - var xs = new XmlSerializer(GetType()); - using (var fs = new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None)) - { - xs.Serialize(fs, this); - } - } - } -} diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj index 0f0c58f178..6542ab81d2 100644 --- a/MediaBrowser.Common/MediaBrowser.Common.csproj +++ b/MediaBrowser.Common/MediaBrowser.Common.csproj @@ -41,9 +41,6 @@ <Reference Include="Alchemy"> <HintPath>..\packages\Alchemy.2.2.1\lib\net40\Alchemy.dll</HintPath> </Reference> - <Reference Include="MoreLinq"> - <HintPath>..\packages\morelinq.1.0.15631-beta\lib\net35\MoreLinq.dll</HintPath> - </Reference> <Reference Include="NLog"> <HintPath>..\packages\NLog.2.0.0.2000\lib\net40\NLog.dll</HintPath> </Reference> @@ -92,7 +89,6 @@ <HintPath>..\packages\ServiceStack.Text.3.9.37\lib\net35\ServiceStack.Text.dll</HintPath> </Reference> <Reference Include="System" /> - <Reference Include="System.ComponentModel.Composition" /> <Reference Include="System.Configuration" /> <Reference Include="System.Core" /> <Reference Include="System.Management" /> @@ -128,7 +124,6 @@ <Compile Include="Events\GenericEventArgs.cs" /> <Compile Include="Extensions\NamedLock.cs" /> <Compile Include="Extensions\ResourceNotFoundException.cs" /> - <Compile Include="IO\FileSystem.cs" /> <Compile Include="IO\FileSystemRepository.cs" /> <Compile Include="IO\IIsoManager.cs" /> <Compile Include="IO\IIsoMount.cs" /> @@ -141,8 +136,6 @@ <Compile Include="Kernel\IApplicationHost.cs" /> <Compile Include="Kernel\IKernel.cs" /> <Compile Include="Kernel\TcpManager.cs" /> - <Compile Include="Localization\LocalizedStringData.cs" /> - <Compile Include="Mef\MefUtils.cs" /> <Compile Include="Net\AlchemyWebSocket.cs" /> <Compile Include="Net\BaseRestService.cs" /> <Compile Include="Net\Handlers\BaseActionHandler.cs" /> @@ -150,6 +143,7 @@ <Compile Include="Net\Handlers\StaticFileHandler.cs" /> <Compile Include="Net\HttpManager.cs" /> <Compile Include="Net\IRestfulService.cs" /> + <Compile Include="Net\IUdpServer.cs" /> <Compile Include="Net\IWebSocket.cs" /> <Compile Include="Net\MimeTypes.cs" /> <Compile Include="Net\NativeWebSocket.cs" /> @@ -165,6 +159,7 @@ <DesignTime>True</DesignTime> <DependentUpon>Resources.resx</DependentUpon> </Compile> + <Compile Include="ScheduledTasks\ITaskManager.cs" /> <Compile Include="ScheduledTasks\TaskManager.cs" /> <Compile Include="ScheduledTasks\Tasks\ReloadLoggerTask.cs" /> <Compile Include="ScheduledTasks\ScheduledTaskHelpers.cs" /> @@ -229,6 +224,9 @@ <ItemGroup /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(SolutionDir)\.nuget\nuget.targets" /> + <PropertyGroup> + <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\" /y /d /r /i</PostBuildEvent> + </PropertyGroup> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. <Target Name="BeforeBuild"> diff --git a/MediaBrowser.Common/Mef/MefUtils.cs b/MediaBrowser.Common/Mef/MefUtils.cs deleted file mode 100644 index 744f6cd809..0000000000 --- a/MediaBrowser.Common/Mef/MefUtils.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.Composition.Hosting; -using System.ComponentModel.Composition.Primitives; -using System.Linq; -using System.Reflection; - -namespace MediaBrowser.Common.Mef -{ - /// <summary> - /// Class MefUtils - /// </summary> - public static class MefUtils - { - /// <summary> - /// Plugins that live on both the server and UI are going to have references to assemblies from both sides. - /// But looks for Parts on one side, it will throw an exception when it seems Types from the other side that it doesn't have a reference to. - /// For example, a plugin provides a Resolver. When MEF runs in the UI, it will throw an exception when it sees the resolver because there won't be a reference to the base class. - /// This method will catch those exceptions while retining the list of Types that MEF is able to resolve. - /// </summary> - /// <param name="catalogs">The catalogs.</param> - /// <returns>CompositionContainer.</returns> - /// <exception cref="System.ArgumentNullException">catalogs</exception> - public static CompositionContainer GetSafeCompositionContainer(IEnumerable<ComposablePartCatalog> catalogs) - { - if (catalogs == null) - { - throw new ArgumentNullException("catalogs"); - } - - var newList = new List<ComposablePartCatalog>(); - - // Go through each Catalog - foreach (var catalog in catalogs) - { - try - { - // Try to have MEF find Parts - catalog.Parts.ToArray(); - - // If it succeeds we can use the entire catalog - newList.Add(catalog); - } - catch (ReflectionTypeLoadException ex) - { - // If it fails we can still get a list of the Types it was able to resolve and create TypeCatalogs - var typeCatalogs = ex.Types.Where(t => t != null).Select(t => new TypeCatalog(t)); - newList.AddRange(typeCatalogs); - } - } - - return new CompositionContainer(new AggregateCatalog(newList)); - } - - /// <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 - /// </summary> - /// <param name="assembly">The assembly.</param> - /// <returns>IEnumerable{Type}.</returns> - /// <exception cref="System.ArgumentNullException">assembly</exception> - public static IEnumerable<Type> GetTypes(Assembly assembly) - { - if (assembly == null) - { - throw new ArgumentNullException("assembly"); - } - - try - { - return assembly.GetTypes(); - } - catch (ReflectionTypeLoadException ex) - { - // If it fails we can still get a list of the Types it was able to resolve - return ex.Types.Where(t => t != null); - } - } - } -} diff --git a/MediaBrowser.Common/Net/HttpServer.cs b/MediaBrowser.Common/Net/HttpServer.cs index b09c95da03..20ee615ada 100644 --- a/MediaBrowser.Common/Net/HttpServer.cs +++ b/MediaBrowser.Common/Net/HttpServer.cs @@ -4,6 +4,7 @@ using MediaBrowser.Common.Kernel; using MediaBrowser.Model.Logging; using ServiceStack.Api.Swagger; using ServiceStack.Common.Web; +using ServiceStack.Configuration; using ServiceStack.Logging.NLogger; using ServiceStack.ServiceHost; using ServiceStack.ServiceInterface.Cors; @@ -153,6 +154,8 @@ namespace MediaBrowser.Common.Net DebugMode = true }); } + + container.Adapter = new ContainerAdapter(ApplicationHost); container.Register(Kernel); container.Register(_logger); @@ -464,4 +467,23 @@ namespace MediaBrowser.Common.Net /// <value>The endpoint.</value> public IPEndPoint Endpoint { get; set; } } + + class ContainerAdapter : IContainerAdapter + { + private readonly IApplicationHost _appHost; + + public ContainerAdapter(IApplicationHost appHost) + { + _appHost = appHost; + } + public T Resolve<T>() + { + return _appHost.Resolve<T>(); + } + + public T TryResolve<T>() + { + return _appHost.TryResolve<T>(); + } + } }
\ No newline at end of file diff --git a/MediaBrowser.Common/Net/IUdpServer.cs b/MediaBrowser.Common/Net/IUdpServer.cs new file mode 100644 index 0000000000..01a8ef0218 --- /dev/null +++ b/MediaBrowser.Common/Net/IUdpServer.cs @@ -0,0 +1,7 @@ + +namespace MediaBrowser.Common.Net +{ + public interface IUdpServer + { + } +} diff --git a/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs b/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs index 395c73a847..845faf31a7 100644 --- a/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs +++ b/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs @@ -17,7 +17,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// </summary> /// <typeparam name="TKernelType">The type of the T kernel type.</typeparam> public abstract class BaseScheduledTask<TKernelType> : IScheduledTask - where TKernelType : IKernel + where TKernelType : class, IKernel { /// <summary> /// Gets the kernel. @@ -26,6 +26,47 @@ namespace MediaBrowser.Common.ScheduledTasks protected TKernelType Kernel { get; private set; } /// <summary> + /// Gets the logger. + /// </summary> + /// <value>The logger.</value> + protected ILogger Logger { get; private set; } + + /// <summary> + /// Gets the task manager. + /// </summary> + /// <value>The task manager.</value> + protected ITaskManager TaskManager { get; private set; } + + /// <summary> + /// Initializes a new instance of the <see cref="BaseScheduledTask{TKernelType}" /> class. + /// </summary> + /// <param name="kernel">The kernel.</param> + /// <param name="taskManager">The task manager.</param> + /// <param name="logger">The logger.</param> + /// <exception cref="System.ArgumentNullException">kernel</exception> + protected BaseScheduledTask(TKernelType kernel, ITaskManager taskManager, ILogger logger) + { + if (kernel == null) + { + throw new ArgumentNullException("kernel"); + } + if (taskManager == null) + { + throw new ArgumentNullException("taskManager"); + } + if (logger == null) + { + throw new ArgumentNullException("logger"); + } + + Kernel = kernel; + TaskManager = taskManager; + Logger = logger; + + ReloadTriggerEvents(true); + } + + /// <summary> /// The _last execution result /// </summary> private TaskResult _lastExecutionResult; @@ -199,7 +240,7 @@ namespace MediaBrowser.Common.ScheduledTasks try { return JsonSerializer.DeserializeFromFile<IEnumerable<TaskTriggerInfo>>(ConfigurationFilePath) - .Select(t => ScheduledTaskHelpers.GetTrigger(t, Kernel)) + .Select(ScheduledTaskHelpers.GetTrigger) .ToList(); } catch (IOException) @@ -228,7 +269,7 @@ namespace MediaBrowser.Common.ScheduledTasks _triggersInitialized = true; - ReloadTriggerEvents(); + ReloadTriggerEvents(false); JsonSerializer.SerializeToFile(_triggers.Select(ScheduledTaskHelpers.GetTriggerInfo), ConfigurationFilePath); } @@ -291,28 +332,10 @@ namespace MediaBrowser.Common.ScheduledTasks } /// <summary> - /// Gets the logger. - /// </summary> - /// <value>The logger.</value> - protected ILogger Logger { get; private set; } - - /// <summary> - /// Initializes the specified kernel. - /// </summary> - /// <param name="kernel">The kernel.</param> - /// <param name="logger">The logger.</param> - public void Initialize(IKernel kernel, ILogger logger) - { - Logger = logger; - - Kernel = (TKernelType)kernel; - ReloadTriggerEvents(); - } - - /// <summary> /// Reloads the trigger events. /// </summary> - private void ReloadTriggerEvents() + /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> + private void ReloadTriggerEvents(bool isApplicationStartup) { foreach (var trigger in Triggers) { @@ -320,7 +343,7 @@ namespace MediaBrowser.Common.ScheduledTasks trigger.Triggered -= trigger_Triggered; trigger.Triggered += trigger_Triggered; - trigger.Start(); + trigger.Start(isApplicationStartup); } } @@ -335,7 +358,7 @@ namespace MediaBrowser.Common.ScheduledTasks Logger.Info("{0} fired for task: {1}", trigger.GetType().Name, Name); - Kernel.TaskManager.QueueScheduledTask(this); + TaskManager.QueueScheduledTask(this); } /// <summary> @@ -392,7 +415,7 @@ namespace MediaBrowser.Common.ScheduledTasks CurrentCancellationTokenSource = null; CurrentProgress = null; - Kernel.TaskManager.OnTaskCompleted(this); + TaskManager.OnTaskCompleted(this); } /// <summary> diff --git a/MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs b/MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs index 5e60bb718c..ed302ed394 100644 --- a/MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs +++ b/MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs @@ -27,13 +27,13 @@ namespace MediaBrowser.Common.ScheduledTasks await Task.Delay(1000).ConfigureAwait(false); - Start(); + Start(false); } /// <summary> /// Stars waiting for the trigger action /// </summary> - protected internal abstract void Start(); + protected internal abstract void Start(bool isApplicationStartup); /// <summary> /// Stops waiting for the trigger action diff --git a/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs b/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs index c1cf1a9a33..fb749f77cf 100644 --- a/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs +++ b/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs @@ -23,7 +23,8 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Stars waiting for the trigger action /// </summary> - protected internal override void Start() + /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> + protected internal override void Start(bool isApplicationStartup) { DisposeTimer(); diff --git a/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs b/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs index 95d1edf630..cba5fc5d00 100644 --- a/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs +++ b/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs @@ -1,6 +1,4 @@ -using MediaBrowser.Common.Kernel; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Tasks; +using MediaBrowser.Model.Tasks; using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -74,13 +72,6 @@ namespace MediaBrowser.Common.ScheduledTasks void Cancel(); /// <summary> - /// Initializes the specified kernel. - /// </summary> - /// <param name="kernel">The kernel.</param> - /// <param name="logger">The logger.</param> - void Initialize(IKernel kernel, ILogger logger); - - /// <summary> /// Cancels if running. /// </summary> void CancelIfRunning(); diff --git a/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs new file mode 100644 index 0000000000..430208869a --- /dev/null +++ b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace MediaBrowser.Common.ScheduledTasks +{ + public interface ITaskManager : IDisposable + { + /// <summary> + /// Gets the list of Scheduled Tasks + /// </summary> + /// <value>The scheduled tasks.</value> + IScheduledTask[] ScheduledTasks { get; } + + /// <summary> + /// Cancels if running and queue. + /// </summary> + /// <typeparam name="T"></typeparam> + void CancelIfRunningAndQueue<T>() + where T : IScheduledTask; + + /// <summary> + /// Queues the scheduled task. + /// </summary> + /// <typeparam name="T"></typeparam> + void QueueScheduledTask<T>() + where T : IScheduledTask; + + /// <summary> + /// Queues the scheduled task. + /// </summary> + /// <param name="task">The task.</param> + void QueueScheduledTask(IScheduledTask task); + + /// <summary> + /// Adds the tasks. + /// </summary> + /// <param name="tasks">The tasks.</param> + void AddTasks(IEnumerable<IScheduledTask> tasks); + + /// <summary> + /// Called when [task completed]. + /// </summary> + /// <param name="task">The task.</param> + void OnTaskCompleted(IScheduledTask task); + } +}
\ No newline at end of file diff --git a/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs b/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs index 1ead484c84..759447b10f 100644 --- a/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs +++ b/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs @@ -23,7 +23,8 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Stars waiting for the trigger action /// </summary> - protected internal override void Start() + /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> + protected internal override void Start(bool isApplicationStartup) { DisposeTimer(); diff --git a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs index 95c4c6a666..9942da17f9 100644 --- a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs +++ b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs @@ -78,11 +78,10 @@ namespace MediaBrowser.Common.ScheduledTasks /// Converts a TaskTriggerInfo into a concrete BaseTaskTrigger /// </summary> /// <param name="info">The info.</param> - /// <param name="kernel">The kernel.</param> /// <returns>BaseTaskTrigger.</returns> /// <exception cref="System.ArgumentNullException"></exception> /// <exception cref="System.ArgumentException">Invalid trigger type: + info.Type</exception> - public static BaseTaskTrigger GetTrigger(TaskTriggerInfo info, IKernel kernel) + public static BaseTaskTrigger GetTrigger(TaskTriggerInfo info) { if (info.Type.Equals(typeof(DailyTrigger).Name, StringComparison.OrdinalIgnoreCase)) { @@ -144,7 +143,7 @@ namespace MediaBrowser.Common.ScheduledTasks if (info.Type.Equals(typeof(StartupTrigger).Name, StringComparison.OrdinalIgnoreCase)) { - return new StartupTrigger(kernel); + return new StartupTrigger(); } throw new ArgumentException("Unrecognized trigger type: " + info.Type); diff --git a/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs b/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs index 84775924ff..a254d2be9d 100644 --- a/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs +++ b/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs @@ -1,6 +1,4 @@ -using MediaBrowser.Common.Kernel; -using System; -using System.Threading.Tasks; +using System.Threading.Tasks; namespace MediaBrowser.Common.ScheduledTasks { @@ -10,33 +8,17 @@ namespace MediaBrowser.Common.ScheduledTasks public class StartupTrigger : BaseTaskTrigger { /// <summary> - /// Gets the kernel. - /// </summary> - /// <value>The kernel.</value> - protected IKernel Kernel { get; private set; } - - /// <summary> - /// Initializes a new instance of the <see cref="StartupTrigger" /> class. - /// </summary> - /// <param name="kernel">The kernel.</param> - public StartupTrigger(IKernel kernel) - { - Kernel = kernel; - } - - /// <summary> /// Stars waiting for the trigger action /// </summary> - protected internal override void Start() - { - Kernel.ReloadCompleted += Kernel_ReloadCompleted; - } - - async void Kernel_ReloadCompleted(object sender, EventArgs e) + /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> + protected internal async override void Start(bool isApplicationStartup) { - await Task.Delay(2000).ConfigureAwait(false); + if (isApplicationStartup) + { + await Task.Delay(2000).ConfigureAwait(false); - OnTriggered(); + OnTriggered(); + } } /// <summary> @@ -44,7 +26,6 @@ namespace MediaBrowser.Common.ScheduledTasks /// </summary> protected internal override void Stop() { - Kernel.ReloadCompleted -= Kernel_ReloadCompleted; } } } diff --git a/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs b/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs index 3075a8587b..45d1fae8e6 100644 --- a/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs +++ b/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs @@ -18,7 +18,8 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Stars waiting for the trigger action /// </summary> - protected internal override void Start() + /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> + protected internal override void Start(bool isApplicationStartup) { switch (SystemEvent) { diff --git a/MediaBrowser.Common/ScheduledTasks/TaskManager.cs b/MediaBrowser.Common/ScheduledTasks/TaskManager.cs index b71ab81618..946c42d2e8 100644 --- a/MediaBrowser.Common/ScheduledTasks/TaskManager.cs +++ b/MediaBrowser.Common/ScheduledTasks/TaskManager.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.Kernel; -using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Logging; using MediaBrowser.Model.Tasks; using System; using System.Collections.Generic; @@ -10,9 +9,15 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Class TaskManager /// </summary> - public class TaskManager : BaseManager<IKernel> + internal class TaskManager : ITaskManager { /// <summary> + /// Gets the list of Scheduled Tasks + /// </summary> + /// <value>The scheduled tasks.</value> + public IScheduledTask[] ScheduledTasks { get; private set; } + + /// <summary> /// The _task queue /// </summary> private readonly List<Type> _taskQueue = new List<Type>(); @@ -25,12 +30,17 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Initializes a new instance of the <see cref="TaskManager" /> class. /// </summary> - /// <param name="kernel">The kernel.</param> /// <param name="logger">The logger.</param> - public TaskManager(IKernel kernel, ILogger logger) - : base(kernel) + public TaskManager(ILogger logger) { + if (logger == null) + { + throw new ArgumentException("logger"); + } + _logger = logger; + + ScheduledTasks = new IScheduledTask[] {}; } /// <summary> @@ -40,7 +50,7 @@ namespace MediaBrowser.Common.ScheduledTasks public void CancelIfRunningAndQueue<T>() where T : IScheduledTask { - Kernel.ScheduledTasks.OfType<T>().First().CancelIfRunning(); + ScheduledTasks.OfType<T>().First().CancelIfRunning(); QueueScheduledTask<T>(); } @@ -51,7 +61,7 @@ namespace MediaBrowser.Common.ScheduledTasks public void QueueScheduledTask<T>() where T : IScheduledTask { - var scheduledTask = Kernel.ScheduledTasks.OfType<T>().First(); + var scheduledTask = ScheduledTasks.OfType<T>().First(); QueueScheduledTask(scheduledTask); } @@ -64,7 +74,7 @@ namespace MediaBrowser.Common.ScheduledTasks { var type = task.GetType(); - var scheduledTask = Kernel.ScheduledTasks.First(t => t.GetType() == type); + var scheduledTask = ScheduledTasks.First(t => t.GetType() == type); lock (_taskQueue) { @@ -91,7 +101,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// Called when [task completed]. /// </summary> /// <param name="task">The task.</param> - internal void OnTaskCompleted(IScheduledTask task) + public void OnTaskCompleted(IScheduledTask task) { // Execute queued tasks lock (_taskQueue) @@ -100,7 +110,7 @@ namespace MediaBrowser.Common.ScheduledTasks foreach (var type in copy) { - var scheduledTask = Kernel.ScheduledTasks.First(t => t.GetType() == type); + var scheduledTask = ScheduledTasks.First(t => t.GetType() == type); if (scheduledTask.State == TaskState.Idle) { @@ -111,5 +121,39 @@ namespace MediaBrowser.Common.ScheduledTasks } } } + + /// <summary> + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// </summary> + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// <summary> + /// Releases unmanaged and - optionally - managed resources. + /// </summary> + /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> + protected virtual void Dispose(bool dispose) + { + foreach (var task in ScheduledTasks) + { + task.Dispose(); + } + } + + /// <summary> + /// Adds the tasks. + /// </summary> + /// <param name="tasks">The tasks.</param> + public void AddTasks(IEnumerable<IScheduledTask> tasks) + { + var myTasks = ScheduledTasks.ToList(); + + myTasks.AddRange(tasks); + + ScheduledTasks = myTasks.ToArray(); + } } } diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs index 2a9bc4a0d8..b06134ee28 100644 --- a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs +++ b/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs @@ -1,8 +1,7 @@ using MediaBrowser.Common.Kernel; -using MediaBrowser.Model.Tasks; +using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.IO; using System.Linq; using System.Threading; @@ -13,10 +12,20 @@ namespace MediaBrowser.Common.ScheduledTasks.Tasks /// <summary> /// Deletes old cache files /// </summary> - [Export(typeof(IScheduledTask))] public class DeleteCacheFileTask : BaseScheduledTask<IKernel> { /// <summary> + /// Initializes a new instance of the <see cref="DeleteCacheFileTask" /> class. + /// </summary> + /// <param name="kernel">The kernel.</param> + /// <param name="taskManager">The task manager.</param> + /// <param name="logger">The logger.</param> + public DeleteCacheFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger) + : base(kernel, taskManager, logger) + { + } + + /// <summary> /// Creates the triggers that define when the task will run /// </summary> /// <returns>IEnumerable{BaseTaskTrigger}.</returns> diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs index a1068a2633..0b243cb108 100644 --- a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs +++ b/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs @@ -1,8 +1,7 @@ using MediaBrowser.Common.Kernel; -using MediaBrowser.Model.Tasks; +using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.IO; using System.Linq; using System.Threading; @@ -13,10 +12,20 @@ namespace MediaBrowser.Common.ScheduledTasks.Tasks /// <summary> /// Deletes old log files /// </summary> - [Export(typeof(IScheduledTask))] public class DeleteLogFileTask : BaseScheduledTask<IKernel> { /// <summary> + /// Initializes a new instance of the <see cref="DeleteLogFileTask" /> class. + /// </summary> + /// <param name="kernel">The kernel.</param> + /// <param name="taskManager">The task manager.</param> + /// <param name="logger">The logger.</param> + public DeleteLogFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger) + : base(kernel, taskManager, logger) + { + } + + /// <summary> /// Creates the triggers that define when the task will run /// </summary> /// <returns>IEnumerable{BaseTaskTrigger}.</returns> diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs index a4f06f2059..35cbe98f10 100644 --- a/MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs +++ b/MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs @@ -1,8 +1,7 @@ using MediaBrowser.Common.Kernel; -using MediaBrowser.Model.Tasks; +using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.Threading; using System.Threading.Tasks; @@ -11,10 +10,20 @@ namespace MediaBrowser.Common.ScheduledTasks.Tasks /// <summary> /// Class ReloadLoggerFileTask /// </summary> - [Export(typeof(IScheduledTask))] public class ReloadLoggerFileTask : BaseScheduledTask<IKernel> { /// <summary> + /// Initializes a new instance of the <see cref="ReloadLoggerFileTask" /> class. + /// </summary> + /// <param name="kernel">The kernel.</param> + /// <param name="taskManager">The task manager.</param> + /// <param name="logger">The logger.</param> + public ReloadLoggerFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger) + : base(kernel, taskManager, logger) + { + } + + /// <summary> /// Gets the default triggers. /// </summary> /// <returns>IEnumerable{BaseTaskTrigger}.</returns> diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs index f9950424f4..f02293a5e1 100644 --- a/MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs +++ b/MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs @@ -1,7 +1,7 @@ using MediaBrowser.Common.Kernel; +using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.Threading; using System.Threading.Tasks; @@ -10,7 +10,6 @@ namespace MediaBrowser.Common.ScheduledTasks.Tasks /// <summary> /// Plugin Update Task /// </summary> - [Export(typeof(IScheduledTask))] public class SystemUpdateTask : BaseScheduledTask<IKernel> { /// <summary> @@ -22,8 +21,11 @@ namespace MediaBrowser.Common.ScheduledTasks.Tasks /// Initializes a new instance of the <see cref="SystemUpdateTask" /> class. /// </summary> /// <param name="appHost">The app host.</param> - [ImportingConstructor] - public SystemUpdateTask([Import("appHost")] IApplicationHost appHost) + /// <param name="taskManager">The task manager.</param> + /// <param name="kernel">The kernel.</param> + /// <param name="logger">The logger.</param> + public SystemUpdateTask(IApplicationHost appHost, ITaskManager taskManager, IKernel kernel, ILogger logger) + : base(kernel, taskManager, logger) { _appHost = appHost; } diff --git a/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs b/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs index 136dc8b130..afeacc2b3d 100644 --- a/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs +++ b/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs @@ -29,7 +29,8 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Stars waiting for the trigger action /// </summary> - protected internal override void Start() + /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> + protected internal override void Start(bool isApplicationStartup) { DisposeTimer(); diff --git a/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs b/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs index f83b31322c..359cf9da06 100644 --- a/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs +++ b/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs @@ -1,11 +1,9 @@ -using MediaBrowser.Common.Mef; -using ProtoBuf; +using ProtoBuf; using ProtoBuf.Meta; using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Reflection; namespace MediaBrowser.Common.Serialization { @@ -135,21 +133,20 @@ namespace MediaBrowser.Common.Serialization /// <summary> /// Creates the specified assemblies. /// </summary> - /// <param name="assemblies">The assemblies.</param> /// <returns>DynamicProtobufSerializer.</returns> /// <exception cref="System.ArgumentNullException">assemblies</exception> - public static DynamicProtobufSerializer Create(IEnumerable<Assembly> assemblies) + public static DynamicProtobufSerializer Create(IEnumerable<Type> types) { - if (assemblies == null) + if (types == null) { - throw new ArgumentNullException("assemblies"); + throw new ArgumentNullException("types"); } var model = TypeModel.Create(); var attributeType = typeof(ProtoContractAttribute); // Find all ProtoContracts in the current assembly - foreach (var type in assemblies.SelectMany(a => MefUtils.GetTypes(a).Where(t => Attribute.IsDefined(t, attributeType)))) + foreach (var type in types.Where(t => Attribute.IsDefined(t, attributeType))) { model.Add(type, true); } diff --git a/MediaBrowser.Common/packages.config b/MediaBrowser.Common/packages.config index 4ac80b2854..536640094c 100644 --- a/MediaBrowser.Common/packages.config +++ b/MediaBrowser.Common/packages.config @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <packages> <package id="Alchemy" version="2.2.1" targetFramework="net45" /> - <package id="morelinq" version="1.0.15631-beta" targetFramework="net45" /> <package id="NLog" version="2.0.0.2000" targetFramework="net45" /> <package id="protobuf-net" version="2.0.0.621" targetFramework="net45" /> <package id="Rx-Core" version="2.0.21114" targetFramework="net45" /> |
