PowerShell/src/Microsoft.Management.Infrastructure.CimCmdlets/CimPromptUser.cs

142 lines
4.3 KiB
C#

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
#region Using directives
using Microsoft.Management.Infrastructure.Options;
#endregion
namespace Microsoft.Management.Infrastructure.CimCmdlets
{
/// <summary>
/// <para>
/// Prompt user the message coming from provider.
/// </para>
/// <para>
/// At the same time <see cref="CimPromptUser"/> class will prepare the
/// message for -whatif parameter, while the message represents
/// what will happen if execute the operation, but not do the operation.
/// For example, Remove-CimInstance, the whatif message will like,
/// "CIM Instance: Win32_Process@{Key=1} will be deleted."
/// </para>
/// </summary>
internal sealed class CimPromptUser : CimSyncAction
{
/// <summary>
/// Constructor.
/// </summary>
public CimPromptUser(string message,
CimPromptType prompt)
{
this.message = message;
this.prompt = prompt;
}
/// <summary>
/// <para>
/// Prompt user with the given message and prepared whatif message.
/// </para>
/// </summary>
/// <param name="cmdlet">
/// cmdlet wrapper object, to which write result.
/// <see cref="CmdletOperationBase"/> for details.
/// </param>
public override void Execute(CmdletOperationBase cmdlet)
{
ValidationHelper.ValidateNoNullArgument(cmdlet, "cmdlet");
bool yestoall = false;
bool notoall = false;
bool result = false;
switch (this.prompt)
{
case CimPromptType.Critical:
// NOTES: prepare the whatif message and caption
try
{
result = cmdlet.ShouldContinue(message, "caption", ref yestoall, ref notoall);
if (yestoall)
{
this.responseType = CimResponseType.YesToAll;
}
else if (notoall)
{
this.responseType = CimResponseType.NoToAll;
}
else if (result)
{
this.responseType = CimResponseType.Yes;
}
else if (!result)
{
this.responseType = CimResponseType.No;
}
}
catch
{
this.responseType = CimResponseType.NoToAll;
throw;
}
finally
{
// unblocking the waiting thread
this.OnComplete();
}
break;
case CimPromptType.Normal:
try
{
result = cmdlet.ShouldProcess(message);
if (result)
{
this.responseType = CimResponseType.Yes;
}
else if (!result)
{
this.responseType = CimResponseType.No;
}
}
catch
{
this.responseType = CimResponseType.NoToAll;
throw;
}
finally
{
// unblocking the waiting thread
this.OnComplete();
}
break;
default:
break;
}
this.OnComplete();
}
#region members
/// <summary>
/// Prompt message.
/// </summary>
public string Message
{
get
{
return message;
}
}
private string message;
/// <summary>
/// Prompt type -Normal or Critical.
/// </summary>
private CimPromptType prompt;
#endregion
}
}