protected bool OnPowerEvent(PowerEventType powerStatus) { Log.Debug("OnPowerEvent: PowerStatus: {0}", powerStatus); bool accept = true; List <PowerEventHandler> powerEventPreventers = new List <PowerEventHandler>(); List <PowerEventHandler> powerEventAllowers = new List <PowerEventHandler>(); // Make a copy of _powerEventHandlers, because the handler might call AddPowerEventHandler // or RemovePowerEventHandler when executing thus generating an exception when we iterate. List <PowerEventHandler> listCopy = new List <PowerEventHandler>(); foreach (PowerEventHandler handler in _powerEventHandlers) { listCopy.Add((PowerEventHandler)handler.Clone()); } // Now iterate the 'copy' foreach (PowerEventHandler handler in listCopy) { bool result = handler(powerStatus); if (result == false) { accept = false; powerEventPreventers.Add(handler); } else { powerEventAllowers.Add(handler); } } if (accept) { return(true); } if (powerEventPreventers.Count > 0) { foreach (PowerEventHandler handler in powerEventPreventers) { Log.Debug("PowerStatus:{0} rejected by {1}", powerStatus, handler.Target.ToString()); } } // if query suspend: // everybody that allowed the standby now must receive a deny event // since we will not get a QuerySuspendFailed message by the OS when // we return false to QuerySuspend if (powerStatus == PowerEventType.QuerySuspend || powerStatus == PowerEventType.QueryStandBy) { foreach (PowerEventHandler handler in powerEventAllowers) { handler(powerStatus == PowerEventType.QuerySuspend ? PowerEventType.QuerySuspendFailed : PowerEventType.QueryStandByFailed); } } else if (powerStatus == PowerEventType.ResumeAutomatic || powerStatus == PowerEventType.ResumeCritical || powerStatus == PowerEventType.ResumeStandBy || powerStatus == PowerEventType.ResumeSuspend ) { _controller.ExecutePendingDeletions(); // call Recording-folder cleanup, just in case we have empty folders. } return(false); }