public ISymCommand ReadCommand() { _data += Read(); if (!string.IsNullOrEmpty(_data)) { string commandStart = Encoding.ASCII.GetString(new byte[] { 0x1b, 0xfe }); string commandEnd = Encoding.ASCII.GetString(new byte[] { 0xfc }); int start = _data.IndexOf(commandStart, StringComparison.Ordinal); int end = _data.IndexOf(commandEnd, start + commandStart.Length, StringComparison.Ordinal); while (start >= 0 && end >= start + commandStart.Length) { int commandLength = end - start - commandStart.Length; string commandString = _data.Substring(start + commandStart.Length, commandLength); SymCommand newCommand = SymCommand.Parse(commandString); _data = _data.Substring(start + commandStart.Length + commandString.Length); int dataLength = _data.Length; if (newCommand.Command == "File") { int nextStart = _data.IndexOf(commandStart, StringComparison.Ordinal); if (nextStart > 2) { newCommand.Data = _data.Substring(0, nextStart - 2); _data = _data.Substring(nextStart); } } _commands.Add(newCommand); start = _data.IndexOf(commandStart, StringComparison.Ordinal); end = _data.IndexOf(commandEnd, start + commandStart.Length, StringComparison.Ordinal); } } if (_commandIndex + 1 == _commands.Count) { _commands.Clear(); _commandIndex = -1; } if (_commands.Count == 0) { return(SymCommand.Parse("")); } ISymCommand cmd = _commands[++_commandIndex]; if ((cmd.Command == "MsgDlg") && (cmd.HasParameter("Text"))) { if (cmd.Get("Text").IndexOf("From PID", StringComparison.Ordinal) != -1) { cmd = ReadCommand(); } } return(cmd); }