using MediaBrowser.Common.Kernel; using MediaBrowser.Common.Logging; using MediaBrowser.Common.Serialization; using MediaBrowser.Model.Plugins; using System; using System.IO; namespace MediaBrowser.Common.Plugins { /// /// Provides a common base class for all plugins /// public abstract class BasePlugin : IDisposable { private IKernel Kernel { get; set; } /// /// Gets or sets the plugin's current context /// protected KernelContext Context { get { return Kernel.KernelContext; } } /// /// Gets the name of the plugin /// public abstract string Name { get; } /// /// Gets the type of configuration this plugin uses /// public virtual Type ConfigurationType { get { return typeof (BasePluginConfiguration); } } /// /// Gets the plugin version /// public Version Version { get { return GetType().Assembly.GetName().Version; } } /// /// Gets the name the assembly file /// public string AssemblyFileName { get { return GetType().Assembly.GetName().Name + ".dll"; } } private DateTime? _configurationDateLastModified; public DateTime ConfigurationDateLastModified { get { if (_configurationDateLastModified == null) { if (File.Exists(ConfigurationFilePath)) { _configurationDateLastModified = File.GetLastWriteTimeUtc(ConfigurationFilePath); } } return _configurationDateLastModified ?? DateTime.MinValue; } } /// /// Gets the path to the assembly file /// public string AssemblyFilePath { get { return Path.Combine(Kernel.ApplicationPaths.PluginsPath, AssemblyFileName); } } /// /// Gets or sets the current plugin configuration /// public BasePluginConfiguration Configuration { get; protected set; } /// /// Gets the name of the configuration file. Subclasses should override /// public virtual string ConfigurationFileName { get { return Name.Replace(" ", string.Empty) + ".xml"; } } /// /// Gets the full path to the configuration file /// public string ConfigurationFilePath { get { return Path.Combine(Kernel.ApplicationPaths.PluginConfigurationsPath, ConfigurationFileName); } } private string _dataFolderPath; /// /// Gets the full path to the data folder, where the plugin can store any miscellaneous files needed /// public string DataFolderPath { get { if (_dataFolderPath == null) { // Give the folder name the same name as the config file name // We can always make this configurable if/when needed _dataFolderPath = Path.Combine(Kernel.ApplicationPaths.PluginsPath, Path.GetFileNameWithoutExtension(ConfigurationFileName)); if (!Directory.Exists(_dataFolderPath)) { Directory.CreateDirectory(_dataFolderPath); } } return _dataFolderPath; } } public bool Enabled { get { return Configuration.Enabled; } } /// /// Returns true or false indicating if the plugin should be downloaded and run within the Ui. /// public virtual bool DownloadToUi { get { return false; } } public void Initialize(IKernel kernel) { Initialize(kernel, true); } /// /// Starts the plugin. /// public void Initialize(IKernel kernel, bool loadFeatures) { Kernel = kernel; if (loadFeatures) { ReloadConfiguration(); if (Enabled) { if (kernel.KernelContext == KernelContext.Server) { InitializeOnServer(); } else if (kernel.KernelContext == KernelContext.Ui) { InitializeInUi(); } } } } /// /// Starts the plugin on the server /// protected virtual void InitializeOnServer() { } /// /// Starts the plugin in the Ui /// protected virtual void InitializeInUi() { } /// /// Disposes the plugins. Undos all actions performed during Init. /// public void Dispose() { Logger.LogInfo("Disposing {0} Plugin", Name); if (Context == KernelContext.Server) { DisposeOnServer(); } else if (Context == KernelContext.Ui) { InitializeInUi(); } } /// /// Disposes the plugin on the server /// protected virtual void DisposeOnServer() { } /// /// Disposes the plugin in the Ui /// protected virtual void DisposeInUi() { } public void ReloadConfiguration() { if (!File.Exists(ConfigurationFilePath)) { Configuration = Activator.CreateInstance(ConfigurationType) as BasePluginConfiguration; XmlSerializer.SerializeToFile(Configuration, ConfigurationFilePath); } else { Configuration = XmlSerializer.DeserializeFromFile(ConfigurationType, ConfigurationFilePath) as BasePluginConfiguration; } // Reset this so it will be loaded again next time it's accessed _configurationDateLastModified = null; } } }