public ShutdownSafetyStates DoTransition()
        {
            // only attemt to transition if the last step is _interval in the past
            if (DateTime.Now - _lastStep < _interval)
            {
                // nope, too soon.
                Debug.WriteLine("Too soon", this.ToString());
                return(CurrentState);
            }
            switch (_state)
            {
            case ShutdownSafetyStates.NotSafe:
                if (checkRules())
                {
                    Debug.WriteLine("leaving notsafe", this.ToString());
                    _state = ShutdownSafetyStates.Checked;
                }
                break;

            case ShutdownSafetyStates.Checked:
                if (checkRulesAgain())
                {
                    Debug.WriteLine("leaving checked", this.ToString());
                    _state = ShutdownSafetyStates.Safe;
                }
                else
                {
                    Debug.WriteLine("something came up, back to unsafe", this.ToString());
                    _state = ShutdownSafetyStates.NotSafe;
                }
                break;

            case ShutdownSafetyStates.Safe:
                WaitAndShutdown();
                break;

            case ShutdownSafetyStates.Final:
                break;

            default:
                break;
            }
            _lastStep = DateTime.Now;
            return(CurrentState);
        }
		public ShutdownSafetyStates DoTransition()
		{
			// only attemt to transition if the last step is _interval in the past
			if (DateTime.Now - _lastStep < _interval)
			{
				// nope, too soon.
				Debug.WriteLine("Too soon", this.ToString());
				return CurrentState;
			}
			switch (_state)
			{
				case ShutdownSafetyStates.NotSafe:
					if (checkRules())
					{
						Debug.WriteLine("leaving notsafe", this.ToString());
						_state = ShutdownSafetyStates.Checked;
					}
					break;
				case ShutdownSafetyStates.Checked:
					if (checkRulesAgain())
					{
						Debug.WriteLine("leaving checked", this.ToString());
						_state = ShutdownSafetyStates.Safe;
					}
					else
					{
						Debug.WriteLine("something came up, back to unsafe", this.ToString());
						_state = ShutdownSafetyStates.NotSafe;
					}
					break;
				case ShutdownSafetyStates.Safe:
					WaitAndShutdown();
					break;
				case ShutdownSafetyStates.Final:
					break;
				default:
					break;
			}
			_lastStep = DateTime.Now;
			return CurrentState;
		}
 private async void WaitAndShutdown()
 {
     foreach (var rule in _rules)
     {
         if (rule.CanWaitForOkay)
         {
             await rule.Wait();
         }
         else
         {
             if (!rule.IsOkayToShutdown)
             {
                 Debug.WriteLine("something came up while checking " + rule.ToString(), this.ToString());
                 _state = ShutdownSafetyStates.NotSafe;
                 return;
             }
         }
     }
     Shutdown();
     _state = ShutdownSafetyStates.Final;
 }
 public ShutdownSafetyProtocol(TimeSpan IntervalPerStep)
 {
     _interval = IntervalPerStep;
     _state    = ShutdownSafetyStates.NotSafe;
 }
		public ShutdownSafetyProtocol(TimeSpan IntervalPerStep)
		{
			_interval = IntervalPerStep;
			_state = ShutdownSafetyStates.NotSafe;
		}
		public void Shutdown()
		{
			Debug.WriteLine("shutting down. good night", this.ToString());
			_state = ShutdownSafetyStates.Final;
			new WPFAboutBox1(App.Current.MainWindow).ShowDialog(); // fake implementation 
			Process.Start(Environment.ExpandEnvironmentVariables(@"%windir%\system32\shutdown.exe"), "/s /t 600");
		}
		private async void WaitAndShutdown()
		{
			foreach (var rule in _rules)
			{
				if (rule.CanWaitForOkay)
				{
					await rule.Wait();
				}
				else
				{
					if (!rule.IsOkayToShutdown)
					{
						Debug.WriteLine("something came up while checking " + rule.ToString(), this.ToString());
						_state = ShutdownSafetyStates.NotSafe;
						return;
					}
				}
			}
			Shutdown();
			_state = ShutdownSafetyStates.Final;
		}