/// <summary> /// Dispatches the received datagram to the appropriate target. /// </summary> /// <param name="dgram"> The received datagram. </param> private void Dispatch(IInboundDatagram dgram) { if (dgram.Type == DatagramType.ConsoleMessage) { var conMsg = (ConsoleMessageDatagram)dgram; this.rconClient.OnMessageReceived(new MessageReceivedEventArgs(conMsg)); this.Metrics.DispatchedConsoleMessages++; return; } // else, dgram is a response (to either a login or a command) this.Log.Trace("BEFORE response.DispatchResponse"); this.ResponseDispatcher.DispatchResponse(dgram); this.Log.Trace("AFTER response.DispatchResponse"); }
/// <summary> /// Dispatches an inbound response datagram to its corresponding /// handler. /// </summary> /// <param name="dgram"> The inbound response datagram. </param> public void DispatchResponse(IInboundDatagram dgram) { // is it the login response? if (dgram.Type == DatagramType.Login) { if (this.loginHandler != null) { this.RegisterAcknowledgedDatagram(this.loginHandler.SentDatagram); this.loginHandler.AcceptResponse(dgram); } return; } // it's a command response. // is it a single-part response? var cmdDgram = dgram as CommandSinglePartResponseDatagram; if (cmdDgram != null) { // yes lock (this.cmdResponseHandlers) { ResponseHandler handler = this.cmdResponseHandlers[cmdDgram.OriginalSequenceNumber]; this.RegisterAcknowledgedDatagram(handler.SentDatagram); this.cmdResponseHandlers.Remove(cmdDgram.OriginalSequenceNumber); handler.AcceptResponse(cmdDgram); Debug.WriteLine("handler for command datagram {0} invoked", cmdDgram.OriginalSequenceNumber); } return; } // is it a part of a multi-part response? var partDgram = dgram as CommandResponsePartDatagram; if (partDgram != null) { // yes CommandMultiPartResponseDatagram masterCmd; ResponseHandler handler = this.cmdResponseHandlers[partDgram.OriginalSequenceNumber]; this.RegisterAcknowledgedDatagram(handler.SentDatagram); // is this the first part we ever received? if (handler.ResponseDatagram == null) { // create the master object that will hold and process the parts masterCmd = new CommandMultiPartResponseDatagram(partDgram); handler.ResponseDatagram = masterCmd; } else { // get the previously created master and add this part to it masterCmd = (CommandMultiPartResponseDatagram)handler.ResponseDatagram; masterCmd.AddPart(partDgram); } // was this the last part? if (masterCmd.IsComplete) { lock (this.cmdResponseHandlers) { this.cmdResponseHandlers.Remove(masterCmd.OriginalSequenceNumber); handler.AcceptResponse(masterCmd); Debug.WriteLine( "handler for complete multi-part command response {0} invoked", masterCmd.OriginalSequenceNumber); } } } }
internal void AcceptResponse(IInboundDatagram result) { this.ResponseDatagram = result; this.Completed = true; if (this.waitHandle != null) { this.waitHandle.Set(); } }