Beispiel #1
0
        /// <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");
        }
Beispiel #2
0
        /// <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);
                    }
                }
            }
        }
Beispiel #3
0
 internal void AcceptResponse(IInboundDatagram result)
 {
     this.ResponseDatagram = result;
     this.Completed = true;
     if (this.waitHandle != null)
     {
         this.waitHandle.Set();
     }
 }