aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Common
diff options
context:
space:
mode:
authorLukePulverenti <luke.pulverenti@gmail.com>2013-02-23 10:32:54 -0500
committerLukePulverenti <luke.pulverenti@gmail.com>2013-02-23 10:32:54 -0500
commit33ed929b526acbda696f00f5966917ebd6a9ded2 (patch)
tree18e75812ce71274a3e02f800536e8c144f4e5c45 /MediaBrowser.Common
parent02634588710f65ce952d0229d7da6b9c9d341492 (diff)
parente30b96217333cadb78dcc0a47545afd145c683a7 (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')
-rw-r--r--MediaBrowser.Common/IO/FileSystem.cs336
-rw-r--r--MediaBrowser.Common/Kernel/BaseKernel.cs191
-rw-r--r--MediaBrowser.Common/Kernel/IApplicationHost.cs28
-rw-r--r--MediaBrowser.Common/Kernel/IKernel.cs20
-rw-r--r--MediaBrowser.Common/Localization/LocalizedStringData.cs51
-rw-r--r--MediaBrowser.Common/MediaBrowser.Common.csproj12
-rw-r--r--MediaBrowser.Common/Mef/MefUtils.cs80
-rw-r--r--MediaBrowser.Common/Net/HttpServer.cs22
-rw-r--r--MediaBrowser.Common/Net/IUdpServer.cs7
-rw-r--r--MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs75
-rw-r--r--MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs4
-rw-r--r--MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs3
-rw-r--r--MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs11
-rw-r--r--MediaBrowser.Common/ScheduledTasks/ITaskManager.cs46
-rw-r--r--MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs3
-rw-r--r--MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs5
-rw-r--r--MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs35
-rw-r--r--MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs3
-rw-r--r--MediaBrowser.Common/ScheduledTasks/TaskManager.cs66
-rw-r--r--MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs15
-rw-r--r--MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs15
-rw-r--r--MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs15
-rw-r--r--MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs10
-rw-r--r--MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs3
-rw-r--r--MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs13
-rw-r--r--MediaBrowser.Common/packages.config1
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" />