File: Engine\EventSource.cs
Web Access
Project: ..\..\..\src\Deprecated\Engine\Microsoft.Build.Engine.csproj (Microsoft.Build.Engine)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
// THE ASSEMBLY BUILT FROM THIS SOURCE FILE HAS BEEN DEPRECATED FOR YEARS. IT IS BUILT ONLY TO PROVIDE
// BACKWARD COMPATIBILITY FOR API USERS WHO HAVE NOT YET MOVED TO UPDATED APIS. PLEASE DO NOT SEND PULL
// REQUESTS THAT CHANGE THIS FILE WITHOUT FIRST CHECKING WITH THE MAINTAINERS THAT THE FIX IS REQUIRED.
 
using System;
 
using Microsoft.Build.Framework;
using Microsoft.Build.BuildEngine.Shared;
 
namespace Microsoft.Build.BuildEngine
{
    /// <summary>
    /// This class raises events on behalf of the build engine to all registered loggers.
    /// </summary>
    /// <owner>SumedhK</owner>
    internal sealed class EventSource : MarshalByRefObject, IEventSource
    {
        /// <summary>
        /// Default constructor.
        /// </summary>
        /// <owner>SumedhK</owner>
        internal EventSource()
        {
            // do nothing
        }
 
        /// <summary>
        /// Clears out all events.
        /// </summary>
        /// <owner>SumedhK</owner>
        internal void UnregisterAllLoggers()
        {
            MessageRaised = null;
            ErrorRaised = null;
            WarningRaised = null;
            BuildStarted = null;
            BuildFinished = null;
            ProjectStarted = null;
            ProjectFinished = null;
            TargetStarted = null;
            TargetFinished = null;
            TaskStarted = null;
            TaskFinished = null;
            CustomEventRaised = null;
            StatusEventRaised = null;
            AnyEventRaised = null;
        }
 
        /// <summary>
        /// Raises a message event to all registered loggers.
        /// </summary>
        /// <owner>SumedhK</owner>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void RaiseMessageEvent(object sender, BuildMessageEventArgs e)
        {
            if (MessageRaised != null)
            {
                try
                {
                    MessageRaised(sender, e);
                }
                catch (LoggerException)
                {
                    // if a logger has failed politely, abort immediately
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    throw;
                }
                catch (Exception exception)
                {
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    InternalLoggerException.Throw(exception, e, "FatalErrorWhileLogging", false);
                }
            }
 
            RaiseAnyEvent(sender, e);
        }
 
        /// <summary>
        /// Raises an error event to all registered loggers.
        /// </summary>
        /// <owner>SumedhK</owner>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void RaiseErrorEvent(object sender, BuildErrorEventArgs e)
        {
            if (ErrorRaised != null)
            {
                try
                {
                    ErrorRaised(sender, e);
                }
                catch (LoggerException)
                {
                    // if a logger has failed politely, abort immediately
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    throw;
                }
                catch (Exception exception)
                {
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    InternalLoggerException.Throw(exception, e, "FatalErrorWhileLogging", false);
                }
            }
 
            RaiseAnyEvent(sender, e);
        }
 
        /// <summary>
        /// Raises a warning event to all registered loggers.
        /// </summary>
        /// <owner>SumedhK</owner>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void RaiseWarningEvent(object sender, BuildWarningEventArgs e)
        {
            if (WarningRaised != null)
            {
                try
                {
                    WarningRaised(sender, e);
                }
                catch (LoggerException)
                {
                    // if a logger has failed politely, abort immediately
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    throw;
                }
                catch (Exception exception)
                {
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    InternalLoggerException.Throw(exception, e, "FatalErrorWhileLogging", false);
                }
            }
 
            RaiseAnyEvent(sender, e);
        }
 
