public CanvasPositionCursor FindVisualItemCanvas(IRowCol RowCol) { CanvasPositionCursor posCursor = null; VisualItemCursor foundCursor = null; int foundPos = 0; foreach (var ic in this.InputItemList()) { var ivi = ic.GetVisualItem(); if (ivi.ContainsLocation(RowCol)) { foundCursor = ic; foundPos = RowCol.ColNum - ivi.ShowRowCol().ColNum + 1; break; } } if (foundCursor == null) { posCursor = new CanvasPositionCursor(RowCol as ZeroRowCol); } else { posCursor = new CanvasPositionCursor(foundCursor, foundPos); } return(posCursor); }
public static CanvasPositionCursor LocalPosToParentPos( this IRowCol AdjustRowCol, CanvasPositionCursor LocalPos) { CanvasPositionCursor parentPos = null; if (AdjustRowCol == null) { parentPos = LocalPos; } else { parentPos = LocalPos.Add(AdjustRowCol); } return(parentPos); }
/// <summary> /// no longer used. called WorkstationCommandListExt.ProcessAndPaint, which /// itself is not used. /// </summary> /// <param name="VisualItems"></param> /// <param name="Caret"></param> /// <returns></returns> public static byte[] BuildSaveScreenResponse( ScreenVisualItems VisualItems, CanvasPositionCursor Caret) { var ra = new ByteArrayBuilder(); // data stream header. { var buf = DataStreamHeader.Build(50, TerminalOpcode.SaveScreen, 0, 0); ra.Append(buf); } // restore screen workstation command. { var cmd = new RestoreScreenCommand(); ra.Append(cmd.ToBytes()); } // clear unit command. { var cmd = new ClearUnitCommand(); ra.Append(cmd.ToBytes()); } // WTD command. { var ordersByteStream = VisualItems.BuildOrderStream(Caret); var buf = WriteToDisplayCommand.Build(0x00, 0x18, ordersByteStream); ra.Append(buf); } // update length of response data stream. { var wk = new ByteArrayBuilder(); wk.AppendBigEndianShort((short)ra.Length); ra.CopyToBuffer(wk.ToByteArray(), 0); } // IAC EOR { ra.Append(EOR_Command.Build()); } return(ra.ToByteArray()); }
/// <summary> /// build a byte stream containing the WTD workstation command orders from all /// of the visual items on the canvas. The visual item list is the equivalent of /// the 5250 format table. /// </summary> /// <param name="VisualItems"></param> /// <returns></returns> public byte[] BuildOrderStream(CanvasPositionCursor Caret) { ByteArrayBuilder ba = new ByteArrayBuilder(); // start header order. { byte[] cmdKeySwitches = new byte[] { 0x00, 0x00, 0x00 }; var buf = StartHeaderOrder.Build(0x00, 0x00, 24, cmdKeySwitches); ba.Append(buf); } // insert cursor order. { var zeroRowCol = Caret.RowCol as ZeroRowCol; var rowCol = zeroRowCol.ToOneRowCol() as OneRowCol; var buf = InsertCursorOrder.Build(rowCol); ba.Append(buf); } // build sets of SBA, StartField and TextData orders for each visual item. The // visual item represents something on the screen. Whether output literal or // and input field. // VisualItem visualItem = null; IVisualItem iVisual = null; var cursor = this.FirstVisualItem(); while (cursor != null) { var pvVisualItem = iVisual; iVisual = cursor.GetVisualItem(); if (iVisual is VisualSpanner) { } else { { var buf = SetBufferAddressOrder.Build( iVisual.ItemRowCol.ToOneRowCol() as OneRowCol); ba.Append(buf); } var visualItem = iVisual as VisualItem; if (iVisual.IsField == true) { var vtb = iVisual as VisualTextBlock; var ffw = vtb.FFW_Bytes; byte attrByte = iVisual.AttrByte.Value; int lgth = iVisual.ShowText.Length; var buf = StartFieldOrder.Build(ffw[0], ffw[1], attrByte, lgth); ba.Append(buf); } // create a text data order from either the text of the literal item. Or the // text value of the entry field. { byte[] buf = null; var s1 = iVisual.ShowText; if (iVisual.IsField == true) { buf = TextDataOrder.Build(s1, null, iVisual.TailAttrByte); } else if (visualItem.CreateFromItem != null) { var litItem = visualItem.CreateFromItem as ShowLiteralItem; if (litItem.rao_RepeatTextByte != null) { var toRowCol = (iVisual.ItemEndRowCol() as ZeroRowCol).ToOneRowCol(); buf = RepeatToAddressOrder.Build( litItem.rao_RepeatTextByte.Value, toRowCol as OneRowCol); } else { var attrByte = litItem.AttrByte; if (s1.Length < litItem.tdo_Length) { s1 = s1.PadRight(litItem.tdo_Length); } buf = TextDataOrder.Build(s1, attrByte, iVisual.TailAttrByte); } } else { buf = TextDataOrder.Build(s1, iVisual.AttrByte, iVisual.TailAttrByte); } ba.Append(buf); } } cursor = cursor.NextItem(true); } return(ba.ToByteArray());; }
ProcessWorkstationDataStream( this ServerConnectPack ConnectPack, ScreenVisualItems VisualItems, CanvasPositionCursor Caret) { WorkstationCommandList workstationCmdList = null; List <WriteToDisplayCommand> wtdCmdList = null; DataStreamHeader dsh = null; var returnCmdList = new WorkstationCommandList(); HowReadScreen?howRead = null; var logList = new TelnetLogList(); bool gotEOR = false; while (gotEOR == false) { // input array is eof. Exit loop if have read a READ workstn command. // Otherwise, read from server. if (ConnectPack.ReadBlocks.IsEmpty == true) { if (howRead != null) { break; } } var item = ConnectPack.ReadBlocks.WaitAndDequeue(); if (item is DataStreamHeader) { dsh = item as DataStreamHeader; continue; } gotEOR = true; if (item is WorkstationCommandList) { workstationCmdList = item as WorkstationCommandList; foreach (var workstationCmd in workstationCmdList) { if (workstationCmd is ClearUnitCommand) { returnCmdList.Add(workstationCmd); } // WTD command. Add to list of WTD commands. This list is returned to // the caller of this method. else if (workstationCmd is WriteToDisplayCommand) { returnCmdList.Add(workstationCmd); var wtdCommand = workstationCmd as WriteToDisplayCommand; if (wtdCmdList == null) { wtdCmdList = new List <WriteToDisplayCommand>(); } wtdCmdList.Add(wtdCommand); } else if (workstationCmd is ReadMdtFieldsCommand) { howRead = HowReadScreen.ReadMdt; } // save screen command. Build response, send back to server. else if (workstationCmd is SaveScreenCommand) { var ra = SaveScreenCommandExt.BuildSaveScreenResponse(VisualItems, Caret); // send response stream back to server. { TelnetConnection.WriteToHost( logList, ra, ConnectPack.TcpClient.GetStream()); gotEOR = false; } } else if (workstationCmd is WriteStructuredFieldCommand) { var wsfCmd = workstationCmd as WriteStructuredFieldCommand; if (wsfCmd.RequestCode == WSF_RequestCode.Query5250) { var ra = Query5250Response.BuildQuery5250Response(); // send response stream back to server. { TelnetConnection.WriteToHost( logList, ra, ConnectPack.TcpClient.GetStream()); gotEOR = false; } } } } } } return(new Tuple <HowReadScreen?, List <WriteToDisplayCommand>, TelnetLogList, WorkstationCommandList, DataStreamHeader, bool>( howRead, wtdCmdList, logList, returnCmdList, dsh, gotEOR)); }
ProcessWorkstationDataStream( this ConnectedSocketPack SocketPack, ScreenVisualItems VisualItems, CanvasPositionCursor Caret) { WorkstationCommandList workstationCmdList = null; List <WriteToDisplayCommand> wtdCmdList = null; DataStreamHeader dsh = null; var returnCmdList = new WorkstationCommandList(); HowReadScreen?howRead = null; var logList = new TelnetLogList(); bool gotEOR = false; while (gotEOR == false) { // input array is eof. Exit loop if have read a READ workstn command. // Otherwise, read from server. if (SocketPack.InputArray.IsEof() == true) { if (howRead != null) { break; } { var log = SocketPack.InputArray.ReadFromNetworkStream(10, 60); logList.AddItems(log); if (SocketPack.InputArray.IsEof() == true) { break; } } } // peek at the input stream from server. Classify the data that is next // to receive. var typeData = ServerDataStream.PeekServerCommand(SocketPack.InputArray); // input data not recogizied. Not a 5250 data strem header. if (typeData == null) { logList.AddItem(Direction.Read, "Unknown data stream data"); logList.AddItems( Direction.Read, SocketPack.InputArray.PeekBytes().ToHexReport(16)); break; } if (typeData.Value == TypeServerData.workstationHeader) { { var rv = Process5250.GetAndParseWorkstationCommandList( SocketPack.InputArray, SocketPack.Settings); dsh = rv.Item1; workstationCmdList = rv.Item2; logList.AddItems(rv.Item3); gotEOR = rv.Item4; } foreach (var workstationCmd in workstationCmdList) { if (workstationCmd is ClearUnitCommand) { returnCmdList.Add(workstationCmd); } // WTD command. Add to list of WTD commands. This list is returned to the // caller of this method. else if (workstationCmd is WriteToDisplayCommand) { returnCmdList.Add(workstationCmd); var wtdCommand = workstationCmd as WriteToDisplayCommand; if (wtdCmdList == null) { wtdCmdList = new List <WriteToDisplayCommand>(); } wtdCmdList.Add(wtdCommand); } else if (workstationCmd is ReadMdtFieldsCommand) { howRead = HowReadScreen.ReadMdt; } // save screen command. Build response, send back to server. else if (workstationCmd is SaveScreenCommand) { var ra = SaveScreenCommandExt.BuildSaveScreenResponse(VisualItems, Caret); // send response stream back to server. { TelnetConnection.WriteToHost(logList, ra, SocketPack.TcpStream); gotEOR = false; } } else if (workstationCmd is WriteStructuredFieldCommand) { var wsfCmd = workstationCmd as WriteStructuredFieldCommand; if (wsfCmd.RequestCode == WSF_RequestCode.Query5250) { var ra = Query5250Response.BuildQuery5250Response(); // send response stream back to server. { TelnetConnection.WriteToHost(logList, ra, SocketPack.TcpStream); gotEOR = false; } } } else if (workstationCmd is WriteSingleStructuredFieldCommand) { } } } } return(new Tuple <HowReadScreen?, List <WriteToDisplayCommand>, TelnetLogList, WorkstationCommandList, DataStreamHeader, bool>( howRead, wtdCmdList, logList, returnCmdList, dsh, gotEOR)); }