using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace Artemis.Core { /// /// Represents a prerequisite for a or /// public abstract class PluginPrerequisite : CorePropertyChanged { private PluginPrerequisiteAction? _currentAction; /// /// Gets the name of the prerequisite /// public abstract string Name { get; } /// /// Gets the description of the prerequisite /// public abstract string Description { get; } /// /// Gets a boolean indicating whether installing or uninstalling this prerequisite requires admin privileges /// public abstract bool RequiresElevation { get; } /// /// Gets a list of actions to execute when is called /// public abstract List InstallActions { get; } /// /// Gets a list of actions to execute when is called /// public abstract List UninstallActions { get; } /// /// Gets or sets the action currently being executed /// public PluginPrerequisiteAction? CurrentAction { get => _currentAction; private set => SetAndNotify(ref _currentAction, value); } /// /// Execute all install actions /// public async Task Install(CancellationToken cancellationToken) { try { OnInstallStarting(); foreach (PluginPrerequisiteAction installAction in InstallActions) { cancellationToken.ThrowIfCancellationRequested(); CurrentAction = installAction; await installAction.Execute(cancellationToken); } } finally { CurrentAction = null; OnInstallFinished(); } } /// /// Execute all uninstall actions /// public async Task Uninstall(CancellationToken cancellationToken) { try { OnUninstallStarting(); foreach (PluginPrerequisiteAction uninstallAction in UninstallActions) { cancellationToken.ThrowIfCancellationRequested(); CurrentAction = uninstallAction; await uninstallAction.Execute(cancellationToken); } } finally { CurrentAction = null; OnUninstallFinished(); } } /// /// Called to determine whether the prerequisite is met /// /// if the prerequisite is met; otherwise public abstract bool IsMet(); /// /// Called before installation starts /// protected virtual void OnInstallStarting() { } /// /// Called after installation finishes /// protected virtual void OnInstallFinished() { } /// /// Called before uninstall starts /// protected virtual void OnUninstallStarting() { } /// /// Called after uninstall finished /// protected virtual void OnUninstallFinished() { } } }