diff options
| author | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-23 10:58:08 -0500 |
|---|---|---|
| committer | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-23 10:58:08 -0500 |
| commit | 17c1fd576057bdd2d6aea517d733fe8af6e6b2ba (patch) | |
| tree | 660f47e816a8599aabdb7ee47f3cde64c72c3f4d /MediaBrowser.UI/Controller | |
| parent | 33ed929b526acbda696f00f5966917ebd6a9ded2 (diff) | |
moved ui to it's own repo
Diffstat (limited to 'MediaBrowser.UI/Controller')
| -rw-r--r-- | MediaBrowser.UI/Controller/BaseTheme.cs | 60 | ||||
| -rw-r--r-- | MediaBrowser.UI/Controller/PluginUpdater.cs | 313 | ||||
| -rw-r--r-- | MediaBrowser.UI/Controller/UIKernel.cs | 181 |
3 files changed, 0 insertions, 554 deletions
diff --git a/MediaBrowser.UI/Controller/BaseTheme.cs b/MediaBrowser.UI/Controller/BaseTheme.cs deleted file mode 100644 index bcf882f689..0000000000 --- a/MediaBrowser.UI/Controller/BaseTheme.cs +++ /dev/null @@ -1,60 +0,0 @@ -using MediaBrowser.Model.Dto; -using System; -using System.Collections.Generic; -using System.Windows; -using System.Windows.Controls; - -namespace MediaBrowser.UI.Controller -{ - /// <summary> - /// Class BaseTheme - /// </summary> - public abstract class BaseTheme : IDisposable - { - /// <summary> - /// Gets the global resources. - /// </summary> - /// <returns>IEnumerable{ResourceDictionary}.</returns> - public abstract IEnumerable<ResourceDictionary> GetGlobalResources(); - - /// <summary> - /// Gets the list page. - /// </summary> - /// <param name="item">The item.</param> - /// <returns>Page.</returns> - public abstract Page GetListPage(BaseItemDto item); - /// <summary> - /// Gets the detail page. - /// </summary> - /// <param name="item">The item.</param> - /// <returns>Page.</returns> - public abstract Page GetDetailPage(BaseItemDto item); - /// <summary> - /// Gets the home page. - /// </summary> - /// <returns>Page.</returns> - public abstract Page GetHomePage(); - /// <summary> - /// Gets the login page. - /// </summary> - /// <returns>Page.</returns> - public abstract Page GetLoginPage(); - /// <summary> - /// Gets the internal player page. - /// </summary> - /// <returns>Page.</returns> - public abstract Page GetInternalPlayerPage(); - - /// <summary> - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// </summary> - public virtual void Dispose() - { - } - - /// <summary> - /// Displays the weather. - /// </summary> - public abstract void DisplayWeather(); - } -} diff --git a/MediaBrowser.UI/Controller/PluginUpdater.cs b/MediaBrowser.UI/Controller/PluginUpdater.cs deleted file mode 100644 index e56b6f54f2..0000000000 --- a/MediaBrowser.UI/Controller/PluginUpdater.cs +++ /dev/null @@ -1,313 +0,0 @@ -using MediaBrowser.Common.IO; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Net; -using MediaBrowser.Model.Plugins; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading.Tasks; - -namespace MediaBrowser.UI.Controller -{ - /// <summary> - /// This keeps ui plugin assemblies in sync with plugins installed on the server - /// </summary> - public class PluginUpdater - { - private readonly ILogger _logger; - - public PluginUpdater(ILogger logger) - { - _logger = logger; - } - - /// <summary> - /// Updates the plugins. - /// </summary> - /// <returns>Task{PluginUpdateResult}.</returns> - public async Task<PluginUpdateResult> UpdatePlugins() - { - _logger.Info("Downloading list of installed plugins"); - var allInstalledPlugins = await UIKernel.Instance.ApiClient.GetInstalledPluginsAsync().ConfigureAwait(false); - - var uiPlugins = allInstalledPlugins.Where(p => p.DownloadToUI).ToList(); - - var result = new PluginUpdateResult { }; - - result.DeletedPlugins = DeleteUninstalledPlugins(uiPlugins); - - await DownloadPluginAssemblies(uiPlugins, result).ConfigureAwait(false); - - result.UpdatedConfigurations = await DownloadPluginConfigurations(uiPlugins).ConfigureAwait(false); - - return result; - } - - /// <summary> - /// Downloads plugin assemblies from the server, if they need to be installed or updated. - /// </summary> - /// <param name="uiPlugins">The UI plugins.</param> - /// <param name="result">The result.</param> - /// <returns>Task.</returns> - private async Task DownloadPluginAssemblies(IEnumerable<PluginInfo> uiPlugins, PluginUpdateResult result) - { - var newlyInstalledPlugins = new List<PluginInfo>(); - var updatedPlugins = new List<PluginInfo>(); - - // Loop through the list of plugins that are on the server - foreach (var pluginInfo in uiPlugins) - { - // See if it is already installed in the UI - var currentAssemblyPath = Path.Combine(UIKernel.Instance.ApplicationPaths.PluginsPath, pluginInfo.AssemblyFileName); - - var isPluginInstalled = File.Exists(currentAssemblyPath); - - // Download the plugin if it is not present, or if the current version is out of date - bool downloadPlugin; - - if (!isPluginInstalled) - { - downloadPlugin = true; - _logger.Info("{0} is not installed and needs to be downloaded.", pluginInfo.Name); - } - else - { - var serverVersion = Version.Parse(pluginInfo.Version); - - var fileVersion = FileVersionInfo.GetVersionInfo(currentAssemblyPath).FileVersion ?? string.Empty; - - downloadPlugin = string.IsNullOrEmpty(fileVersion) || Version.Parse(fileVersion) < serverVersion; - - if (downloadPlugin) - { - _logger.Info("{0} has an updated version on the server and needs to be downloaded. Server version: {1}, UI version: {2}", pluginInfo.Name, serverVersion, fileVersion); - } - } - - if (downloadPlugin) - { - if (UIKernel.Instance.ApplicationVersion < Version.Parse(pluginInfo.MinimumRequiredUIVersion)) - { - _logger.Warn("Can't download new version of {0} because the application needs to be updated first.", pluginInfo.Name); - continue; - } - - try - { - await DownloadPlugin(pluginInfo).ConfigureAwait(false); - - if (isPluginInstalled) - { - updatedPlugins.Add(pluginInfo); - } - else - { - newlyInstalledPlugins.Add(pluginInfo); - } - } - catch (HttpException ex) - { - _logger.ErrorException("Error downloading {0} configuration", ex, pluginInfo.Name); - } - catch (IOException ex) - { - _logger.ErrorException("Error saving plugin assembly for {0}", ex, pluginInfo.Name); - } - } - } - - result.NewlyInstalledPlugins = newlyInstalledPlugins; - result.UpdatedPlugins = updatedPlugins; - } - - /// <summary> - /// Downloads plugin configurations from the server. - /// </summary> - /// <param name="uiPlugins">The UI plugins.</param> - /// <returns>Task{List{PluginInfo}}.</returns> - private async Task<List<PluginInfo>> DownloadPluginConfigurations(IEnumerable<PluginInfo> uiPlugins) - { - var updatedPlugins = new List<PluginInfo>(); - - // Loop through the list of plugins that are on the server - foreach (var pluginInfo in uiPlugins - .Where(p => UIKernel.Instance.ApplicationVersion >= Version.Parse(p.MinimumRequiredUIVersion))) - { - // See if it is already installed in the UI - var path = Path.Combine(UIKernel.Instance.ApplicationPaths.PluginConfigurationsPath, pluginInfo.ConfigurationFileName); - - var download = false; - - if (!File.Exists(path)) - { - download = true; - _logger.Info("{0} configuration was not found needs to be downloaded.", pluginInfo.Name); - } - else if (File.GetLastWriteTimeUtc(path) < pluginInfo.ConfigurationDateLastModified) - { - download = true; - _logger.Info("{0} has an updated configuration on the server and needs to be downloaded.", pluginInfo.Name); - } - - if (download) - { - if (UIKernel.Instance.ApplicationVersion < Version.Parse(pluginInfo.MinimumRequiredUIVersion)) - { - _logger.Warn("Can't download updated configuration of {0} because the application needs to be updated first.", pluginInfo.Name); - continue; - } - - try - { - await DownloadPluginConfiguration(pluginInfo, path).ConfigureAwait(false); - - updatedPlugins.Add(pluginInfo); - } - catch (HttpException ex) - { - _logger.ErrorException("Error downloading {0} configuration", ex, pluginInfo.Name); - } - catch (IOException ex) - { - _logger.ErrorException("Error saving plugin configuration to {0}", ex, path); - } - } - } - - return updatedPlugins; - } - - /// <summary> - /// Downloads a plugin assembly from the server - /// </summary> - /// <param name="plugin">The plugin.</param> - /// <returns>Task.</returns> - private async Task DownloadPlugin(PluginInfo plugin) - { - _logger.Info("Downloading {0} Plugin", plugin.Name); - - var path = Path.Combine(UIKernel.Instance.ApplicationPaths.PluginsPath, plugin.AssemblyFileName); - - // First download to a MemoryStream. This way if the download is cut off, we won't be left with a partial file - using (var memoryStream = new MemoryStream()) - { - var assemblyStream = await UIKernel.Instance.ApiClient.GetPluginAssemblyAsync(plugin).ConfigureAwait(false); - - await assemblyStream.CopyToAsync(memoryStream).ConfigureAwait(false); - - memoryStream.Position = 0; - - using (var fileStream = new FileStream(path, FileMode.Create)) - { - await memoryStream.CopyToAsync(fileStream).ConfigureAwait(false); - } - } - } - - /// <summary> - /// Downloads the latest configuration for a plugin - /// </summary> - /// <param name="pluginInfo">The plugin info.</param> - /// <param name="path">The path.</param> - /// <returns>Task.</returns> - private async Task DownloadPluginConfiguration(PluginInfo pluginInfo, string path) - { - _logger.Info("Downloading {0} Configuration", pluginInfo.Name); - - // First download to a MemoryStream. This way if the download is cut off, we won't be left with a partial file - using (var stream = await UIKernel.Instance.ApiClient.GetPluginConfigurationFileAsync(pluginInfo.Id).ConfigureAwait(false)) - { - using (var memoryStream = new MemoryStream()) - { - await stream.CopyToAsync(memoryStream).ConfigureAwait(false); - - memoryStream.Position = 0; - - using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true)) - { - await memoryStream.CopyToAsync(fs).ConfigureAwait(false); - } - } - } - - File.SetLastWriteTimeUtc(path, pluginInfo.ConfigurationDateLastModified); - } - - /// <summary> - /// Deletes any plugins that have been uninstalled from the server - /// </summary> - /// <param name="uiPlugins">The UI plugins.</param> - /// <returns>IEnumerable{System.String}.</returns> - private IEnumerable<string> DeleteUninstalledPlugins(IEnumerable<PluginInfo> uiPlugins) - { - var deletedPlugins = new List<string>(); - - foreach (var plugin in Directory.EnumerateFiles(UIKernel.Instance.ApplicationPaths.PluginsPath, "*.dll", SearchOption.TopDirectoryOnly) - .Select(Path.GetFileName) - .ToList()) - { - var serverPlugin = uiPlugins.FirstOrDefault(p => p.AssemblyFileName.Equals(plugin, StringComparison.OrdinalIgnoreCase)); - - if (serverPlugin == null) - { - try - { - DeletePlugin(plugin); - - deletedPlugins.Add(plugin); - } - catch (IOException ex) - { - _logger.ErrorException("Error deleting plugin assembly {0}", ex, plugin); - } - } - } - - return deletedPlugins; - } - - /// <summary> - /// Deletes an installed ui plugin. - /// Leaves config and data behind in the event it is later re-installed - /// </summary> - /// <param name="plugin">The plugin.</param> - private void DeletePlugin(string plugin) - { - _logger.Info("Deleting {0} Plugin", plugin); - - if (File.Exists(plugin)) - { - File.Delete(plugin); - } - } - } - - /// <summary> - /// Class PluginUpdateResult - /// </summary> - public class PluginUpdateResult - { - /// <summary> - /// Gets or sets the deleted plugins. - /// </summary> - /// <value>The deleted plugins.</value> - public IEnumerable<string> DeletedPlugins { get; set; } - /// <summary> - /// Gets or sets the newly installed plugins. - /// </summary> - /// <value>The newly installed plugins.</value> - public IEnumerable<PluginInfo> NewlyInstalledPlugins { get; set; } - /// <summary> - /// Gets or sets the updated plugins. - /// </summary> - /// <value>The updated plugins.</value> - public IEnumerable<PluginInfo> UpdatedPlugins { get; set; } - /// <summary> - /// Gets or sets the updated configurations. - /// </summary> - /// <value>The updated configurations.</value> - public IEnumerable<PluginInfo> UpdatedConfigurations { get; set; } - } -} diff --git a/MediaBrowser.UI/Controller/UIKernel.cs b/MediaBrowser.UI/Controller/UIKernel.cs deleted file mode 100644 index 118067140f..0000000000 --- a/MediaBrowser.UI/Controller/UIKernel.cs +++ /dev/null @@ -1,181 +0,0 @@ -using MediaBrowser.ApiInteraction; -using MediaBrowser.Common.Kernel; -using MediaBrowser.Model.Connectivity; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Net; -using MediaBrowser.UI.Configuration; -using MediaBrowser.UI.Playback; -using System; -using System.Collections.Generic; -using System.Net; -using System.Net.Cache; -using System.Net.Http; -using System.Threading.Tasks; - -namespace MediaBrowser.UI.Controller -{ - /// <summary> - /// This controls application logic as well as server interaction within the UI. - /// </summary> - public class UIKernel : BaseKernel<UIApplicationConfiguration, UIApplicationPaths> - { - /// <summary> - /// Gets the instance. - /// </summary> - /// <value>The instance.</value> - public static UIKernel Instance { get; private set; } - - /// <summary> - /// Gets the API client. - /// </summary> - /// <value>The API client.</value> - public ApiClient ApiClient { get; private set; } - - /// <summary> - /// Gets the playback manager. - /// </summary> - /// <value>The playback manager.</value> - public PlaybackManager PlaybackManager { get; private set; } - - /// <summary> - /// Initializes a new instance of the <see cref="UIKernel" /> class. - /// </summary> - public UIKernel(IApplicationHost appHost, ILogger logger) - : base(appHost, logger) - { - Instance = this; - } - - /// <summary> - /// Gets the media players. - /// </summary> - /// <value>The media players.</value> - public IEnumerable<BaseMediaPlayer> MediaPlayers { get; private set; } - - /// <summary> - /// Gets the list of currently loaded themes - /// </summary> - /// <value>The themes.</value> - public IEnumerable<BaseTheme> Themes { get; private set; } - - /// <summary> - /// Gets the kernel context. - /// </summary> - /// <value>The kernel context.</value> - public override KernelContext KernelContext - { - get { return KernelContext.Ui; } - } - - /// <summary> - /// Gets the UDP server port number. - /// </summary> - /// <value>The UDP server port number.</value> - public override int UdpServerPortNumber - { - get { return 7360; } - } - - /// <summary> - /// Give the UI a different url prefix so that they can share the same port, in case they are installed on the same machine. - /// </summary> - /// <value>The HTTP server URL prefix.</value> - public override string HttpServerUrlPrefix - { - get - { - return "http://+:" + Configuration.HttpServerPortNumber + "/mediabrowserui/"; - } - } - - /// <summary> - /// Reload api client and update plugins after loading configuration - /// </summary> - /// <returns>Task.</returns> - protected override async Task OnConfigurationLoaded() - { - ReloadApiClient(); - - try - { - await new PluginUpdater(Logger).UpdatePlugins().ConfigureAwait(false); - } - catch (HttpException ex) - { - Logger.ErrorException("Error updating plugins from the server", ex); - } - } - - /// <summary> - /// Disposes the current ApiClient and creates a new one - /// </summary> - private void ReloadApiClient() - { - DisposeApiClient(); - - ApiClient = new ApiClient(Logger, new AsyncHttpClient(new WebRequestHandler - { - AutomaticDecompression = DecompressionMethods.Deflate, - CachePolicy = new RequestCachePolicy(RequestCacheLevel.Revalidate) - })) - { - ServerHostName = Configuration.ServerHostName, - ServerApiPort = Configuration.ServerApiPort, - ClientType = ClientType.Pc, - DeviceName = Environment.MachineName, - SerializationFormat = SerializationFormats.Json - }; - } - - /// <summary> - /// Finds the parts. - /// </summary> - /// <param name="allTypes">All types.</param> - protected override void FindParts(Type[] allTypes) - { - PlaybackManager = (PlaybackManager)ApplicationHost.CreateInstance(typeof(PlaybackManager)); - - base.FindParts(allTypes); - - Themes = GetExports<BaseTheme>(allTypes); - MediaPlayers = GetExports<BaseMediaPlayer>(allTypes); - } - - /// <summary> - /// Called when [composable parts loaded]. - /// </summary> - /// <returns>Task.</returns> - protected override async Task OnComposablePartsLoaded() - { - await base.OnComposablePartsLoaded().ConfigureAwait(false); - - // Once plugins have loaded give the api a reference to our protobuf serializer - DataSerializer.DynamicSerializer = ProtobufSerializer.TypeModel; - } - - /// <summary> - /// Disposes the current ApiClient - /// </summary> - private void DisposeApiClient() - { - if (ApiClient != null) - { - ApiClient.Dispose(); - } - } - - /// <summary> - /// Releases unmanaged and - optionally - managed resources. - /// </summary> - /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> - protected override void Dispose(bool dispose) - { - if (dispose) - { - DisposeApiClient(); - } - - base.Dispose(dispose); - } - } -} |
