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);
}
}
}