Exemple #1
0
        private void Process(byte b)
        {
            switch (_parseState)
            {
            case ParseState.Normal when b == IAC:
                _parseState = ParseState.FoundIAC;
                break;

            case ParseState.Normal:
                _memoryStream.WriteByte(b);
                break;

            case ParseState.FoundIAC when b == SB:
                _parseState = ParseState.SBStart;
                break;

            case ParseState.FoundIAC when b == (byte)EnumIacVerbs.WILL:
            case ParseState.FoundIAC when b == (byte)EnumIacVerbs.WONT:
            case ParseState.FoundIAC when b == (byte)EnumIacVerbs.DO:
            case ParseState.FoundIAC when b == (byte)EnumIacVerbs.DONT:
                _currentVerb = (EnumIacVerbs)b;
                _parseState  = ParseState.IACCommand;
                break;

            case ParseState.FoundIAC when b == IAC:
                // special escape sequence
                _memoryStream.WriteByte(b);
                break;

            case ParseState.FoundIAC:
                _parseState = ParseState.Normal;
                break;

            case ParseState.IACCommand:
                IacVerbReceived?.Invoke(this, new IacVerbReceivedEventArgs()
                {
                    Verb   = _currentVerb,
                    Option = (EnumIacOptions)b
                });
                _parseState = ParseState.Normal;
                break;

            case ParseState.SBStart:
                _sbValue.SetLength(0);
                _currentSubnegotiationOption = (EnumIacOptions)b;
                _parseState = ParseState.SBValue;
                break;

            case ParseState.SBValue when b == IAC:
                _parseState = ParseState.SBIAC;
                break;

            case ParseState.SBValue:
                _sbValue.WriteByte(b);
                break;

            case ParseState.SBIAC when b == SE:
                IacSubnegotiationReceived?.Invoke(this, new IacSubnegotiationEventArgs()
                {
                    Option = _currentSubnegotiationOption,
                    Data   = _sbValue.ToArray()
                });
                _parseState = ParseState.Normal;
                break;

            case ParseState.SBIAC:
                _sbValue.WriteByte(IAC);
                _sbValue.WriteByte(b);
                _parseState = ParseState.SBValue;
                break;
            }
        }
Exemple #2
0
 public IacResponse(EnumIacVerbs verb, EnumIacOptions option)
 {
     Verb   = verb;
     Option = option;
 }