        /// <summary>
        /// Raises a "build started" event to all registered loggers.
        /// </summary>
        /// <owner>SumedhK</owner>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void RaiseBuildStartedEvent(object sender, BuildStartedEventArgs e)
        {
            if (BuildStarted != null)
            {
                try
                {
                    BuildStarted(sender, e);
                }
                catch (LoggerException)
                {
                    // if a logger has failed politely, abort immediately
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    throw;
                }
                catch (Exception exception)
                {
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    InternalLoggerException.Throw(exception, e, "FatalErrorWhileLogging", false);
                }
            }
 
            RaiseStatusEvent(sender, e);
        }
 
        /// <summary>
        /// Raises a "build finished" event to all registered loggers.
        /// </summary>
        /// <owner>SumedhK</owner>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void RaiseBuildFinishedEvent(object sender, BuildFinishedEventArgs e)
        {
            if (BuildFinished != null)
            {
                try
                {
                    BuildFinished(sender, e);
                }
                catch (LoggerException)
                {
                    // if a logger has failed politely, abort immediately
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    throw;
                }
                catch (Exception exception)
                {
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    InternalLoggerException.Throw(exception, e, "FatalErrorWhileLogging", false);
                }
            }
 
            RaiseStatusEvent(sender, e);
        }
 
        /// <summary>
        /// Raises a "project build started" event to all registered loggers.
        /// </summary>
        /// <owner>SumedhK</owner>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void RaiseProjectStartedEvent(object sender, ProjectStartedEventArgs e)
        {
            if (ProjectStarted != null)
            {
                try
                {
                    ProjectStarted(sender, e);
                }
                catch (LoggerException)
                {
                    // if a logger has failed politely, abort immediately
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    throw;
                }
                catch (Exception exception)
                {
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    InternalLoggerException.Throw(exception, e, "FatalErrorWhileLogging", false);
                }
            }
 
            RaiseStatusEvent(sender, e);
        }
 
        /// <summary>
        /// Raises a "project build finished" event to all registered loggers.
        /// </summary>
        /// <owner>SumedhK</owner>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void RaiseProjectFinishedEvent(object sender, ProjectFinishedEventArgs e)
        {
            if (ProjectFinished != null)
            {
                try
                {
                    ProjectFinished(sender, e);
                }
                catch (LoggerException)
                {
                    // if a logger has failed politely, abort immediately
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    throw;
                }
                catch (Exception exception)
                {
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    InternalLoggerException.Throw(exception, e, "FatalErrorWhileLogging", false);
                }
            }
 
            RaiseStatusEvent(sender, e);
        }
 
        /// <summary>
        /// Raises a "target build started" event to all registered loggers.
        /// </summary>
        /// <owner>SumedhK</owner>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void RaiseTargetStartedEvent(object sender, TargetStartedEventArgs e)
        {
            if (TargetStarted != null)
            {
                try
                {
                    TargetStarted(sender, e);
                }
                catch (LoggerException)
                {
                    // if a logger has failed politely, abort immediately
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    throw;
                }
                catch (Exception exception)
                {
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    InternalLoggerException.Throw(exception, e, "FatalErrorWhileLogging", false);
                }
            }
 
            RaiseStatusEvent(sender, e);
        }
 
        /// <summary>
        /// Raises a "target build finished" event to all registered loggers.
        /// </summary>
        /// <owner>SumedhK</owner>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void RaiseTargetFinishedEvent(object sender, TargetFinishedEventArgs e)
        {
            if (TargetFinished != null)
            {
                try
                {
                    TargetFinished(sender, e);
                }
                catch (LoggerException)
                {
                    // if a logger has failed politely, abort immediately
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    throw;
                }
                catch (Exception exception)
                {
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    InternalLoggerException.Throw(exception, e, "FatalErrorWhileLogging", false);
                }
            }
 
            RaiseStatusEvent(sender, e);
        }
 
        /// <summary>
        /// Raises a "task execution started" event to all registered loggers.
        /// </summary>
        /// <owner>SumedhK</owner>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void RaiseTaskStartedEvent(object sender, TaskStartedEventArgs e)
        {
            if (TaskStarted != null)
            {
                try
                {
                    TaskStarted(sender, e);
                }
                catch (LoggerException)
                {
                    // if a logger has failed politely, abort immediately
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    throw;
                }
                catch (Exception exception)
                {
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    InternalLoggerException.Throw(exception, e, "FatalErrorWhileLogging", false);
                }
            }
 
            RaiseStatusEvent(sender, e);
        }
 
