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()
{
}
}
}