using MediaBrowser.ApiInteraction;
using MediaBrowser.Common.Kernel;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.DTO;
using MediaBrowser.Model.Progress;
using MediaBrowser.UI.Configuration;
using System;
using System.Threading.Tasks;
namespace MediaBrowser.UI.Controller
{
///
/// This controls application logic as well as server interaction within the UI.
///
public class UIKernel : BaseKernel
{
public static UIKernel Instance { get; private set; }
public ApiClient ApiClient { get; private set; }
public DtoUser CurrentUser { get; set; }
public ServerConfiguration ServerConfiguration { get; set; }
public UIKernel()
: base()
{
Instance = this;
}
public override KernelContext KernelContext
{
get { return KernelContext.Ui; }
}
///
/// Give the UI a different url prefix so that they can share the same port, in case they are installed on the same machine.
///
protected override string HttpServerUrlPrefix
{
get
{
return "http://+:" + Configuration.HttpServerPortNumber + "/mediabrowser/ui/";
}
}
///
/// Performs initializations that can be reloaded at anytime
///
protected override async Task ReloadInternal(IProgress progress)
{
ReloadApiClient();
await new PluginUpdater().UpdatePlugins().ConfigureAwait(false);
await base.ReloadInternal(progress).ConfigureAwait(false);
}
///
/// Updates and installs new plugin assemblies and configurations from the server
///
protected async Task UpdatePlugins()
{
return await new PluginUpdater().UpdatePlugins().ConfigureAwait(false);
}
///
/// Disposes the current ApiClient and creates a new one
///
private void ReloadApiClient()
{
DisposeApiClient();
ApiClient = new ApiClient
{
ServerHostName = Configuration.ServerHostName,
ServerApiPort = Configuration.ServerApiPort
};
}
///
/// Disposes the current ApiClient
///
private void DisposeApiClient()
{
if (ApiClient != null)
{
ApiClient.Dispose();
}
}
public override void Dispose()
{
base.Dispose();
DisposeApiClient();
}
}
}