108 lines
3.3 KiB
C#
108 lines
3.3 KiB
C#
using System.Threading;
|
|
using AsterNET.Manager.Action;
|
|
using AsterNET.Manager.Event;
|
|
using AsterNET.Manager.Response;
|
|
|
|
namespace AsterNET.Manager
|
|
{
|
|
/// <summary>
|
|
/// A combined event and response handler that adds received events and the response to a ResponseEvents object.
|
|
/// </summary>
|
|
public class ResponseEventHandler : IResponseHandler
|
|
{
|
|
private ManagerActionEvent action;
|
|
private AutoResetEvent autoEvent;
|
|
private ManagerConnection connection;
|
|
private ResponseEvents events;
|
|
private int hash;
|
|
|
|
/// <summary>
|
|
/// Creates a new instance<see cref="ResponseEventHandler"/>.
|
|
/// </summary>
|
|
/// <param name="connection"><see cref="ManagerConnection"/></param>
|
|
/// <param name="action"><see cref="ManagerActionEvent"/></param>
|
|
/// <param name="autoEvent"><see cref="AutoResetEvent"/></param>
|
|
public ResponseEventHandler(ManagerConnection connection, ManagerActionEvent action, AutoResetEvent autoEvent)
|
|
{
|
|
this.connection = connection;
|
|
this.events = new ResponseEvents();
|
|
this.action = action;
|
|
this.autoEvent = autoEvent;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the response events.
|
|
/// </summary>
|
|
public ResponseEvents ResponseEvents
|
|
{
|
|
get { return events; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the action.
|
|
/// </summary>
|
|
public ManagerAction Action
|
|
{
|
|
get { return action; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the hash.
|
|
/// </summary>
|
|
public int Hash
|
|
{
|
|
get { return hash; }
|
|
set { hash = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Frees this instance.
|
|
/// </summary>
|
|
public void Free()
|
|
{
|
|
connection = null;
|
|
autoEvent = null;
|
|
action = null;
|
|
events.Events.Clear();
|
|
events.Response = null;
|
|
events = null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// This method is called when a response is received.
|
|
/// </summary>
|
|
/// <param name="response"><see cref="ManagerResponse"/></param>
|
|
public void HandleResponse(ManagerResponse response)
|
|
{
|
|
events.Response = response;
|
|
if (response is ManagerError)
|
|
events.Complete = true;
|
|
|
|
if (events.Complete && autoEvent != null)
|
|
autoEvent.Set();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles the event.
|
|
/// </summary>
|
|
/// <param name="e"><see cref="ManagerEvent"/></param>
|
|
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();
|
|
}
|
|
}
|
|
}
|
|
} |