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; } }
public IacResponse(EnumIacVerbs verb, EnumIacOptions option) { Verb = verb; Option = option; }