Exemple #1
0
        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);
        }