From 9911df11e8a96d5d7fffcd8618b63a6adb27701f Mon Sep 17 00:00:00 2001 From: LukePulverenti Date: Fri, 8 Mar 2013 00:08:27 -0500 Subject: extracted provider manager. took more off the kernel --- MediaBrowser.ServerApplication/App.xaml.cs | 8 +- MediaBrowser.ServerApplication/ApplicationHost.cs | 143 +++++++++++-- .../EntryPoints/NewItemNotifier.cs | 148 ++++++++++++++ .../EntryPoints/RefreshUsersMetadata.cs | 41 ++++ .../EntryPoints/StartupWizard.cs | 65 ++++++ .../EntryPoints/WebSocketEvents.cs | 221 +++++++++++++++++++++ MediaBrowser.ServerApplication/MainWindow.xaml.cs | 19 +- .../MediaBrowser.ServerApplication.csproj | 15 +- MediaBrowser.ServerApplication/NewItemNotifier.cs | 148 -------------- MediaBrowser.ServerApplication/StartupWizard.cs | 65 ------ MediaBrowser.ServerApplication/WebSocketEvents.cs | 221 --------------------- 11 files changed, 624 insertions(+), 470 deletions(-) create mode 100644 MediaBrowser.ServerApplication/EntryPoints/NewItemNotifier.cs create mode 100644 MediaBrowser.ServerApplication/EntryPoints/RefreshUsersMetadata.cs create mode 100644 MediaBrowser.ServerApplication/EntryPoints/StartupWizard.cs create mode 100644 MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs delete mode 100644 MediaBrowser.ServerApplication/NewItemNotifier.cs delete mode 100644 MediaBrowser.ServerApplication/StartupWizard.cs delete mode 100644 MediaBrowser.ServerApplication/WebSocketEvents.cs (limited to 'MediaBrowser.ServerApplication') diff --git a/MediaBrowser.ServerApplication/App.xaml.cs b/MediaBrowser.ServerApplication/App.xaml.cs index a3e273438..0155d0c90 100644 --- a/MediaBrowser.ServerApplication/App.xaml.cs +++ b/MediaBrowser.ServerApplication/App.xaml.cs @@ -156,13 +156,13 @@ namespace MediaBrowser.ServerApplication { CompositionRoot = new ApplicationHost(); - var win = new MainWindow(CompositionRoot.LogManager, CompositionRoot, CompositionRoot.ServerConfigurationManager); - Logger = CompositionRoot.LogManager.GetLogger("App"); - win.Show(); - await CompositionRoot.Init(); + + var win = new MainWindow(CompositionRoot.LogManager, CompositionRoot, CompositionRoot.ServerConfigurationManager, CompositionRoot.UserManager, CompositionRoot.LibraryManager, CompositionRoot.JsonSerializer); + + win.Show(); } catch (Exception ex) { diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs index df3765818..2eccee066 100644 --- a/MediaBrowser.ServerApplication/ApplicationHost.cs +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -2,18 +2,24 @@ using MediaBrowser.Common; using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Constants; -using MediaBrowser.Common.Events; using MediaBrowser.Common.Implementations; using MediaBrowser.Common.Implementations.ScheduledTasks; using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; -using MediaBrowser.Common.Updates; using MediaBrowser.Controller; using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Localization; +using MediaBrowser.Controller.MediaInfo; +using MediaBrowser.Controller.Persistence; +using MediaBrowser.Controller.Plugins; +using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Resolvers; using MediaBrowser.Controller.Updates; +using MediaBrowser.Controller.Weather; using MediaBrowser.IsoMounter; using MediaBrowser.Model.IO; using MediaBrowser.Model.MediaInfo; @@ -23,7 +29,9 @@ using MediaBrowser.Server.Implementations; using MediaBrowser.Server.Implementations.BdInfo; using MediaBrowser.Server.Implementations.Configuration; using MediaBrowser.Server.Implementations.HttpServer; +using MediaBrowser.Server.Implementations.IO; using MediaBrowser.Server.Implementations.Library; +using MediaBrowser.Server.Implementations.Providers; using MediaBrowser.Server.Implementations.ServerManager; using MediaBrowser.Server.Implementations.Udp; using MediaBrowser.Server.Implementations.Updates; @@ -78,23 +86,73 @@ namespace MediaBrowser.ServerApplication return new ServerConfigurationManager(ApplicationPaths, LogManager, XmlSerializer); } + /// + /// Gets or sets the installation manager. + /// + /// The installation manager. private IInstallationManager InstallationManager { get; set; } + /// + /// Gets or sets the server manager. + /// + /// The server manager. private IServerManager ServerManager { get; set; } - + /// + /// Gets or sets the user manager. + /// + /// The user manager. + public IUserManager UserManager { get; set; } + /// + /// Gets or sets the library manager. + /// + /// The library manager. + internal ILibraryManager LibraryManager { get; set; } + /// + /// Gets or sets the directory watchers. + /// + /// The directory watchers. + private IDirectoryWatchers DirectoryWatchers { get; set; } + /// + /// Gets or sets the provider manager. + /// + /// The provider manager. + private IProviderManager ProviderManager { get; set; } + /// + /// Gets or sets the zip client. + /// + /// The zip client. + private IZipClient ZipClient { get; set; } + /// + /// Gets or sets the HTTP server. + /// + /// The HTTP server. + private IHttpServer HttpServer { get; set; } + + /// + /// Inits this instance. + /// + /// Task. public override async Task Init() { await base.Init().ConfigureAwait(false); - await ServerKernel.Init().ConfigureAwait(false); + Task.Run(async () => + { + await ServerKernel.LoadRepositories(ServerConfigurationManager).ConfigureAwait(false); + + DirectoryWatchers.Start(); + + Parallel.ForEach(GetExports(), entryPoint => entryPoint.Run()); + }); } /// /// Registers resources that classes will depend on /// + /// Task. protected override async Task RegisterResources() { - ServerKernel = new Kernel(this, XmlSerializer, LogManager, ServerConfigurationManager); - + ServerKernel = new Kernel(ServerConfigurationManager); + await base.RegisterResources().ConfigureAwait(false); RegisterSingleInstance(this); @@ -108,20 +166,66 @@ namespace MediaBrowser.ServerApplication RegisterSingleInstance(new PismoIsoManager(Logger)); RegisterSingleInstance(new BdInfoExaminer()); - RegisterSingleInstance(new DotNetZipClient()); - RegisterSingleInstance(ServerFactory.CreateServer(this, ProtobufSerializer, Logger, "Media Browser", "index.html"), false); + + ZipClient = new DotNetZipClient(); + RegisterSingleInstance(ZipClient); + + HttpServer = ServerFactory.CreateServer(this, ProtobufSerializer, Logger, "Media Browser", "index.html"); + RegisterSingleInstance(HttpServer, false); ServerManager = new ServerManager(this, NetworkManager, JsonSerializer, Logger, ServerConfigurationManager, ServerKernel); RegisterSingleInstance(ServerManager); - var userManager = new UserManager(ServerKernel, Logger, ServerConfigurationManager); + UserManager = new UserManager(ServerKernel, Logger, ServerConfigurationManager); + RegisterSingleInstance(UserManager); - RegisterSingleInstance(userManager); - - RegisterSingleInstance(new LibraryManager(ServerKernel, Logger, TaskManager, userManager, ServerConfigurationManager)); + LibraryManager = new LibraryManager(ServerKernel, Logger, TaskManager, UserManager, ServerConfigurationManager); + RegisterSingleInstance(LibraryManager); InstallationManager = new InstallationManager(HttpClient, PackageManager, JsonSerializer, Logger, this); RegisterSingleInstance(InstallationManager); + + DirectoryWatchers = new DirectoryWatchers(LogManager, TaskManager, LibraryManager, ServerConfigurationManager); + RegisterSingleInstance(DirectoryWatchers); + + ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, DirectoryWatchers, LogManager); + RegisterSingleInstance(ProviderManager); + + SetKernelProperties(); + SetStaticProperties(); + } + + /// + /// Sets the kernel properties. + /// + private void SetKernelProperties() + { + ServerKernel.FFMpegManager = new FFMpegManager(ServerKernel, ZipClient, JsonSerializer, ProtobufSerializer, LogManager, ApplicationPaths); + ServerKernel.ImageManager = new ImageManager(ServerKernel, ProtobufSerializer, LogManager.GetLogger("ImageManager"), ApplicationPaths); + + ServerKernel.UserDataRepositories = GetExports(); + ServerKernel.UserRepositories = GetExports(); + ServerKernel.DisplayPreferencesRepositories = GetExports(); + ServerKernel.ItemRepositories = GetExports(); + ServerKernel.WeatherProviders = GetExports(); + ServerKernel.ImageEnhancers = GetExports().OrderBy(e => e.Priority).ToArray(); + ServerKernel.StringFiles = GetExports(); + } + + /// + /// Dirty hacks + /// + private void SetStaticProperties() + { + // For now there's no real way to inject these properly + BaseItem.Logger = LogManager.GetLogger("BaseItem"); + BaseItem.ConfigurationManager = ServerConfigurationManager; + BaseItem.LibraryManager = LibraryManager; + BaseItem.ProviderManager = ProviderManager; + User.XmlSerializer = XmlSerializer; + User.UserManager = UserManager; + Ratings.ConfigurationManager = ServerConfigurationManager; + LocalizedStrings.ApplicationPaths = ApplicationPaths; } /// @@ -131,12 +235,14 @@ namespace MediaBrowser.ServerApplication { base.FindParts(); - Resolve().Init(GetExports(false)); - Resolve().AddWebSocketListeners(GetExports(false)); + HttpServer.Init(GetExports(false)); + + ServerManager.AddWebSocketListeners(GetExports(false)); + ServerManager.Start(); - Resolve().Start(); + LibraryManager.AddParts(GetExports(), GetExports(), GetExports(), GetExports()); - Resolve().AddParts(GetExports(), GetExports(), GetExports(), GetExports()); + ProviderManager.AddMetadataProviders(GetExports().OrderBy(e => e.Priority).ToArray()); } /// @@ -164,9 +270,8 @@ namespace MediaBrowser.ServerApplication /// Task{CheckForUpdateResult}. public async override Task CheckForApplicationUpdate(CancellationToken cancellationToken, IProgress progress) { - var pkgManager = Resolve(); - var availablePackages = await pkgManager.GetAvailablePackages(CancellationToken.None).ConfigureAwait(false); - var version = Resolve().GetLatestCompatibleVersion(availablePackages, Constants.MBServerPkgName, ConfigurationManager.CommonConfiguration.SystemUpdateLevel); + var availablePackages = await PackageManager.GetAvailablePackages(CancellationToken.None).ConfigureAwait(false); + var version = InstallationManager.GetLatestCompatibleVersion(availablePackages, Constants.MBServerPkgName, ConfigurationManager.CommonConfiguration.SystemUpdateLevel); return version != null ? new CheckForUpdateResult { AvailableVersion = version.version, IsUpdateAvailable = version.version > ApplicationVersion, Package = version } : new CheckForUpdateResult { AvailableVersion = ApplicationVersion, IsUpdateAvailable = false }; diff --git a/MediaBrowser.ServerApplication/EntryPoints/NewItemNotifier.cs b/MediaBrowser.ServerApplication/EntryPoints/NewItemNotifier.cs new file mode 100644 index 000000000..4a1f0ac74 --- /dev/null +++ b/MediaBrowser.ServerApplication/EntryPoints/NewItemNotifier.cs @@ -0,0 +1,148 @@ +using System.Windows; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Plugins; +using MediaBrowser.Model.Logging; +using MediaBrowser.ServerApplication.Controls; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Windows.Controls.Primitives; + +namespace MediaBrowser.ServerApplication.EntryPoints +{ + /// + /// Class NewItemNotifier + /// + public class NewItemNotifier : IServerEntryPoint + { + /// + /// Holds the list of new items to display when the NewItemTimer expires + /// + private readonly List _newlyAddedItems = new List(); + + /// + /// The amount of time to wait before showing a new item notification + /// This allows us to group items together into one notification + /// + private const int NewItemDelay = 60000; + + /// + /// The current new item timer + /// + /// The new item timer. + private Timer NewItemTimer { get; set; } + + /// + /// The _library manager + /// + private readonly ILibraryManager _libraryManager; + + /// + /// The _logger + /// + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the class. + /// + /// The library manager. + /// The log manager. + public NewItemNotifier(ILibraryManager libraryManager, ILogManager logManager) + { + _logger = logManager.GetLogger("NewItemNotifier"); + _libraryManager = libraryManager; + } + + /// + /// Runs this instance. + /// + public void Run() + { + _libraryManager.LibraryChanged += libraryManager_LibraryChanged; + } + + /// + /// Handles the LibraryChanged event of the libraryManager control. + /// + /// The source of the event. + /// The instance containing the event data. + void libraryManager_LibraryChanged(object sender, ChildrenChangedEventArgs e) + { + var newItems = e.ItemsAdded.Where(i => !i.IsFolder).ToList(); + + // Use a timer to prevent lots of these notifications from showing in a short period of time + if (newItems.Count > 0) + { + lock (_newlyAddedItems) + { + _newlyAddedItems.AddRange(newItems); + + if (NewItemTimer == null) + { + NewItemTimer = new Timer(NewItemTimerCallback, null, NewItemDelay, Timeout.Infinite); + } + else + { + NewItemTimer.Change(NewItemDelay, Timeout.Infinite); + } + } + } + } + + /// + /// Called when the new item timer expires + /// + /// The state. + private void NewItemTimerCallback(object state) + { + List newItems; + + // Lock the list and release all resources + lock (_newlyAddedItems) + { + newItems = _newlyAddedItems.ToList(); + _newlyAddedItems.Clear(); + + NewItemTimer.Dispose(); + NewItemTimer = null; + } + + // Show the notification + if (newItems.Count == 1) + { + Application.Current.Dispatcher.InvokeAsync(() => + { + var window = (MainWindow)Application.Current.MainWindow; + + window.Dispatcher.InvokeAsync(() => window.MbTaskbarIcon.ShowCustomBalloon(new ItemUpdateNotification(_logger) + { + DataContext = newItems[0] + + }, PopupAnimation.Slide, 6000)); + }); + } + else if (newItems.Count > 1) + { + Application.Current.Dispatcher.InvokeAsync(() => + { + var window = (MainWindow)Application.Current.MainWindow; + + window.Dispatcher.InvokeAsync(() => window.MbTaskbarIcon.ShowCustomBalloon(new MultiItemUpdateNotification(_logger) + { + DataContext = newItems + + }, PopupAnimation.Slide, 6000)); + }); + } + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + _libraryManager.LibraryChanged -= libraryManager_LibraryChanged; + } + } +} diff --git a/MediaBrowser.ServerApplication/EntryPoints/RefreshUsersMetadata.cs b/MediaBrowser.ServerApplication/EntryPoints/RefreshUsersMetadata.cs new file mode 100644 index 000000000..735a1f655 --- /dev/null +++ b/MediaBrowser.ServerApplication/EntryPoints/RefreshUsersMetadata.cs @@ -0,0 +1,41 @@ +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Plugins; +using System.Threading; + +namespace MediaBrowser.ServerApplication.EntryPoints +{ + /// + /// Class RefreshUsersMetadata + /// + public class RefreshUsersMetadata : IServerEntryPoint + { + /// + /// The _user manager + /// + private readonly IUserManager _userManager; + + /// + /// Initializes a new instance of the class. + /// + /// The user manager. + public RefreshUsersMetadata(IUserManager userManager) + { + _userManager = userManager; + } + + /// + /// Runs this instance. + /// + public async void Run() + { + await _userManager.RefreshUsersMetadata(CancellationToken.None).ConfigureAwait(false); + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + } + } +} diff --git a/MediaBrowser.ServerApplication/EntryPoints/StartupWizard.cs b/MediaBrowser.ServerApplication/EntryPoints/StartupWizard.cs new file mode 100644 index 000000000..43d9018a1 --- /dev/null +++ b/MediaBrowser.ServerApplication/EntryPoints/StartupWizard.cs @@ -0,0 +1,65 @@ +using MediaBrowser.Common; +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Plugins; +using System.Linq; + +namespace MediaBrowser.ServerApplication.EntryPoints +{ + /// + /// Class StartupWizard + /// + public class StartupWizard : IServerEntryPoint + { + /// + /// The _app host + /// + private readonly IApplicationHost _appHost; + /// + /// The _user manager + /// + private readonly IUserManager _userManager; + + private readonly IServerConfigurationManager _configurationManager; + + /// + /// Initializes a new instance of the class. + /// + /// The app host. + /// The user manager. + public StartupWizard(IApplicationHost appHost, IUserManager userManager, IServerConfigurationManager configurationManager) + { + _appHost = appHost; + _userManager = userManager; + _configurationManager = configurationManager; + } + + /// + /// Runs this instance. + /// + public void Run() + { + if (_appHost.IsFirstRun) + { + LaunchStartupWizard(); + } + } + + /// + /// Launches the startup wizard. + /// + private void LaunchStartupWizard() + { + var user = _userManager.Users.FirstOrDefault(u => u.Configuration.IsAdministrator); + + App.OpenDashboardPage("wizardStart.html", user, _configurationManager); + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + } + } +} diff --git a/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs b/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs new file mode 100644 index 000000000..13359fced --- /dev/null +++ b/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs @@ -0,0 +1,221 @@ +using MediaBrowser.Common.Events; +using MediaBrowser.Common.Net; +using MediaBrowser.Common.Plugins; +using MediaBrowser.Common.ScheduledTasks; +using MediaBrowser.Controller; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Plugins; +using MediaBrowser.Controller.Updates; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Tasks; +using MediaBrowser.Model.Updates; +using System; + +namespace MediaBrowser.ServerApplication.EntryPoints +{ + /// + /// Class WebSocketEvents + /// + public class WebSocketEvents : IServerEntryPoint + { + /// + /// The _server manager + /// + private readonly IServerManager _serverManager; + /// + /// The _logger + /// + private readonly ILogger _logger; + + /// + /// The _user manager + /// + private readonly IUserManager _userManager; + + /// + /// The _library manager + /// + private readonly ILibraryManager _libraryManager; + + /// + /// The _installation manager + /// + private readonly IInstallationManager _installationManager; + + /// + /// The _kernel + /// + private readonly IServerApplicationHost _appHost; + + private readonly ITaskManager _taskManager; + + /// + /// Initializes a new instance of the class. + /// + /// The server manager. + /// The logger. + /// The user manager. + public WebSocketEvents(IServerManager serverManager, IServerApplicationHost appHost, ILogger logger, IUserManager userManager, ILibraryManager libraryManager, IInstallationManager installationManager, ITaskManager taskManager) + { + _serverManager = serverManager; + _logger = logger; + _userManager = userManager; + _libraryManager = libraryManager; + _installationManager = installationManager; + _appHost = appHost; + _taskManager = taskManager; + } + + public void Run() + { + _userManager.UserDeleted += userManager_UserDeleted; + _userManager.UserUpdated += userManager_UserUpdated; + + _libraryManager.LibraryChanged += libraryManager_LibraryChanged; + + _appHost.HasPendingRestartChanged += kernel_HasPendingRestartChanged; + + _installationManager.PluginUninstalled += InstallationManager_PluginUninstalled; + _installationManager.PackageInstalling += installationManager_PackageInstalling; + _installationManager.PackageInstallationCancelled += installationManager_PackageInstallationCancelled; + _installationManager.PackageInstallationCompleted += installationManager_PackageInstallationCompleted; + _installationManager.PackageInstallationFailed += installationManager_PackageInstallationFailed; + + _taskManager.TaskExecuting += _taskManager_TaskExecuting; + _taskManager.TaskCompleted += _taskManager_TaskCompleted; + } + + void _taskManager_TaskCompleted(object sender, GenericEventArgs e) + { + _serverManager.SendWebSocketMessage("ScheduledTaskEndExecute", e.Argument); + } + + void _taskManager_TaskExecuting(object sender, EventArgs e) + { + var task = (IScheduledTask) sender; + _serverManager.SendWebSocketMessage("ScheduledTaskBeginExecute", task.Name); + } + + /// + /// Installations the manager_ package installation failed. + /// + /// The sender. + /// The e. + void installationManager_PackageInstallationFailed(object sender, GenericEventArgs e) + { + _serverManager.SendWebSocketMessage("PackageInstallationFailed", e.Argument); + } + + /// + /// Installations the manager_ package installation completed. + /// + /// The sender. + /// The e. + void installationManager_PackageInstallationCompleted(object sender, GenericEventArgs e) + { + _serverManager.SendWebSocketMessage("PackageInstallationCompleted", e.Argument); + } + + /// + /// Installations the manager_ package installation cancelled. + /// + /// The sender. + /// The e. + void installationManager_PackageInstallationCancelled(object sender, GenericEventArgs e) + { + _serverManager.SendWebSocketMessage("PackageInstallationCancelled", e.Argument); + } + + /// + /// Installations the manager_ package installing. + /// + /// The sender. + /// The e. + void installationManager_PackageInstalling(object sender, GenericEventArgs e) + { + _serverManager.SendWebSocketMessage("PackageInstalling", e.Argument); + } + + /// + /// Handles the LibraryChanged event of the libraryManager control. + /// + /// The source of the event. + /// The instance containing the event data. + void libraryManager_LibraryChanged(object sender, ChildrenChangedEventArgs e) + { + _serverManager.SendWebSocketMessage("LibraryChanged", () => DtoBuilder.GetLibraryUpdateInfo(e)); + } + + /// + /// Installations the manager_ plugin uninstalled. + /// + /// The sender. + /// The e. + void InstallationManager_PluginUninstalled(object sender, GenericEventArgs e) + { + _serverManager.SendWebSocketMessage("PluginUninstalled", e.Argument.GetPluginInfo()); + } + + /// + /// Handles the HasPendingRestartChanged event of the kernel control. + /// + /// The source of the event. + /// The instance containing the event data. + void kernel_HasPendingRestartChanged(object sender, EventArgs e) + { + _serverManager.SendWebSocketMessage("HasPendingRestartChanged", _appHost.GetSystemInfo()); + } + + /// + /// Users the manager_ user updated. + /// + /// The sender. + /// The e. + void userManager_UserUpdated(object sender, GenericEventArgs e) + { + _serverManager.SendWebSocketMessage("UserUpdated", new DtoBuilder(_logger).GetDtoUser(e.Argument)); + } + + /// + /// Users the manager_ user deleted. + /// + /// The sender. + /// The e. + void userManager_UserDeleted(object sender, GenericEventArgs e) + { + _serverManager.SendWebSocketMessage("UserDeleted", e.Argument.Id.ToString()); + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + Dispose(true); + } + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool dispose) + { + if (dispose) + { + _userManager.UserDeleted -= userManager_UserDeleted; + _userManager.UserUpdated -= userManager_UserUpdated; + + _libraryManager.LibraryChanged -= libraryManager_LibraryChanged; + + _installationManager.PluginUninstalled -= InstallationManager_PluginUninstalled; + _installationManager.PackageInstalling -= installationManager_PackageInstalling; + _installationManager.PackageInstallationCancelled -= installationManager_PackageInstallationCancelled; + _installationManager.PackageInstallationCompleted -= installationManager_PackageInstallationCompleted; + _installationManager.PackageInstallationFailed -= installationManager_PackageInstallationFailed; + + _appHost.HasPendingRestartChanged -= kernel_HasPendingRestartChanged; + } + } + } +} diff --git a/MediaBrowser.ServerApplication/MainWindow.xaml.cs b/MediaBrowser.ServerApplication/MainWindow.xaml.cs index 80f959b8b..364dd9da6 100644 --- a/MediaBrowser.ServerApplication/MainWindow.xaml.cs +++ b/MediaBrowser.ServerApplication/MainWindow.xaml.cs @@ -4,6 +4,7 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Serialization; using MediaBrowser.ServerApplication.Logging; using System; using System.ComponentModel; @@ -38,7 +39,11 @@ namespace MediaBrowser.ServerApplication /// The _configuration manager /// private readonly IServerConfigurationManager _configurationManager; - + + private readonly IUserManager _userManager; + private readonly ILibraryManager _libraryManager; + private readonly IJsonSerializer _jsonSerializer; + /// /// Initializes a new instance of the class. /// @@ -46,7 +51,7 @@ namespace MediaBrowser.ServerApplication /// The logger. /// The app host. /// logger - public MainWindow(ILogManager logManager, IApplicationHost appHost, IServerConfigurationManager configurationManager) + public MainWindow(ILogManager logManager, IApplicationHost appHost, IServerConfigurationManager configurationManager, IUserManager userManager, ILibraryManager libraryManager, IJsonSerializer jsonSerializer) { if (logManager == null) { @@ -65,6 +70,9 @@ namespace MediaBrowser.ServerApplication _appHost = appHost; _logManager = logManager; _configurationManager = configurationManager; + _userManager = userManager; + _libraryManager = libraryManager; + _jsonSerializer = jsonSerializer; InitializeComponent(); @@ -209,8 +217,7 @@ namespace MediaBrowser.ServerApplication /// The instance containing the event data. private void cmOpenExplorer_click(object sender, RoutedEventArgs e) { - var explorer = (LibraryExplorer)_appHost.CreateInstance(typeof(LibraryExplorer)); - explorer.Show(); + new LibraryExplorer(_jsonSerializer, _logger, _appHost, _userManager, _libraryManager).Show(); } /// @@ -220,7 +227,7 @@ namespace MediaBrowser.ServerApplication /// The instance containing the event data. private void cmOpenDashboard_click(object sender, RoutedEventArgs e) { - var user = _appHost.Resolve().Users.FirstOrDefault(u => u.Configuration.IsAdministrator); + var user = _userManager.Users.FirstOrDefault(u => u.Configuration.IsAdministrator); OpenDashboard(user); } @@ -249,7 +256,7 @@ namespace MediaBrowser.ServerApplication /// The instance containing the event data. private void cmdBrowseLibrary_click(object sender, RoutedEventArgs e) { - var user = _appHost.Resolve().Users.FirstOrDefault(u => u.Configuration.IsAdministrator); + var user = _userManager.Users.FirstOrDefault(u => u.Configuration.IsAdministrator); App.OpenDashboardPage("index.html", user, _configurationManager); } diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj index deec2d67f..a67d61bfd 100644 --- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj +++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj @@ -158,9 +158,10 @@ - - - + + + + MSBuild:Compile Designer @@ -403,9 +404,9 @@ del "$(SolutionDir)..\Deploy\MBServer.zip" --> - - - - + + + + \ No newline at end of file diff --git a/MediaBrowser.ServerApplication/NewItemNotifier.cs b/MediaBrowser.ServerApplication/NewItemNotifier.cs deleted file mode 100644 index 4864cef62..000000000 --- a/MediaBrowser.ServerApplication/NewItemNotifier.cs +++ /dev/null @@ -1,148 +0,0 @@ -using System.Windows; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.Plugins; -using MediaBrowser.Model.Logging; -using MediaBrowser.ServerApplication.Controls; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Windows.Controls.Primitives; - -namespace MediaBrowser.ServerApplication -{ - /// - /// Class NewItemNotifier - /// - public class NewItemNotifier : IServerEntryPoint - { - /// - /// Holds the list of new items to display when the NewItemTimer expires - /// - private readonly List _newlyAddedItems = new List(); - - /// - /// The amount of time to wait before showing a new item notification - /// This allows us to group items together into one notification - /// - private const int NewItemDelay = 60000; - - /// - /// The current new item timer - /// - /// The new item timer. - private Timer NewItemTimer { get; set; } - - /// - /// The _library manager - /// - private readonly ILibraryManager _libraryManager; - - /// - /// The _logger - /// - private readonly ILogger _logger; - - /// - /// Initializes a new instance of the class. - /// - /// The library manager. - /// The log manager. - public NewItemNotifier(ILibraryManager libraryManager, ILogManager logManager) - { - _logger = logManager.GetLogger("NewItemNotifier"); - _libraryManager = libraryManager; - } - - /// - /// Runs this instance. - /// - public void Run() - { - _libraryManager.LibraryChanged += libraryManager_LibraryChanged; - } - - /// - /// Handles the LibraryChanged event of the libraryManager control. - /// - /// The source of the event. - /// The instance containing the event data. - void libraryManager_LibraryChanged(object sender, ChildrenChangedEventArgs e) - { - var newItems = e.ItemsAdded.Where(i => !i.IsFolder).ToList(); - - // Use a timer to prevent lots of these notifications from showing in a short period of time - if (newItems.Count > 0) - { - lock (_newlyAddedItems) - { - _newlyAddedItems.AddRange(newItems); - - if (NewItemTimer == null) - { - NewItemTimer = new Timer(NewItemTimerCallback, null, NewItemDelay, Timeout.Infinite); - } - else - { - NewItemTimer.Change(NewItemDelay, Timeout.Infinite); - } - } - } - } - - /// - /// Called when the new item timer expires - /// - /// The state. - private void NewItemTimerCallback(object state) - { - List newItems; - - // Lock the list and release all resources - lock (_newlyAddedItems) - { - newItems = _newlyAddedItems.ToList(); - _newlyAddedItems.Clear(); - - NewItemTimer.Dispose(); - NewItemTimer = null; - } - - // Show the notification - if (newItems.Count == 1) - { - Application.Current.Dispatcher.InvokeAsync(() => - { - var window = (MainWindow)Application.Current.MainWindow; - - window.Dispatcher.InvokeAsync(() => window.MbTaskbarIcon.ShowCustomBalloon(new ItemUpdateNotification(_logger) - { - DataContext = newItems[0] - - }, PopupAnimation.Slide, 6000)); - }); - } - else if (newItems.Count > 1) - { - Application.Current.Dispatcher.InvokeAsync(() => - { - var window = (MainWindow)Application.Current.MainWindow; - - window.Dispatcher.InvokeAsync(() => window.MbTaskbarIcon.ShowCustomBalloon(new MultiItemUpdateNotification(_logger) - { - DataContext = newItems - - }, PopupAnimation.Slide, 6000)); - }); - } - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - _libraryManager.LibraryChanged -= libraryManager_LibraryChanged; - } - } -} diff --git a/MediaBrowser.ServerApplication/StartupWizard.cs b/MediaBrowser.ServerApplication/StartupWizard.cs deleted file mode 100644 index f7946c711..000000000 --- a/MediaBrowser.ServerApplication/StartupWizard.cs +++ /dev/null @@ -1,65 +0,0 @@ -using MediaBrowser.Common; -using MediaBrowser.Controller.Configuration; -using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.Plugins; -using System.Linq; - -namespace MediaBrowser.ServerApplication -{ - /// - /// Class StartupWizard - /// - public class StartupWizard : IServerEntryPoint - { - /// - /// The _app host - /// - private readonly IApplicationHost _appHost; - /// - /// The _user manager - /// - private readonly IUserManager _userManager; - - private readonly IServerConfigurationManager _configurationManager; - - /// - /// Initializes a new instance of the class. - /// - /// The app host. - /// The user manager. - public StartupWizard(IApplicationHost appHost, IUserManager userManager, IServerConfigurationManager configurationManager) - { - _appHost = appHost; - _userManager = userManager; - _configurationManager = configurationManager; - } - - /// - /// Runs this instance. - /// - public void Run() - { - if (_appHost.IsFirstRun) - { - LaunchStartupWizard(); - } - } - - /// - /// Launches the startup wizard. - /// - private void LaunchStartupWizard() - { - var user = _userManager.Users.FirstOrDefault(u => u.Configuration.IsAdministrator); - - App.OpenDashboardPage("wizardStart.html", user, _configurationManager); - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - } - } -} diff --git a/MediaBrowser.ServerApplication/WebSocketEvents.cs b/MediaBrowser.ServerApplication/WebSocketEvents.cs deleted file mode 100644 index 43972bafc..000000000 --- a/MediaBrowser.ServerApplication/WebSocketEvents.cs +++ /dev/null @@ -1,221 +0,0 @@ -using MediaBrowser.Common.Events; -using MediaBrowser.Common.Net; -using MediaBrowser.Common.Plugins; -using MediaBrowser.Common.ScheduledTasks; -using MediaBrowser.Controller; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.Plugins; -using MediaBrowser.Controller.Updates; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Tasks; -using MediaBrowser.Model.Updates; -using System; - -namespace MediaBrowser.ServerApplication -{ - /// - /// Class WebSocketEvents - /// - public class WebSocketEvents : IServerEntryPoint - { - /// - /// The _server manager - /// - private readonly IServerManager _serverManager; - /// - /// The _logger - /// - private readonly ILogger _logger; - - /// - /// The _user manager - /// - private readonly IUserManager _userManager; - - /// - /// The _library manager - /// - private readonly ILibraryManager _libraryManager; - - /// - /// The _installation manager - /// - private readonly IInstallationManager _installationManager; - - /// - /// The _kernel - /// - private readonly IServerApplicationHost _appHost; - - private readonly ITaskManager _taskManager; - - /// - /// Initializes a new instance of the class. - /// - /// The server manager. - /// The logger. - /// The user manager. - public WebSocketEvents(IServerManager serverManager, IServerApplicationHost appHost, ILogger logger, IUserManager userManager, ILibraryManager libraryManager, IInstallationManager installationManager, ITaskManager taskManager) - { - _serverManager = serverManager; - _logger = logger; - _userManager = userManager; - _libraryManager = libraryManager; - _installationManager = installationManager; - _appHost = appHost; - _taskManager = taskManager; - } - - public void Run() - { - _userManager.UserDeleted += userManager_UserDeleted; - _userManager.UserUpdated += userManager_UserUpdated; - - _libraryManager.LibraryChanged += libraryManager_LibraryChanged; - - _appHost.HasPendingRestartChanged += kernel_HasPendingRestartChanged; - - _installationManager.PluginUninstalled += InstallationManager_PluginUninstalled; - _installationManager.PackageInstalling += installationManager_PackageInstalling; - _installationManager.PackageInstallationCancelled += installationManager_PackageInstallationCancelled; - _installationManager.PackageInstallationCompleted += installationManager_PackageInstallationCompleted; - _installationManager.PackageInstallationFailed += installationManager_PackageInstallationFailed; - - _taskManager.TaskExecuting += _taskManager_TaskExecuting; - _taskManager.TaskCompleted += _taskManager_TaskCompleted; - } - - void _taskManager_TaskCompleted(object sender, GenericEventArgs e) - { - _serverManager.SendWebSocketMessage("ScheduledTaskEndExecute", e.Argument); - } - - void _taskManager_TaskExecuting(object sender, EventArgs e) - { - var task = (IScheduledTask) sender; - _serverManager.SendWebSocketMessage("ScheduledTaskBeginExecute", task.Name); - } - - /// - /// Installations the manager_ package installation failed. - /// - /// The sender. - /// The e. - void installationManager_PackageInstallationFailed(object sender, GenericEventArgs e) - { - _serverManager.SendWebSocketMessage("PackageInstallationFailed", e.Argument); - } - - /// - /// Installations the manager_ package installation completed. - /// - /// The sender. - /// The e. - void installationManager_PackageInstallationCompleted(object sender, GenericEventArgs e) - { - _serverManager.SendWebSocketMessage("PackageInstallationCompleted", e.Argument); - } - - /// - /// Installations the manager_ package installation cancelled. - /// - /// The sender. - /// The e. - void installationManager_PackageInstallationCancelled(object sender, GenericEventArgs e) - { - _serverManager.SendWebSocketMessage("PackageInstallationCancelled", e.Argument); - } - - /// - /// Installations the manager_ package installing. - /// - /// The sender. - /// The e. - void installationManager_PackageInstalling(object sender, GenericEventArgs e) - { - _serverManager.SendWebSocketMessage("PackageInstalling", e.Argument); - } - - /// - /// Handles the LibraryChanged event of the libraryManager control. - /// - /// The source of the event. - /// The instance containing the event data. - void libraryManager_LibraryChanged(object sender, ChildrenChangedEventArgs e) - { - _serverManager.SendWebSocketMessage("LibraryChanged", () => DtoBuilder.GetLibraryUpdateInfo(e)); - } - - /// - /// Installations the manager_ plugin uninstalled. - /// - /// The sender. - /// The e. - void InstallationManager_PluginUninstalled(object sender, GenericEventArgs e) - { - _serverManager.SendWebSocketMessage("PluginUninstalled", e.Argument.GetPluginInfo()); - } - - /// - /// Handles the HasPendingRestartChanged event of the kernel control. - /// - /// The source of the event. - /// The instance containing the event data. - void kernel_HasPendingRestartChanged(object sender, EventArgs e) - { - _serverManager.SendWebSocketMessage("HasPendingRestartChanged", _appHost.GetSystemInfo()); - } - - /// - /// Users the manager_ user updated. - /// - /// The sender. - /// The e. - void userManager_UserUpdated(object sender, GenericEventArgs e) - { - _serverManager.SendWebSocketMessage("UserUpdated", new DtoBuilder(_logger).GetDtoUser(e.Argument)); - } - - /// - /// Users the manager_ user deleted. - /// - /// The sender. - /// The e. - void userManager_UserDeleted(object sender, GenericEventArgs e) - { - _serverManager.SendWebSocketMessage("UserDeleted", e.Argument.Id.ToString()); - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - Dispose(true); - } - - /// - /// Releases unmanaged and - optionally - managed resources. - /// - /// true to release both managed and unmanaged resources; false to release only unmanaged resources. - protected virtual void Dispose(bool dispose) - { - if (dispose) - { - _userManager.UserDeleted -= userManager_UserDeleted; - _userManager.UserUpdated -= userManager_UserUpdated; - - _libraryManager.LibraryChanged -= libraryManager_LibraryChanged; - - _installationManager.PluginUninstalled -= InstallationManager_PluginUninstalled; - _installationManager.PackageInstalling -= installationManager_PackageInstalling; - _installationManager.PackageInstallationCancelled -= installationManager_PackageInstallationCancelled; - _installationManager.PackageInstallationCompleted -= installationManager_PackageInstallationCompleted; - _installationManager.PackageInstallationFailed -= installationManager_PackageInstallationFailed; - - _appHost.HasPendingRestartChanged -= kernel_HasPendingRestartChanged; - } - } - } -} -- cgit v1.2.3