public void EntryPoint() { this.ThreadEndedEvent.Reset(); try { // loop receiving from the server until: // - the foreground thread wants to shutdown the connection. It has set // the ShutdownFlag event. while ((ShutdownFlag.State == false)) { var message = InputQueue.WaitAndDequeue(this.ShutdownFlag.EventObject); if (message != null) { if (message is AidKeyResponseMessage) { var msg = message as AidKeyResponseMessage; var content = msg.ScreenContent.GetWorkingContentBlock(); BuildAndSendResponseDataStream(msg.AidKey, content, this.LogList); } else if (message is SaveScreenMessage) { var msg = message as SaveScreenMessage; var ra = SaveScreenCommand.BuildSaveScreenResponse(msg.ScreenContent); TelnetConnection.WriteToHost( null, ra, this.Client.GetStream()); } else if (message is ReadScreenMessage) { var msg = message as ReadScreenMessage; var ra = ReadScreenCommand.BuildReadScreenResponse(msg.ScreenContent); TelnetConnection.WriteToHost(LogList, ra, this.Client.GetStream()); } else if (message is Query5250ResponseMessage) { var msg = message as Query5250ResponseMessage; var ra = Query5250Response.BuildQuery5250Response(); TelnetConnection.WriteToHost(LogList, ra, this.Client.GetStream()); } // send the DataBytes contained in the message to the server. else if (message is SendDataMessage) { var msg = message as SendDataMessage; TelnetConnection.WriteToHost( LogList, msg.DataBytes, this.Client.GetStream()); } else if (message is GeneralThreadMessage) { var generalMessage = message as GeneralThreadMessage; switch (generalMessage.MessageCode) { case ThreadMessageCode.ClearLog: { this.LogList.Clear(); break; } } } } } } finally { // in case anyone waiting for this thread to end. Signal the ended event. ThreadEndedEvent.Set(); } }
ProcessWorkstationDataStream(this ConnectedSocketPack SocketPack) { WorkstationCommandList workstationCmdList = null; List <WriteToDisplayCommand> wtdCmdList = null; HowReadScreen?howRead = null; var logList = new TelnetLogList(); while (true) { // 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(20, 30); 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); workstationCmdList = rv.Item1; logList.AddItems(rv.Item2); } foreach (var workstationCmd in workstationCmdList) { if (workstationCmd is ClearUnitCommand) { } else if (workstationCmd is WriteToDisplayCommand) { 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 = SaveScreenCommand.BuildSaveScreenResponse(); Debug.WriteLine("Response: " + ra.ToHex(' ')); // send response stream back to server. { TelnetConnection.WriteToHost(logList, ra, SocketPack.TcpStream); } // BgnTemp logList.AddSpecialItem(LogItemSpecial.NewGeneration); // EndTemp } else if (workstationCmd is WriteStructuredFieldCommand) { var wsfCmd = workstationCmd as WriteStructuredFieldCommand; if (wsfCmd.RequestCode == WSF_RequestCode.Query5250) { var ra = Query5250Response.BuildQuery5250Response(); Debug.WriteLine("Response: " + ra.ToHex(' ')); // send response stream back to server. { TelnetConnection.WriteToHost(logList, ra, SocketPack.TcpStream); } } } } } } return(new Tuple <HowReadScreen?, List <WriteToDisplayCommand>, TelnetLogList>( howRead, wtdCmdList, logList)); }