From 0a48b5e31aa712acd988626a88c52c47467945b2 Mon Sep 17 00:00:00 2001 From: LukePulverenti Luke Pulverenti luke pulverenti Date: Sat, 21 Jul 2012 14:39:47 -0400 Subject: Added a BaseKernel for the UI and Server to share, and made some other minor re-organizations. --- MediaBrowser.Common/Kernel/BaseKernel.cs | 130 +++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 MediaBrowser.Common/Kernel/BaseKernel.cs (limited to 'MediaBrowser.Common/Kernel/BaseKernel.cs') diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs new file mode 100644 index 000000000..d6c13ce38 --- /dev/null +++ b/MediaBrowser.Common/Kernel/BaseKernel.cs @@ -0,0 +1,130 @@ +using System.Configuration; +using System.IO; +using System.Reflection; +using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.Json; +using MediaBrowser.Common.Logging; +using MediaBrowser.Common.Net; +using MediaBrowser.Common.Plugins; + +namespace MediaBrowser.Common.Kernel +{ + /// + /// Represents a shared base kernel for both the UI and server apps + /// + public abstract class BaseKernel + where TConfigurationType : BaseConfiguration, new() + { + /// + /// Gets the path to the program data folder + /// + public string ProgramDataPath { get; private set; } + + /// + /// Gets the current configuration + /// + public TConfigurationType Configuration { get; private set; } + + /// + /// Both the UI and server will have a built-in HttpServer. + /// People will inevitably want remote control apps so it's needed in the UI too. + /// + public HttpServer HttpServer { get; private set; } + + public PluginController PluginController { get; private set; } + + /// + /// Gets the kernel context. The UI kernel will have to override this. + /// + protected KernelContext KernelContext { get { return KernelContext.Server; } } + + protected virtual string HttpServerUrlPrefix + { + get + { + return "http://+:" + Configuration.HttpServerPortNumber + "/mediabrowser/"; + } + } + + public BaseKernel() + { + ProgramDataPath = GetProgramDataPath(); + + PluginController = new PluginController() { PluginsPath = Path.Combine(ProgramDataPath, "Plugins") }; + + Logger.LoggerInstance = new FileLogger(Path.Combine(ProgramDataPath, "Logs")); + } + + public virtual void Init() + { + ReloadConfiguration(); + + ReloadHttpServer(); + + ReloadPlugins(); + } + + /// + /// Gets the path to the application's ProgramDataFolder + /// + /// + private string GetProgramDataPath() + { + string programDataPath = ConfigurationManager.AppSettings["ProgramDataPath"]; + + // If it's a relative path, e.g. "..\" + if (!Path.IsPathRooted(programDataPath)) + { + string path = Assembly.GetExecutingAssembly().Location; + path = Path.GetDirectoryName(path); + + programDataPath = Path.Combine(path, programDataPath); + + programDataPath = Path.GetFullPath(programDataPath); + } + + if (!Directory.Exists(programDataPath)) + { + Directory.CreateDirectory(programDataPath); + } + + return programDataPath; + } + + private void ReloadConfiguration() + { + // Deserialize config + Configuration = GetConfiguration(ProgramDataPath); + + Logger.LoggerInstance.LogSeverity = Configuration.LogSeverity; + } + + private void ReloadHttpServer() + { + if (HttpServer != null) + { + HttpServer.Dispose(); + } + + HttpServer = new HttpServer("http://+:" + Configuration.HttpServerPortNumber + "/mediabrowser/"); + } + + protected virtual void ReloadPlugins() + { + // Find plugins + PluginController.Init(KernelContext); + } + + private static TConfigurationType GetConfiguration(string directory) + { + string file = Path.Combine(directory, "config.js"); + + if (!File.Exists(file)) + { + return new TConfigurationType(); + } + + return JsonSerializer.DeserializeFromFile(file); + } + } +} -- cgit v1.2.3