using BDInfo; using MediaBrowser.ClickOnce; using MediaBrowser.Common.Implementations; using MediaBrowser.Common.Implementations.HttpClientManager; using MediaBrowser.Common.Implementations.HttpServer; using MediaBrowser.Common.Implementations.Logging; using MediaBrowser.Common.Implementations.NetworkManagement; using MediaBrowser.Common.Implementations.ScheduledTasks; using MediaBrowser.Common.Implementations.Serialization; using MediaBrowser.Common.Implementations.ServerManager; using MediaBrowser.Common.Implementations.Udp; using MediaBrowser.Common.Implementations.WebSocket; using MediaBrowser.Common.IO; using MediaBrowser.Common.Kernel; using MediaBrowser.Common.Net; using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller; using MediaBrowser.IsoMounter; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.System; using MediaBrowser.Model.Updates; using MediaBrowser.Server.Implementations; using MediaBrowser.ServerApplication.Implementations; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.ServerApplication { /// /// Class CompositionRoot /// public class ApplicationHost : BaseApplicationHost, IApplicationHost { /// /// Gets or sets the kernel. /// /// The kernel. internal Kernel Kernel { get; private set; } /// /// The json serializer /// private readonly IJsonSerializer _jsonSerializer = new JsonSerializer(); /// /// The _XML serializer /// private readonly IXmlSerializer _xmlSerializer = new XmlSerializer(); /// /// Gets the server application paths. /// /// The server application paths. protected IServerApplicationPaths ServerApplicationPaths { get { return (IServerApplicationPaths) ApplicationPaths; } } /// /// Initializes a new instance of the class. /// /// The logger. public ApplicationHost() : base() { Logger.Info("ApplicationHost!!!!!!!!!!!!!!!!!!!!"); Kernel = new Kernel(this, ServerApplicationPaths, _xmlSerializer, Logger); var networkManager = new NetworkManager(); var serverManager = new ServerManager(this, Kernel, networkManager, _jsonSerializer, Logger); var taskManager = new TaskManager(ApplicationPaths, _jsonSerializer, Logger, serverManager); LogManager.ReloadLogger(Kernel.Configuration.EnableDebugLevelLogging ? LogSeverity.Debug : LogSeverity.Info); Logger.Info("Version {0} initializing", ApplicationVersion); var httpServer = ServerFactory.CreateServer(this, ProtobufSerializer, Logger, "Media Browser", "index.html"); RegisterResources(taskManager, httpServer, networkManager, serverManager); FindParts(taskManager, httpServer); } /// /// Gets the application paths. /// /// IApplicationPaths. protected override IApplicationPaths GetApplicationPaths() { return new ServerApplicationPaths(); } /// /// Gets the log manager. /// /// ILogManager. protected override ILogManager GetLogManager() { return new NlogManager(ApplicationPaths.LogDirectoryPath, "Server"); } /// /// Registers resources that classes will depend on /// private void RegisterResources(ITaskManager taskManager, IHttpServer httpServer, INetworkManager networkManager, IServerManager serverManager) { RegisterSingleInstance(Kernel); RegisterSingleInstance(Kernel); RegisterSingleInstance(this); RegisterSingleInstance(LogManager); RegisterSingleInstance(Logger); RegisterSingleInstance(ApplicationPaths); RegisterSingleInstance(ServerApplicationPaths); RegisterSingleInstance(taskManager); RegisterSingleInstance(new PismoIsoManager(Logger)); RegisterSingleInstance(new BdInfoExaminer()); RegisterSingleInstance(new HttpClientManager(ApplicationPaths, Logger)); RegisterSingleInstance(new DotNetZipClient()); RegisterSingleInstance(() => new AlchemyServer(Logger)); RegisterSingleInstance(_jsonSerializer); RegisterSingleInstance(_xmlSerializer); RegisterSingleInstance(ProtobufSerializer); RegisterSingleInstance(new UdpServer(Logger), false); RegisterSingleInstance(httpServer, false); RegisterSingleInstance(networkManager); RegisterSingleInstance(serverManager); } /// /// Finds the parts. /// private void FindParts(ITaskManager taskManager, IHttpServer httpServer) { taskManager.AddTasks(GetExports(false)); httpServer.Init(GetExports(false)); } /// /// Restarts this instance. /// public void Restart() { App.Instance.Restart(); } /// /// Gets or sets a value indicating whether this instance can self update. /// /// true if this instance can self update; otherwise, false. public bool CanSelfUpdate { get { return ClickOnceHelper.IsNetworkDeployed; } } /// /// Checks for update. /// /// The cancellation token. /// The progress. /// Task{CheckForUpdateResult}. public Task CheckForApplicationUpdate(CancellationToken cancellationToken, IProgress progress) { return new ApplicationUpdateCheck().CheckForApplicationUpdate(cancellationToken, progress); } /// /// Updates the application. /// /// The cancellation token. /// The progress. /// Task. public Task UpdateApplication(CancellationToken cancellationToken, IProgress progress) { return new ApplicationUpdater().UpdateApplication(cancellationToken, progress); } /// /// Gets the composable part assemblies. /// /// IEnumerable{Assembly}. protected override IEnumerable GetComposablePartAssemblies() { // Gets all plugin assemblies by first reading all bytes of the .dll and calling Assembly.Load against that // This will prevent the .dll file from getting locked, and allow us to replace it when needed foreach (var pluginAssembly in Directory .EnumerateFiles(ApplicationPaths.PluginsPath, "*.dll", SearchOption.TopDirectoryOnly) .Select(LoadAssembly).Where(a => a != null)) { yield return pluginAssembly; } var runningDirectory = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); var corePluginDirectory = Path.Combine(runningDirectory, "CorePlugins"); // This will prevent the .dll file from getting locked, and allow us to replace it when needed foreach (var pluginAssembly in Directory .EnumerateFiles(corePluginDirectory, "*.dll", SearchOption.TopDirectoryOnly) .Select(LoadAssembly).Where(a => a != null)) { yield return pluginAssembly; } // Include composable parts in the Model assembly yield return typeof(SystemInfo).Assembly; // Include composable parts in the Common assembly yield return typeof(IKernel).Assembly; // Include composable parts in the Controller assembly yield return typeof(Kernel).Assembly; // Common implementations yield return typeof(TaskManager).Assembly; // Server implementations yield return typeof(ServerApplicationPaths).Assembly; // Include composable parts in the running assembly yield return GetType().Assembly; } /// /// Shuts down. /// public void Shutdown() { App.Instance.Shutdown(); } } }