asternet/Asterisk.2013/Asterisk.NET/Manager/ResponseEventHandler.cs

108 lines
3.3 KiB
C#
Raw Normal View History

using System.Threading;
2014-01-08 14:16:39 +00:00
using AsterNET.Manager.Action;
using AsterNET.Manager.Event;
using AsterNET.Manager.Response;
2014-01-08 14:16:39 +00:00
namespace AsterNET.Manager
{
2015-01-03 15:37:29 +00:00
/// <summary>
2018-09-02 18:35:20 +00:00
/// A combined event and response handler that adds received events and the response to a ResponseEvents object.
2015-01-03 15:37:29 +00:00
/// </summary>
public class ResponseEventHandler : IResponseHandler
{
private ManagerActionEvent action;
private AutoResetEvent autoEvent;
private ManagerConnection connection;
private ResponseEvents events;
private int hash;
2015-01-03 15:37:29 +00:00
/// <summary>
2018-09-02 18:35:20 +00:00
/// Creates a new instance<see cref="ResponseEventHandler"/>.
2015-01-03 15:37:29 +00:00
/// </summary>
2018-09-02 18:35:20 +00:00
/// <param name="connection"><see cref="ManagerConnection"/></param>
/// <param name="action"><see cref="ManagerActionEvent"/></param>
/// <param name="autoEvent"><see cref="AutoResetEvent"/></param>
2015-01-03 15:37:29 +00:00
public ResponseEventHandler(ManagerConnection connection, ManagerActionEvent action, AutoResetEvent autoEvent)
{
this.connection = connection;
this.events = new ResponseEvents();
this.action = action;
this.autoEvent = autoEvent;
}
2018-09-02 18:35:20 +00:00
/// <summary>
/// Gets the response events.
/// </summary>
2015-01-03 15:37:29 +00:00
public ResponseEvents ResponseEvents
{
get { return events; }
}
2018-09-02 18:35:20 +00:00
/// <summary>
/// Gets the action.
/// </summary>
2015-01-03 15:37:29 +00:00
public ManagerAction Action
{
get { return action; }
}
2018-09-02 18:35:20 +00:00
/// <summary>
/// Gets or sets the hash.
/// </summary>
2015-01-03 15:37:29 +00:00
public int Hash
{
get { return hash; }
set { hash = value; }
}
2018-09-02 18:35:20 +00:00
/// <summary>
/// Frees this instance.
/// </summary>
2015-01-03 15:37:29 +00:00
public void Free()
{
connection = null;
autoEvent = null;
action = null;
events.Events.Clear();
events.Response = null;
events = null;
}
2018-09-02 18:35:20 +00:00
/// <summary>
/// This method is called when a response is received.
/// </summary>
/// <param name="response"><see cref="ManagerResponse"/></param>
2015-01-03 15:37:29 +00:00
public void HandleResponse(ManagerResponse response)
{
events.Response = response;
if (response is ManagerError)
events.Complete = true;
2015-01-03 15:37:29 +00:00
if (events.Complete && autoEvent != null)
autoEvent.Set();
}
2018-09-02 18:35:20 +00:00
/// <summary>
/// Handles the event.
/// </summary>
/// <param name="e"><see cref="ManagerEvent"/></param>
2015-01-03 15:37:29 +00:00
public void HandleEvent(ManagerEvent e)
{
// should always be a ResponseEvent, anyway...
if (e is ResponseEvent)
{
var responseEvent = (ResponseEvent) e;
events.AddEvent(responseEvent);
}
2015-01-03 15:37:29 +00:00
// finished?
if (action.ActionCompleteEventClass().IsAssignableFrom(e.GetType()))
{
lock (events)
events.Complete = true;
if (events.Response != null)
autoEvent.Set();
}
}
}
}