@ -10,6 +10,7 @@ using System.Runtime.Serialization;
using System.Security.Cryptography ;
using System.Threading ;
using System.Threading.Tasks ;
using Jellyfin.Data.Events ;
using MediaBrowser.Common ;
using MediaBrowser.Common.Configuration ;
using MediaBrowser.Common.Net ;
@ -17,6 +18,8 @@ using MediaBrowser.Common.Plugins;
using MediaBrowser.Common.Updates ;
using MediaBrowser.Common.System ;
using MediaBrowser.Controller.Configuration ;
using MediaBrowser.Controller.Events ;
using MediaBrowser.Controller.Events.Updates ;
using MediaBrowser.Model.IO ;
using MediaBrowser.Model.Net ;
using MediaBrowser.Model.Serialization ;
@ -36,6 +39,7 @@ namespace Emby.Server.Implementations.Updates
/// </summary>
private readonly ILogger < InstallationManager > _logger ;
private readonly IApplicationPaths _appPaths ;
private readonly IEventManager _eventManager ;
private readonly IHttpClientFactory _httpClientFactory ;
private readonly IJsonSerializer _jsonSerializer ;
private readonly IServerConfigurationManager _config ;
@ -65,23 +69,20 @@ namespace Emby.Server.Implementations.Updates
ILogger < InstallationManager > logger ,
IApplicationHost appHost ,
IApplicationPaths appPaths ,
IEventManager eventManager ,
IHttpClientFactory httpClientFactory ,
IJsonSerializer jsonSerializer ,
IServerConfigurationManager config ,
IFileSystem fileSystem ,
IZipClient zipClient )
{
if ( logger = = null )
{
throw new ArgumentNullException ( nameof ( logger ) ) ;
}
_currentInstallations = new List < ( InstallationInfo , CancellationTokenSource ) > ( ) ;
_completedInstallationsInternal = new ConcurrentBag < InstallationInfo > ( ) ;
_logger = logger ;
_applicationHost = appHost ;
_appPaths = appPaths ;
_eventManager = eventManager ;
_httpClientFactory = httpClientFactory ;
_jsonSerializer = jsonSerializer ;
_config = config ;
@ -89,27 +90,6 @@ namespace Emby.Server.Implementations.Updates
_zipClient = zipClient ;
}
/// <inheritdoc />
public event EventHandler < InstallationInfo > PackageInstalling ;
/// <inheritdoc />
public event EventHandler < InstallationInfo > PackageInstallationCompleted ;
/// <inheritdoc />
public event EventHandler < InstallationFailedEventArgs > PackageInstallationFailed ;
/// <inheritdoc />
public event EventHandler < InstallationInfo > PackageInstallationCancelled ;
/// <inheritdoc />
public event EventHandler < IPlugin > PluginUninstalled ;
/// <inheritdoc />
public event EventHandler < InstallationInfo > PluginUpdated ;
/// <inheritdoc />
public event EventHandler < InstallationInfo > PluginInstalled ;
/// <inheritdoc />
public IEnumerable < InstallationInfo > CompletedInstallations = > _completedInstallationsInternal ;
@ -268,11 +248,11 @@ namespace Emby.Server.Implementations.Updates
var linkedToken = CancellationTokenSource . CreateLinkedTokenSource ( cancellationToken , innerCancellationTokenSource . Token ) . Token ;
PackageInstalling ? . Invoke ( this , packag e) ;
await _eventManager . PublishAsync ( new PluginInstallingEventArgs ( package ) ) . ConfigureAwait ( fals e) ;
try
{
await InstallPackageInternal ( package , linkedToken ) . ConfigureAwait ( false ) ;
var isUpdate = await InstallPackageInternal ( package , linkedToken ) . ConfigureAwait ( false ) ;
lock ( _currentInstallationsLock )
{
@ -280,8 +260,11 @@ namespace Emby.Server.Implementations.Updates
}
_completedInstallationsInternal . Add ( package ) ;
await _eventManager . PublishAsync ( isUpdate
? ( GenericEventArgs < InstallationInfo > ) new PluginUpdatedEventArgs ( package )
: new PluginInstalledEventArgs ( package ) ) . ConfigureAwait ( false ) ;
PackageInstallationCompleted ? . Invoke ( this , package ) ;
_applicationHost. NotifyPendingRestart ( ) ;
}
catch ( OperationCanceledException )
{
@ -292,7 +275,7 @@ namespace Emby.Server.Implementations.Updates
_logger . LogInformation ( "Package installation cancelled: {0} {1}" , package . Name , package . Version ) ;
PackageInstallationCancelled ? . Invoke ( this , packag e) ;
await _eventManager . PublishAsync ( new PluginInstallationCancelledEventArgs ( package ) ) . ConfigureAwait ( fals e) ;
throw ;
}
@ -305,11 +288,11 @@ namespace Emby.Server.Implementations.Updates
_currentInstallations . Remove ( tuple ) ;
}
PackageInstallationFailed ? . Invoke ( this , new InstallationFailedEventArgs
await _eventManager . PublishAsync ( new InstallationFailedEventArgs
{
InstallationInfo = package ,
Exception = ex
} ) ;
} ) .ConfigureAwait ( false ) ;
throw ;
}
@ -326,7 +309,7 @@ namespace Emby.Server.Implementations.Updates
/// <param name="package">The package.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns><see cref="Task" />.</returns>
private async Task InstallPackageInternal ( InstallationInfo package , CancellationToken cancellationToken )
private async Task < bool > InstallPackageInternal ( InstallationInfo package , CancellationToken cancellationToken )
{
// Set last update time if we were installed before
IPlugin plugin = _applicationHost . Plugins . FirstOrDefault ( p = > p . Id = = package . Guid )
@ -336,20 +319,9 @@ namespace Emby.Server.Implementations.Updates
await PerformPackageInstallation ( package , cancellationToken ) . ConfigureAwait ( false ) ;
// Do plugin-specific processing
if ( plugin = = null )
{
_logger . LogInformation ( "New plugin installed: {0} {1}" , package . Name , package . Version ) ;
_logger . LogInformation ( plugin = = null ? "New plugin installed: {0} {1}" : "Plugin updated: {0} {1}" , package . Name , package . Version ) ;
PluginInstalled ? . Invoke ( this , package ) ;
}
else
{
_logger . LogInformation ( "Plugin updated: {0} {1}" , package . Name , package . Version ) ;
PluginUpdated ? . Invoke ( this , package ) ;
}
_applicationHost . NotifyPendingRestart ( ) ;
return plugin ! = null ;
}
private async Task PerformPackageInstallation ( InstallationInfo package , CancellationToken cancellationToken )
@ -467,7 +439,7 @@ namespace Emby.Server.Implementations.Updates
_config . SaveConfiguration ( ) ;
}
PluginUninstalled? . Invoke ( this , plugin ) ;
_eventManager. Publish ( new PluginUninstalledEventArgs ( plugin ) ) ;
_applicationHost . NotifyPendingRestart ( ) ;
}