        /// <summary>
        /// Raises a "task finished executing" event to all registered loggers.
        /// </summary>
        /// <owner>SumedhK</owner>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void RaiseTaskFinishedEvent(object sender, TaskFinishedEventArgs e)
        {
            if (TaskFinished != null)
            {
                try
                {
                    TaskFinished(sender, e);
                }
                catch (LoggerException)
                {
                    // if a logger has failed politely, abort immediately
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    throw;
                }
                catch (Exception exception)
                {
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    InternalLoggerException.Throw(exception, e, "FatalErrorWhileLogging", false);
                }
            }
 
            RaiseStatusEvent(sender, e);
        }
 
        /// <summary>
        /// Raises a custom event to all registered loggers.
        /// </summary>
        /// <owner>SumedhK</owner>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void RaiseCustomEvent(object sender, CustomBuildEventArgs e)
        {
            if (CustomEventRaised != null)
            {
                try
                {
                    CustomEventRaised(sender, e);
                }
                catch (LoggerException)
                {
                    // if a logger has failed politely, abort immediately
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    throw;
                }
                catch (Exception exception)
                {
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    InternalLoggerException.Throw(exception, e, "FatalErrorWhileLogging", false);
                }
            }
 
            RaiseAnyEvent(sender, e);
        }
 
        /// <summary>
        /// Raises a catch-all build status event to all registered loggers.
        /// </summary>
        /// <owner>SumedhK</owner>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void RaiseStatusEvent(object sender, BuildStatusEventArgs e)
        {
            if (StatusEventRaised != null)
            {
                try
                {
                    StatusEventRaised(sender, e);
                }
                catch (LoggerException)
                {
                    // if a logger has failed politely, abort immediately
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    throw;
                }
                catch (Exception exception)
                {
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    InternalLoggerException.Throw(exception, e, "FatalErrorWhileLogging", false);
                }
            }
 
            RaiseAnyEvent(sender, e);
        }
 
        /// <summary>
        /// Raises a catch-all build event to all registered loggers.
        /// </summary>
        /// <owner>SumedhK</owner>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void RaiseAnyEvent(object sender, BuildEventArgs e)
        {
            if (AnyEventRaised != null)
            {
                try
                {
                    AnyEventRaised(sender, e);
                }
                catch (LoggerException)
                {
                    // if a logger has failed politely, abort immediately
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    throw;
                }
                catch (Exception exception)
                {
                    // first unregister all loggers, since other loggers may receive remaining events in unexpected orderings
                    // if a fellow logger is throwing in an event handler.
                    this.UnregisterAllLoggers();
                    InternalLoggerException.Throw(exception, e, "FatalErrorWhileLogging", false);
                }
            }
        }
 
        /// <summary>
        /// Raises the given event to all registered loggers.
        /// This method casts the events extracted from the queue to a more specific type.
        /// </summary>
        /// <param name="e"></param>
        internal void RaiseStronglyTypedEvent(BuildEventArgs e)
        {
            switch (e)
            {
                case BuildMessageEventArgs buildMessageEvent:
                    RaiseMessageEvent(null, buildMessageEvent);
                    break;
                case TaskStartedEventArgs taskStartedEvent:
                    RaiseTaskStartedEvent(null, taskStartedEvent);
                    break;
                case TaskFinishedEventArgs taskFinishedEvent:
                    RaiseTaskFinishedEvent(null, taskFinishedEvent);
                    break;
                case TargetStartedEventArgs targetStartedEvent:
                    RaiseTargetStartedEvent(null, targetStartedEvent);
                    break;
                case TargetFinishedEventArgs targetFinishedEvent:
                    RaiseTargetFinishedEvent(null, targetFinishedEvent);
                    break;
                case ProjectStartedEventArgs projectStartedEvent:
                    RaiseProjectStartedEvent(null, projectStartedEvent);
                    break;
                case ProjectFinishedEventArgs projectFinishedEvent:
                    RaiseProjectFinishedEvent(null, projectFinishedEvent);
                    break;
                case BuildStartedEventArgs buildStartedEvent:
                    RaiseBuildStartedEvent(null, buildStartedEvent);
                    break;
                case BuildFinishedEventArgs buildFinishedEvent:
                    RaiseBuildFinishedEvent(null, buildFinishedEvent);
                    break;
                case CustomBuildEventArgs customBuildEvent:
                    RaiseCustomEvent(null, customBuildEvent);
                    break;
                case BuildStatusEventArgs buildStatusEvent:
                    RaiseStatusEvent(null, buildStatusEvent);
                    break;
                case BuildWarningEventArgs buildWarningEvent:
                    RaiseWarningEvent(null, buildWarningEvent);
                    break;
                case BuildErrorEventArgs buildErrorEvent:
                    RaiseErrorEvent(null, buildErrorEvent);
                    break;
                default:
                    ErrorUtilities.VerifyThrow(false, "Unknown event args type.");
                    break;
            }
        }
 
