Esempio n. 1
0
 private void OutputMessage(PeerMessage Message)
 {
     _MessageInbox.Add(Message);
 }
Esempio n. 2
0
        // Other Things
        public void RunCycle(float DeltaTime)
        {
            AssertNotDisposed();

#if !EXPOSE_ERRORS
            try
#endif
            {
                // Connection-State Specific Operations
                switch (_ConnectionStatus)
                {
                case 1:     // Connected

                    // Send HeartBeats
                    _HeartBeatSendTimer += DeltaTime;
                    if (_HeartBeatSendTimer > NetworkConfig.HeartBeatInterval)
                    {
                        SendMessage("HEARTBEAT", "");
                        _HeartBeatSendTimer = 0;
                    }

                    // HeartBeat listening timer. "How long ago did I last hear you?"
                    _HeartBeatTimeout += DeltaTime;
                    if (_HeartBeatTimeout > NetworkConfig.HeartBeatSilenceTimeout)
                    {
                        _HeartBeatTimeout = 0;
                        DropConnection();
                        Log_Write_System("The HeartBeat timeout was exceeded! The connection was dropped.");
                    }
                    break;

                case 2:     // Connecting
                    if (AutoSendGreeting && !_GreetingSent)
                    {
                        SendGreeting();
                    }
                    else if (_GreetingSent & _GreetingReceived)
                    {
                        ChangeConnectionStatusValue(1);
                    }

                    _ConnectionTimeout += DeltaTime;
                    if (_ConnectionTimeout > NetworkConfig.ConnectionTimeout)
                    {
                        _ConnectionTimeout = 0;
                        DropConnection();
                        Log_Write_System("The connection timeout was exceeded! The connection was dropped.");
                    }

                    break;

                case 3:     // Disconnecting
                    _DisconnectTimer += DeltaTime;
                    if (_DisconnectTimer > NetworkConfig.DisconnectWait)
                    {
                        _DisconnectTimer = 0;
                        DropConnection();
                        Log_Write_System("Disconnected!");
                    }
                    break;

                default:
                    break;
                }

                // Mailing Procedure
                if (_Socket != null && _Socket.Connected)
                {
                    // ## BEGIN Receive

                    // Check on what was received.
                    JsEncoder.IAbstractValue[] output = Encoding_CollectOutput();
                    foreach (JsEncoder.IAbstractValue item in output)
                    {
                        // Debug
                        //LogSystemHumanMessage("RECEIVED: " + JsEncoder.EncoderStream.EncodeValue(item));

                        // Essential Information
                        JsEncoder.TableValue outputT = (JsEncoder.TableValue)item;
                        PeerMessage          m       = new PeerMessage(outputT);
                        string mh = m.Header;

                        if (mh == "GREETING")
                        {
                            if (_ConnectionStatus == 2)
                            {
                                bool   VersionMatches = (m.Contents1S == (string)NetworkConfig.VersionString);
                                string PeerID         = m.Contents2S;
                                _OtherPeerID      = PeerID;
                                _GreetingReceived = true;
                                if (VersionMatches)
                                {
                                    Log_Write_System("The other peer greeted you.");
                                }
                                else
                                {
                                    Log_Write_System("The other peer sent you a greeting with an unmatching version string. Incompatibilities may occur.");
                                }
                                if (_GreetingSent)
                                {
                                    ChangeConnectionStatusValue(1);
                                }
                            }
                        }
                        else if (mh == "DISCONNECTING")
                        {
                            if (_ConnectionStatus == 1)
                            {
                                BeginDisconnect(false);
                            }
                            break;
                        }
                        else if (mh == "HEARTBEAT")
                        {
                            _HeartBeatTimeout = 0;
                        }
                        else if (mh == "HUMANMESSAGE")
                        {
                            Log_Write(string.Format("({0}) {1}", OtherPeerDisplayName, m.Contents1S));
                        }

                        OutputMessage(new PeerMessage(outputT));
                    }

                    // ## END Receive

                    // ## BEGIN Send

                    // Debug
                    //foreach (JsEncoder.ValueBase item in _MessageQueue)
                    //    LogSystemHumanMessage("SENT: " + JsEncoder.EncoderStream.EncodeValue(item));

                    // Send the pending messages
                    // Don't send anything on 3 because we want to stop communications on that stage.
                    if (_ConnectionStatus == 1 || _ConnectionStatus == 2)
                    {
                        Encoding_SendInput(_MessageOutbox.ToArray());
                    }
                    _MessageOutbox.Clear();

                    // ## END Send
                }
            }
#if !EXPOSE_ERRORS
            catch (Exception e)
            {
                DropConnection();
                Log_Write_System(string.Concat("You lost connection due to an error. Error Message: ", e.Message));
            }
#endif
        }