using MediaBrowser.Common.Configuration; using System; using System.Configuration; using System.IO; using System.Reflection; namespace MediaBrowser.Common.Implementations { /// /// Provides a base class to hold common application paths used by both the Ui and Server. /// This can be subclassed to add application-specific paths. /// public abstract class BaseApplicationPaths : IApplicationPaths { /// /// The _use debug path /// private readonly bool _useDebugPath; /// /// Initializes a new instance of the class. /// protected BaseApplicationPaths(bool useDebugPath, string applicationPath) { _useDebugPath = useDebugPath; ApplicationPath = applicationPath; } /// /// Initializes a new instance of the class. /// protected BaseApplicationPaths(string programDataPath, string applicationPath) { _programDataPath = programDataPath; ApplicationPath = applicationPath; } public string ApplicationPath { get; private set; } /// /// The _program data path /// private string _programDataPath; /// /// Gets the path to the program data folder /// /// The program data path. public string ProgramDataPath { get { return _programDataPath ?? (_programDataPath = GetProgramDataPath()); } } /// /// Gets the path to the system folder /// public string ProgramSystemPath { get { return Path.Combine(ProgramDataPath, "system"); } } /// /// The _data directory /// private string _dataDirectory; /// /// Gets the folder path to the data directory /// /// The data directory. public string DataPath { get { if (_dataDirectory == null) { _dataDirectory = Path.Combine(ProgramDataPath, "data"); Directory.CreateDirectory(_dataDirectory); } return _dataDirectory; } } /// /// The _image cache path /// private string _imageCachePath; /// /// Gets the image cache path. /// /// The image cache path. public string ImageCachePath { get { if (_imageCachePath == null) { _imageCachePath = Path.Combine(CachePath, "images"); Directory.CreateDirectory(_imageCachePath); } return _imageCachePath; } } /// /// The _plugins path /// private string _pluginsPath; /// /// Gets the path to the plugin directory /// /// The plugins path. public string PluginsPath { get { if (_pluginsPath == null) { _pluginsPath = Path.Combine(ProgramDataPath, "plugins"); Directory.CreateDirectory(_pluginsPath); } return _pluginsPath; } } /// /// The _plugin configurations path /// private string _pluginConfigurationsPath; /// /// Gets the path to the plugin configurations directory /// /// The plugin configurations path. public string PluginConfigurationsPath { get { if (_pluginConfigurationsPath == null) { _pluginConfigurationsPath = Path.Combine(PluginsPath, "configurations"); Directory.CreateDirectory(_pluginConfigurationsPath); } return _pluginConfigurationsPath; } } private string _tempUpdatePath; /// /// Gets the path to where temporary update files will be stored /// /// The plugin configurations path. public string TempUpdatePath { get { if (_tempUpdatePath == null) { _tempUpdatePath = Path.Combine(ProgramDataPath, "updates"); Directory.CreateDirectory(_tempUpdatePath); } return _tempUpdatePath; } } /// /// The _log directory path /// private string _logDirectoryPath; /// /// Gets the path to the log directory /// /// The log directory path. public string LogDirectoryPath { get { if (_logDirectoryPath == null) { _logDirectoryPath = Path.Combine(ProgramDataPath, "logs"); Directory.CreateDirectory(_logDirectoryPath); } return _logDirectoryPath; } } /// /// The _configuration directory path /// private string _configurationDirectoryPath; /// /// Gets the path to the application configuration root directory /// /// The configuration directory path. public string ConfigurationDirectoryPath { get { if (_configurationDirectoryPath == null) { _configurationDirectoryPath = Path.Combine(ProgramDataPath, "config"); Directory.CreateDirectory(_configurationDirectoryPath); } return _configurationDirectoryPath; } } /// /// Gets the path to the system configuration file /// /// The system configuration file path. public string SystemConfigurationFilePath { get { return Path.Combine(ConfigurationDirectoryPath, "system.xml"); } } /// /// The _cache directory /// private string _cachePath; /// /// Gets the folder path to the cache directory /// /// The cache directory. public string CachePath { get { if (_cachePath == null) { _cachePath = Path.Combine(ProgramDataPath, "cache"); Directory.CreateDirectory(_cachePath); } return _cachePath; } } /// /// The _temp directory /// private string _tempDirectory; /// /// Gets the folder path to the temp directory within the cache folder /// /// The temp directory. public string TempDirectory { get { if (_tempDirectory == null) { _tempDirectory = Path.Combine(CachePath, "temp"); Directory.CreateDirectory(_tempDirectory); } return _tempDirectory; } } /// /// Gets the path to the application's ProgramDataFolder /// /// System.String. private string GetProgramDataPath() { var programDataPath = _useDebugPath ? ConfigurationManager.AppSettings["DebugProgramDataPath"] : Path.Combine(ConfigurationManager.AppSettings["ReleaseProgramDataPath"], ConfigurationManager.AppSettings["ProgramDataFolderName"]); programDataPath = programDataPath.Replace("%ApplicationData%", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)); // If it's a relative path, e.g. "..\" if (!Path.IsPathRooted(programDataPath)) { var path = Path.GetDirectoryName(ApplicationPath); if (string.IsNullOrEmpty(path)) { throw new ApplicationException("Unable to determine running assembly location"); } programDataPath = Path.Combine(path, programDataPath); programDataPath = Path.GetFullPath(programDataPath); } Directory.CreateDirectory(programDataPath); return programDataPath; } } }