using System; using System.Collections.Generic; namespace Decal.Adapter.Messages; /// /// The base from which Adapter messages derive /// [CLSCompliant(true)] public class AdapterMessageEventArgs : EventArgs { private EventHandler responder; private List handlers; private bool canAddHandlers; internal bool CanAddHandlers { get { return canAddHandlers; } set { canAddHandlers = value; } } /// /// Fires for each handler that completes processing of the message /// public event EventHandler MessageComplete { add { responder = (EventHandler)Delegate.Combine(responder, value); } remove { responder = (EventHandler)Delegate.Remove(responder, value); } } internal AdapterMessageEventArgs() { handlers = new List(); } /// /// Acknowledges that the object intends to process the message /// /// The object that will do the processing public void AddHandler(object obj) { if (!CanAddHandlers) { throw new InvalidOperationException("Unable to add handlers at this time"); } if (obj != null) { handlers.Add(obj); } } /// /// Signals completion of message processing /// /// The object that handled the message /// The message response public void SetComplete(object handler, AdapterMessageResponseEventArgs e) { handlers.Remove(handler); if (handlers.Count == 0) { e.Complete = true; } if (responder != null) { responder(this, e); } } }