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