private void Send_IAC(IAC command, Byte option) { Debug.WriteLine("Send IAC {0} {1} (255 {2:D0} {3:D0})", command, (Telnet.Option)option, (Byte)command, option); Byte[] buf = new Byte[3]; buf[0] = (Byte)IAC.IAC; buf[1] = (Byte)command; buf[2] = option; _Send(buf, 0, 3); }
public static Token NOP(IAC command) { Byte[] buf = new Byte[1]; buf[0] = (Byte)command; return(new Token(TokenType.NOP, buf, 0, 1)); }
private Token GetToken(ref Int32 p, Byte[] buffer, ref Int32 q) { Int32 op = p; // original value of index into mRecvBuf Int32 oq = q; // original value of index into buffer Int32 state = 0; Int32 n; while ((n = PeekTokenByte(p, buffer, q)) != -1) { IAC b = (IAC)n; switch (state) { case 0: // start if (b == IAC.IAC) { state = 3; } else if (n == '\r') { state = 2; } else { state = 1; } ReadTokenByte(ref p, buffer, ref q); break; case 1: // data if ((b == IAC.IAC) || (n == '\r')) { return(new Token(TokenType.Data, buffer, oq, q - oq)); } ReadTokenByte(ref p, buffer, ref q); break; case 2: // CR if ((n == '\n') || (n == 0)) { ReadTokenByte(ref p, buffer, ref q); if ((mRecvBuf != null) && (p == mRecvBuf.Length) && (p != op) && (q != oq)) { // recopy if this token was split across 2 buffers n = (p - op) + (q - oq); Byte[] buf = new Byte[n]; n = 0; for (Int32 i = op; i < p; i++) { buf[n++] = mRecvBuf[i]; } for (Int32 i = oq; i < q; i++) { buf[n++] = buffer[i]; } return(new Token(TokenType.Data, buf, 0, n)); } return(new Token(TokenType.Data, buffer, oq, q - oq)); } if (q == oq) { return(new Token(TokenType.Data, mRecvBuf, op, p - op)); } return(new Token(TokenType.Data, buffer, oq, q - oq)); case 3: // IAC if (b == IAC.IAC) { Token t = (q == oq) ? new Token(TokenType.Data, mRecvBuf, op, 1) : new Token(TokenType.Data, buffer, oq, 1); ReadTokenByte(ref p, buffer, ref q); return(t); } if ((b == IAC.GA) || (b == IAC.BRK) || (b == IAC.IP) || (b == IAC.AO) || (b == IAC.AYT) || (b == IAC.EC) || (b == IAC.EL) || (b == IAC.EOR) || (b == IAC.EOF) || (b == IAC.SUSP) || (b == IAC.ABORT)) { ReadTokenByte(ref p, buffer, ref q); return(new Token(TokenType.Command, buffer, q - 1, 1)); } if (b == IAC.DM) { ReadTokenByte(ref p, buffer, ref q); if (q == oq) { return(new Token(TokenType.DM, mRecvBuf, p - 1, 1)); } return(new Token(TokenType.DM, buffer, q - 1, 1)); } ReadTokenByte(ref p, buffer, ref q); if (b == IAC.DO) { state = 4; } else if (b == IAC.DONT) { state = 5; } else if (b == IAC.WILL) { state = 6; } else if (b == IAC.WONT) { state = 7; } else if (b == IAC.SB) { state = 8; } else if (q == oq) { return(new Token(TokenType.NOP, mRecvBuf, p - 1, 1)); } else { return(new Token(TokenType.NOP, buffer, q - 1, 1)); } break; case 4: // IAC DO ReadTokenByte(ref p, buffer, ref q); return(new Token(TokenType.DO, buffer, q - 1, 1)); case 5: // IAC DONT ReadTokenByte(ref p, buffer, ref q); return(new Token(TokenType.DONT, buffer, q - 1, 1)); case 6: // IAC WILL ReadTokenByte(ref p, buffer, ref q); return(new Token(TokenType.WILL, buffer, q - 1, 1)); case 7: // IAC WONT ReadTokenByte(ref p, buffer, ref q); return(new Token(TokenType.WONT, buffer, q - 1, 1)); case 8: // IAC SB ReadTokenByte(ref p, buffer, ref q); state = 9; break; case 9: // IAC SB OPT ... if (b == IAC.IAC) { state = 10; } ReadTokenByte(ref p, buffer, ref q); break; case 10: // IAC SB OPT ... IAC ReadTokenByte(ref p, buffer, ref q); if (b == IAC.SE) { if ((mRecvBuf != null) && (p == mRecvBuf.Length) && (p != op) && (q != oq)) { // recopy if this token was split across 2 buffers n = (p - op) + (q - oq); Byte[] buf = new Byte[n]; n = 0; for (Int32 i = op; i < p; i++) { buf[n++] = mRecvBuf[i]; } for (Int32 i = oq; i < q; i++) { buf[n++] = buffer[i]; } return(new Token(TokenType.SB, buf, 2, n - 4)); } return(new Token(TokenType.SB, buffer, oq + 2, q - oq - 4)); } if (b == IAC.IAC) { state = 11; } else { state = 9; } break; case 11: // IAC SB OPT ... IAC IAC ... if (b == IAC.IAC) { state = 12; } ReadTokenByte(ref p, buffer, ref q); break; case 12: // IAC SB OPT ... IAC IAC ... IAC ReadTokenByte(ref p, buffer, ref q); if (b == IAC.SE) { if ((mRecvBuf != null) && (p == mRecvBuf.Length) && (p != op) && (q != oq)) { // recopy if this token was split across 2 buffers (undoubling IACs) n = (p - op) + (q - oq); Byte[] buf = new Byte[n]; n = 0; for (Int32 i = op; i < p; i++) { buf[n++] = mRecvBuf[i]; } for (Int32 i = oq; i < q; i++) { buf[n++] = buffer[i]; } for (Int32 i = 0; i < n; i++) { if (buf[i] != (Byte)IAC.IAC) { continue; } if (buf[i] == buf[i + 1]) { n--; for (Int32 j = i; j < n; j++) { buf[j] = buf[j + 1]; } } } return(new Token(TokenType.SB, buf, 2, n - 4)); } // undouble embedded IACs n = q; for (Int32 i = oq; i < n; i++) { if (buffer[i] != (Byte)IAC.IAC) { continue; } if (buffer[i] == buffer[i + 1]) { n--; for (Int32 j = i; j < n; j++) { buffer[j] = buffer[j + 1]; } } } return(new Token(TokenType.SB, buffer, oq + 2, n - oq - 4)); } state = 11; break; } } if (state == 0) { return(new Token(TokenType.None, null, 0, 0)); } if (state == 1) { return(new Token(TokenType.Data, buffer, oq, q - oq)); } return(new Token(TokenType.Invalid, null, 0, 0)); }
private void Send_IAC(IAC command) { Send_IAC((Byte)command); }