using System; using System.IO; using MediaBrowser.Common.Kernel; using MediaBrowser.Common.Serialization; using MediaBrowser.Model.Plugins; namespace MediaBrowser.Common.Plugins { /// /// Provides a BasePlugin with generics, allowing for strongly typed configuration access. /// public abstract class BaseGenericPlugin : BasePlugin where TConfigurationType : BasePluginConfiguration, new() { public new TConfigurationType Configuration { get { return base.Configuration as TConfigurationType; } set { base.Configuration = value; } } protected override Type ConfigurationType { get { return typeof(TConfigurationType); } } } /// /// 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 /// protected abstract Type ConfigurationType { get; } /// /// Gets the plugin version /// public Version Version { get { return GetType().Assembly.GetName().Version; } } /// /// 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 + ".xml"; } } /// /// Gets the full path to the configuration file /// public string ConfigurationFilePath { get { return Path.Combine(Kernel.ApplicationPaths.PluginConfigurationsPath, ConfigurationFileName); } } private string _DataFolderPath = null; /// /// 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; } } /// /// Starts the plugin. /// public void Initialize(IKernel kernel) { Kernel = kernel; ReloadConfiguration(); if (Enabled) { InitializeInternal(); } } /// /// Starts the plugin. /// protected virtual void InitializeInternal() { } /// /// Disposes the plugins. Undos all actions performed during Init. /// public virtual void Dispose() { } public void ReloadConfiguration() { if (!File.Exists(ConfigurationFilePath)) { Configuration = Activator.CreateInstance(ConfigurationType) as BasePluginConfiguration; } else { Configuration = JsonSerializer.DeserializeFromFile(ConfigurationType, ConfigurationFilePath) as BasePluginConfiguration; Configuration.DateLastModified = File.GetLastWriteTime(ConfigurationFilePath); } } } }