ParseAndProcessWorkstationCommand( InputByteArray inputArray, DataStreamHeader StreamHeader) { var logList = new TelnetLogList(); WorkstationCommandBase wrkstnCommand = null; DataStreamHeader currentDataStreamHeader = StreamHeader; ShowItemList showItemList = null; wrkstnCommand = WorkstationCommandBase.ParseFactory(inputArray); if (wrkstnCommand == null) { currentDataStreamHeader = null; } else { logList.AddItems(Direction.Read, wrkstnCommand.ToReportLines(), true); // process WriteToDisplay command. This command contains a list TextData and // start field orders. Create ShowItemList items from those orders. if (wrkstnCommand is WriteToDisplayCommand) { var wtdCommand = wrkstnCommand as WriteToDisplayCommand; showItemList = wtdCommand.BuildShowItemList(logList); } } return(new Tuple <WorkstationCommandBase, ShowItemList, DataStreamHeader, TelnetLogList>( wrkstnCommand, showItemList, currentDataStreamHeader, logList)); }
public static Tuple <List <ShowItemBase>, TelnetLogList> NextServerRequest( NetworkStreamBackedInputByteArray InputArray, NegotiateSettings NegotiateSettings, bool ForceRead = false) { TelnetLogList logList = new TelnetLogList(); var showItemList = new ShowItemList(); while (true) { // read available bytes from input stream. if (InputArray.IsEof()) { var log = InputArray.ReadFromNetworkStream(5, 5, ForceRead); logList.AddItems(log); } // no input data to process. if (InputArray.IsEof()) { break; } var buf = InputArray.PeekDataStreamHeader(); if (buf != null) { var dsh = new DataStreamHeader(InputArray); logList.AddItems(Direction.Read, dsh.ToReportLines( ), true); var rv = ParseAndProcessWorkstationCommand(InputArray, dsh); var workstationCommand = rv.Item1; showItemList = rv.Item2; logList.AddItems(rv.Item4); } // check for IAC EOR { var telCode = InputArray.PeekTelnetCommandCode(CommandCode.EOR); if (telCode != null) { var telCmd = InputArray.NextTelnetCommand(); logList.AddItems(Direction.Read, telCmd.ToReportLines(), true); } } // peek and process input bytes as a telnet stmt. ( starts with IAC ) { var telCmd = InputArray.NextTelnetCommand(); if (telCmd != null) { var rv = TelnetConnection.ProcessTelnetCommand(telCmd, NegotiateSettings); var cx = rv.Item1; var writeBytes = rv.Item2; logList.AddItems(rv.Item3); WriteToHost(logList, writeBytes, InputArray.NetStream); } } } return(new Tuple <List <ShowItemBase>, TelnetLogList>(showItemList, logList)); }
/// <summary> /// run the BuildShowItemList method against the first WriteToDisplay command in /// the list of workstation commands. /// </summary> /// <param name="LogList"></param> /// <returns></returns> public static ShowItemList BuildShowItemList( this WorkstationCommandList CommandList, ScreenDim ScreenDim, TelnetLogList LogList) { ShowItemList showItemList = null; OneRowCol caret = null; foreach (var workstationCommand in CommandList) { if (workstationCommand is WriteToDisplayCommand) { var wtdCmd = workstationCommand as WriteToDisplayCommand; TelnetLogList logList = new TelnetLogList(); var rv = wtdCmd.BuildShowItemList(ScreenDim, logList); showItemList = rv.Item1; if (rv.Item2 != null) { caret = rv.Item2; } break; } } return(showItemList); }
/// <summary> /// create list of ShowLiteralItem and ShowFieldItem from the list of orders of /// a WriteToDisplay command. /// </summary> /// <param name="WtdCommand"></param> /// <param name="LogList"></param> /// <returns></returns> public static Tuple <ShowItemList, OneRowCol> BuildShowItemList( this WriteToDisplayCommand WtdCommand, ScreenDim ScreenDim, TelnetLogList LogList) { var itemList = new ShowItemList(); IRowCol curRowCol = new ZeroRowCol(0, 0); OneRowCol caret = null; foreach (var order in WtdCommand.OrderList) { bool newGroup = false; if ((order.OrderCode == WtdOrder.SetBufferAddress) || (order.OrderCode == WtdOrder.StartHeader)) { newGroup = true; } LogList.AddItem(Direction.Read, order.ToString(), newGroup); LogList.AddItem(Direction.Read, order.ToHexString()); if (order is TextDataOrder) { var tdo = order as TextDataOrder; var s1 = tdo.ShowText; if ((tdo.AttrByte != null) || (s1.Length > 0) || (tdo.TailAttrByte != null)) { var litItem = new ShowLiteralItem( (ZeroRowCol)curRowCol, tdo.AttrByte, s1, tdo.TailAttrByte); litItem.tdo_Length = s1.Length; itemList.Add(litItem); curRowCol = curRowCol.Advance(litItem.ItemLength()); } } else if (order.OrderCode == WtdOrder.StartField) { var sfo = order as StartFieldOrder; var lx = sfo.LL_Length; var attrByte = sfo.AttrByte; var fldItem = new ShowFieldItem((ZeroRowCol)curRowCol, sfo.AttrByte, ShowUsage.Both, ShowDtyp.Char, lx); fldItem.IsMonocase = sfo.IsMonocase; fldItem.sfo_FCW = sfo.FCW_Bytes; fldItem.sfo_FFW = sfo.FFW_Bytes; fldItem.sfo_Length = sfo.LL_Length; fldItem.IsNonDisplay = sfo.IsNonDisplay; // field is non display. // if ((attrByte & 0x07) == 0x07) // { // fldItem.IsNonDisplay = true; // } itemList.Add(fldItem); curRowCol = curRowCol.Advance(1); // advance because of attrbyte. } else if (order.OrderCode == WtdOrder.SetBufferAddress) { var sba = order as SetBufferAddressOrder; curRowCol = sba.GetRowCol(ScreenDim).ToZeroRowCol(); } else if (order.OrderCode == WtdOrder.InsertCursor) { var ico = order as InsertCursorOrder; caret = ico.RowCol; } else if (order.OrderCode == WtdOrder.RepeatToAddress) { var rao = order as RepeatToAddressOrder; var s1 = rao.RepeatShowText((ZeroRowCol)curRowCol); var litItem = new ShowLiteralItem((ZeroRowCol)curRowCol, s1); litItem.rao_RepeatTextByte = rao.RepeatTextByte; litItem.rao_ToRowCol = rao.RowCol; itemList.Add(litItem); curRowCol = curRowCol.Advance(s1.Length); } else if (order.OrderCode == WtdOrder.EraseToAddress) { var eao = order as EraseToAddressOrder; var lx = eao.EraseLength((ZeroRowCol)curRowCol); var s1 = (" ").Repeat(lx); var litItem = new ShowLiteralItem((ZeroRowCol)curRowCol, s1); litItem.rao_RepeatTextByte = 0x00; litItem.rao_ToRowCol = eao.RowCol; itemList.Add(litItem); curRowCol = curRowCol.Advance(s1.Length); } } return(new Tuple <ShowItemList, OneRowCol>(itemList, caret)); }
public static Tuple <int, int, List <ShowItemBase>, TelnetLogList> GetAndProcessStream( TcpClient Client, NetworkStream NetStream, NetworkStreamBackedInputByteArray InputArray, NegotiateSettings NegotiateSettings, bool ForceRead = false) { int sendStmtCx = 0; int getStmtCx = 0; var logList = new TelnetLogList(); var showItemList = new ShowItemList(); bool exitLoop = false; while (exitLoop == false) { // read available bytes from input stream. if (InputArray.IsEof()) { var log = InputArray.ReadFromNetworkStream(5, 5, ForceRead); logList.AddItems(log); } // no input data to process. if (InputArray.IsEof()) { break; } DataStreamHeader currentDataStreamHeader = null; while (true) { if (InputArray.IsEof() == true) { break; } // process the input as 5250 data stream commands. if (currentDataStreamHeader != null) { var rv = ParseAndProcessWorkstationCommand(InputArray, currentDataStreamHeader); var workstationCommand = rv.Item1; showItemList = rv.Item2; currentDataStreamHeader = rv.Item3; logList.AddItems(rv.Item4); continue; } // peek and process input bytes as a telnet stmt. ( starts with IAC ) var telCmd = InputArray.NextTelnetCommand(); if (telCmd != null) { getStmtCx += 1; var rv = TelnetConnection.ProcessTelnetCommand(telCmd, NegotiateSettings); var cx = rv.Item1; var writeBytes = rv.Item2; logList.AddItems(rv.Item3); sendStmtCx += cx; WriteToHost(logList, writeBytes, NetStream); continue; } var dsh = new DataStreamHeader(InputArray); if ((dsh != null) && (dsh.Errmsg == null)) { logList.AddItem(Direction.Read, dsh.ToString()); currentDataStreamHeader = dsh; continue; } exitLoop = true; break; } } return(new Tuple <int, int, List <ShowItemBase>, TelnetLogList>( getStmtCx, sendStmtCx, showItemList, logList)); }