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));
        }