using System.Threading;
using AsterNET.Manager.Action;
using AsterNET.Manager.Event;
using AsterNET.Manager.Response;
namespace AsterNET.Manager
{
///
/// A combined event and response handler that adds received events and the response to a ResponseEvents object.
///
public class ResponseEventHandler : IResponseHandler
{
private ManagerActionEvent action;
private AutoResetEvent autoEvent;
private ManagerConnection connection;
private ResponseEvents events;
private int hash;
///
/// Creates a new instance.
///
///
///
///
public ResponseEventHandler(ManagerConnection connection, ManagerActionEvent action, AutoResetEvent autoEvent)
{
this.connection = connection;
this.events = new ResponseEvents();
this.action = action;
this.autoEvent = autoEvent;
}
///
/// Gets the response events.
///
public ResponseEvents ResponseEvents
{
get { return events; }
}
///
/// Gets the action.
///
public ManagerAction Action
{
get { return action; }
}
///
/// Gets or sets the hash.
///
public int Hash
{
get { return hash; }
set { hash = value; }
}
///
/// Frees this instance.
///
public void Free()
{
connection = null;
autoEvent = null;
action = null;
events.Events.Clear();
events.Response = null;
events = null;
}
///
/// This method is called when a response is received.
///
///
public void HandleResponse(ManagerResponse response)
{
events.Response = response;
if (response is ManagerError)
events.Complete = true;
if (events.Complete && autoEvent != null)
autoEvent.Set();
}
///
/// Handles the event.
///
///
public void HandleEvent(ManagerEvent e)
{
// should always be a ResponseEvent, anyway...
if (e is ResponseEvent)
{
var responseEvent = (ResponseEvent) e;
events.AddEvent(responseEvent);
}
// finished?
if (action.ActionCompleteEventClass().IsAssignableFrom(e.GetType()))
{
lock (events)
events.Complete = true;
if (events.Response != null)
autoEvent.Set();
}
}
}
}