        /// <summary>
        /// This event is raised to log a message.
        /// </summary>
        /// <owner> t-jeffv, sumedhk </owner>
        public event BuildMessageEventHandler MessageRaised;
 
        /// <summary>
        /// This event is raised to log an error.
        /// </summary>
        /// <owner> t-jeffv, sumedhk </owner>
        public event BuildErrorEventHandler ErrorRaised;
 
        /// <summary>
        /// This event is raised to log a warning.
        /// </summary>
        /// <owner> t-jeffv, sumedhk </owner>
        public event BuildWarningEventHandler WarningRaised;
 
        /// <summary>
        /// this event is raised to log the start of a build
        /// </summary>
        /// <owner> t-jeffv, sumedhk </owner>
        public event BuildStartedEventHandler BuildStarted;
 
        /// <summary>
        /// this event is raised to log the end of a build
        /// </summary>
        /// <owner> t-jeffv, sumedhk </owner>
        public event BuildFinishedEventHandler BuildFinished;
 
        /// <summary>
        /// this event is raised to log the start of a project build
        /// </summary>
        /// <owner> t-jeffv, sumedhk </owner>
        public event ProjectStartedEventHandler ProjectStarted;
 
        /// <summary>
        /// this event is raised to log the end of a project build
        /// </summary>
        /// <owner> t-jeffv, sumedhk </owner>
        public event ProjectFinishedEventHandler ProjectFinished;
 
        /// <summary>
        /// this event is raised to log the start of a target build
        /// </summary>
        /// <owner> t-jeffv, sumedhk </owner>
        public event TargetStartedEventHandler TargetStarted;
 
        /// <summary>
        /// this event is raised to log the end of a target build
        /// </summary>
        /// <owner> t-jeffv, sumedhk </owner>
        public event TargetFinishedEventHandler TargetFinished;
 
        /// <summary>
        /// this event is raised to log the start of task execution
        /// </summary>
        /// <owner> t-jeffv, sumedhk </owner>
        public event TaskStartedEventHandler TaskStarted;
 
        /// <summary>
        /// this event is raised to log the end of task execution
        /// </summary>
        /// <owner> t-jeffv, sumedhk </owner>
        public event TaskFinishedEventHandler TaskFinished;
 
        /// <summary>
        /// this event is raised to log a custom event
        /// </summary>
        /// <owner> t-jeffv, sumedhk </owner>
        public event CustomBuildEventHandler CustomEventRaised;
 
        /// <summary>
        /// this event is raised to log build status events, such as
        /// build/project/target/task started/stopped
        /// </summary>
        /// <owner> t-jeffv, sumedhk </owner>
        public event BuildStatusEventHandler StatusEventRaised;
 
        /// <summary>
        /// This event is raised to log that some event has
        /// occurred.  It is raised on every event.
        /// </summary>
        /// <owner> t-jeffv, sumedhk </owner>
        public event AnyEventHandler AnyEventRaised;
    }
}