示例#1
0
        TelnetConnectAndNegotiate(
            string Host, NegotiateSettings NegotiateSettings,
            ConcurrentMessageQueue TelnetQueue, ToThread ToThread)
        {
            var           sessionSettings = new SessionSettings();
            TelnetLogList logList         = null;
            bool          breakLoop       = false;

            // loop reading from NetworkStream and processing the telnet command.
            // loop until break flag is set.
            while (breakLoop == false)
            {
                var item = TelnetQueue.WaitAndPeek();
                if ((item is TelnetCommand) == false)
                {
                    break;
                }
                var telCmd = TelnetQueue.WaitAndDequeue() as TelnetCommand;

                byte[] responseBytes = null;
                {
                    var rv = ProcessTelnetCommand(telCmd, NegotiateSettings);
                    var cx = rv.Item1;
                    responseBytes = rv.Item2;
                }

                if ((responseBytes != null) && (responseBytes.Length > 0))
                {
                    var dataMessage = new SendDataMessage(responseBytes);
                    ToThread.PostInputMessage(dataMessage);
                }
            }
            return(new Tuple <SessionSettings, TelnetLogList>(
                       sessionSettings, logList));
        }
        private void TelnetDisplayStartup(
            ServerConnectPack ConnectPack, NegotiateSettings NegotiateSettings,
            ConcurrentMessageQueue TelnetQueue,
            FromThread FromThread, ToThread ToThread,
            Window ClientWindow, Action <bool, TypeTelnetDevice?> TelnetStartupComplete)
        {
            // initial telnet back and forth negotiation with server.
            var rv = TelnetConnection.TelnetConnectAndNegotiate(
                ConnectPack.HostName, NegotiateSettings,
                TelnetQueue, ToThread);
            var sessionSettings = rv.Item1;

            ConnectPack.Settings = sessionSettings;

            // read the dataStreamHeader from the Telnet thread.
            // this message contains the startup up code ( I902 ), system name and
            // printer name.  The next message from the server will be sent when there
            // is a spooled file ready to print.
            var attrMsg = TelnetQueue.WaitAndDequeue() as TelnetDeviceAttrMessage;

            if (attrMsg != null)
            {
                // signal startup is complete to the telnet window on the UI thread.
                var bi = ClientWindow.Dispatcher.BeginInvoke(
                    DispatcherPriority.Input, new ThreadStart(
                        () =>
                {
                    TelnetStartupComplete(true, attrMsg.TypeDevice);
                }));
            }
        }
        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));
        }
示例#4
0
        public static Tuple <int, byte[], TelnetLogList> ProcessTelnetCommand(
            TelnetCommand TelnetCmd, NegotiateSettings NegotiateSettings,
            bool doLog = false)
        {
            TelnetLogList logList = null;

            if (doLog == true)
            {
                logList = new TelnetLogList();
            }
            int cx          = 0;
            var writeStream = new ByteArrayBuilder();

            // write to the run log.
            if (logList != null)
            {
                logList.AddItem(Direction.Read, TelnetCmd.ToString());
            }

            if (TelnetCmd.CmdCode == Enums.CommandCode.DO)
            {
                var replyStmt = TelnetCmd.BuildReply(NegotiateSettings);
                writeStream.Append(replyStmt.ToBytes());
            }

            else if (TelnetCmd is NewEnvironCommand)
            {
                var envStmt = TelnetCmd as NewEnvironCommand;
                cx = ProcessNewEnvironStatement(envStmt, writeStream, NegotiateSettings);
            }

            else if (TelnetCmd is TerminalTypeCommand)
            {
                var ttStmt = TelnetCmd as TerminalTypeCommand;
                cx = ProcessTerminalTypeStatement(ttStmt, writeStream, NegotiateSettings);
            }

            else if ((TelnetCmd is EndOfRecordStatement) || (TelnetCmd is TransmitBinaryCommand))
            {
                if (TelnetCmd.CmdCode == Enums.CommandCode.DO)
                {
                    var replyStmt = TelnetCmd.BuildReply(NegotiateSettings);
                    writeStream.Append(replyStmt.ToBytes());

                    if ((replyStmt.CmdCode == Enums.CommandCode.DO) &&
                        (replyStmt.Subject.IsEqual(TelnetSubject.TRANSMIT_BINARY)))
                    {
                    }
                }
                else if (TelnetCmd.CmdCode == Enums.CommandCode.WILL)
                {
                    var replyStmt = TelnetCmd.BuildDoReply();
                    writeStream.Append(replyStmt.ToBytes());
                }
            }
            return(new Tuple <int, byte[], TelnetLogList>(cx, writeStream.ToByteArray(), logList));
        }
        private void TelnetInitialConnect(
            string ServerName, bool AutoConnect, string DeviceName,
            string TerminalType)
        {
            var             host            = ServerName;
            int             port            = 23;
            SessionSettings sessionSettings = null;

            // already connected.
            if (this.ConnectPack?.IsConnected() == true)
            {
                MessageBox.Show("already connected to telnet server.");
                return;
            }

            MainWindow.LogFile.ClearFile();

            // TelnetNegotiateSettings
            //    - WILL EOR
            //    - WILL TERMINAL TYPE
            //    - TERMINAL TYPE
            //    - user name, terminal name
            // TelnetCommand.Negotiate( negotiateSettings )
            // returns TelnetSessionAttributes

            // after negotiate, call method to send and receive 5250 DataStreamHeader
            // followed by escape 04 orders
            // code is receive 5250 command, render to screen, wait for screen AID key,
            // send 5250 command response.
            var negSettings = NegotiateSettings.Build5250Settings(
                "SRICHTER", DeviceName, TerminalType);

            // connect to the server.
            var rv = ConnectToServer_StartServerThreads(ServerName, port);

            this.ConnectPack = rv.Item1;
            sessionSettings  = rv.Item2;

            if (this.ConnectPack.IsConnected() == true)
            {
                // send message to connect thread. This will run telnet device startup
                // processing on a backround thread. This way problems do not lock up
                // the UI.
                {
                    var startupMessage = new TelnetStartupMessage(
                        this.TelnetQueue,
                        this.ConnectPack, negSettings, this, MainWindow_TelnetStartupComplete,
                        TypeTelnetDevice.Terminal);

                    this.ConnectThread.PostInputMessage(startupMessage);
                }
            }
        }
示例#6
0
 public TelnetStartupMessage(
     ConcurrentMessageQueue TelnetQueue,
     ServerConnectPack ServerConnectPack, NegotiateSettings NegotiateSettings,
     Window ClientWindow, Action <bool, TypeTelnetDevice?> TelnetStartupComplete,
     TypeTelnetDevice TypeTelnetDevice)
 {
     this.TelnetQueue           = TelnetQueue;
     this.ServerConnectPack     = ServerConnectPack;
     this.NegotiateSettings     = NegotiateSettings;
     this.ClientWindow          = ClientWindow;
     this.TypeTelnetDevice      = TypeTelnetDevice;
     this.TelnetStartupComplete = TelnetStartupComplete;
 }
示例#7
0
        private static int ProcessNewEnvironStatement(
            NewEnvironCommand Stmt, ByteArrayBuilder WriteStream,
            NegotiateSettings NegotiateSettings)
        {
            int sendStmtCx = 0;

            // got the stmt with the SEND parm. Send back the NEW_ENVIRON stmt with the IS parm.
            if ((Stmt.SubOption != null) &&
                (Stmt.SubOption.Value == TelnetOptionParm.SEND))
            {
                var neSend =
                    new NewEnvironCommand(Enums.CommandCode.SB, TelnetOptionParm.IS);

                foreach (var newEnv in NegotiateSettings.SendNewEnvironList)
                {
                    var optnVar = newEnv.ToOptionVariable(NegotiateSettings.SbsValuesDict);
                    neSend.AddOptionVar(optnVar);
                }

                int xx = 25;
                if (xx == 26)
                {
                    neSend.AddOptionVar(EnvironVarCode.VAR, "USER", "SRICHTER");
                    neSend.AddOptionVar(EnvironVarCode.VAR, "DEVNAME", "STEVE25");

                    // reply to newEnviron IBMRSEED stmt SEND statement.
                    if (Stmt.ContainsUserVar_IBMRSEED() == true)
                    {
                        byte[] clientSeed = new byte[8] {
                            0x55, 0x56, 0x59, 0x5a, 0x5b, 0x5c, 0x4c, 0x48
                        };
                        string passWord             = "******";
                        string userName             = "******";
                        var    serverSeed           = Stmt.IBMRSEED_SeedValue();
                        var    substitutionPassword =
                            CipherCommon.EncryptPassword(passWord, userName, serverSeed, clientSeed);
                        neSend.AddOptionVar(EnvironVarCode.USERVAR, "IBMRSEED", clientSeed);
                        neSend.AddOptionVar(EnvironVarCode.USERVAR, "IBMSUBSPW", substitutionPassword);
                    }
                }

                WriteStream.Append(neSend.ToBytes());

                // send the SE command immed after NEW-ENVIRON
                {
                    var ts = new TelnetCommand(Enums.CommandCode.SE);
                    WriteStream.Append(ts.ToBytes());
                }
            }
            return(sendStmtCx);
        }
示例#8
0
        TelnetPrinterConnectAndNegotiate(
            string Host, NegotiateSettings NegotiateSettings,
            ConcurrentMessageQueue TelnetQueue,
            ServerConnectPack ConnectPack, bool doLog = false)
        {
            var           sessionSettings = new SessionSettings();
            TelnetLogList logList         = null;

            // BgnTemp
            doLog = true;
            // EndTemp

            if (doLog == true)
            {
                logList = new TelnetLogList();
            }
            bool breakLoop = false;

            // loop reading from NetworkStream and processing the telnet command.
            // loop until break flag is set.
            while (breakLoop == false)
            {
                var item = TelnetQueue.WaitAndPeek();
                if ((item is TelnetCommand) == false)
                {
                    break;
                }
                var telCmd = TelnetQueue.WaitAndDequeue() as TelnetCommand;

                byte[] responseBytes = null;
                {
                    var rv = ProcessTelnetCommand(telCmd, NegotiateSettings, doLog);
                    var cx = rv.Item1;
                    responseBytes = rv.Item2;
                    if (doLog == true)
                    {
                        logList.AddItems(rv.Item3);
                    }
                }

                if ((responseBytes != null) && (responseBytes.Length > 0))
                {
                    WriteToHost(logList, responseBytes, ConnectPack.TcpClient.GetStream());
                }
            }
            return(new Tuple <SessionSettings, TelnetLogList>(
                       sessionSettings, logList));
        }
        /// <summary>
        /// reply to the DO command with a WILL or WONT command as per NegotiateSettings.
        /// </summary>
        /// <param name="Settings"></param>
        /// <returns></returns>
        public TelnetCommand BuildReply(NegotiateSettings Settings)
        {
            TelnetCommand reply  = null;
            var           option = this.Subject.Value;

            if (Settings.OptionDict.ContainsKey(option) == true)
            {
                var cmdCode = Settings.OptionDict[option];
                reply = new TelnetCommand(cmdCode, this.Subject.Value);
            }
            else
            {
                reply = new TelnetCommand(CommandCode.WONT, this.Subject.Value);
            }
            return(reply);
        }
示例#10
0
        private static int ProcessTerminalTypeStatement(
            TerminalTypeCommand Stmt, ByteArrayBuilder WriteStream,
            NegotiateSettings NegotiateSettings)
        {
            int sendStmtCx = 0;

            if ((Stmt.SubOption != null) &&
                (Stmt.SubOption.Value == TelnetOptionParm.SEND))
            {
                var ttSend =
                    new TerminalTypeCommand(Enums.CommandCode.SB, TelnetOptionParm.IS);
                ttSend.AssignTerminalName(NegotiateSettings.TerminalType);
                ttSend.GotClosingSE = true;
                WriteStream.Append(ttSend.ToBytes());
            }
            return(sendStmtCx);
        }
        private void TelnetPrinterConnect(string ServerName)
        {
            var             host            = ServerName;
            int             port            = 23;
            SessionSettings sessionSettings = null;

            // already connected.
            if (this.ConnectPack?.IsConnected() == true)
            {
                MessageBox.Show("already connected to telnet server.");
                return;
            }

            MainWindow.LogFile.ClearFile();

            var negSettings = NegotiateSettings.Build5250Settings(
                "SRICHTER", "STEVE41P", "IBM-3812-1");
            //      var negSettings = NegotiateSettings.Build5250Settings(
            //        "SRICHTER", "STEVE42P", "IBM-5256-1");

            // connect to the server.
            var rv = ConnectToServer_StartServerThreads(ServerName, port);

            this.ConnectPack = rv.Item1;
            sessionSettings  = rv.Item2;

            if (this.ConnectPack.IsConnected() == true)
            {
                // send message to connect thread. This will run telnet device startup
                // processing on a backround thread. This way problems do not lock up
                // the UI.
                {
                    var startupMessage = new TelnetStartupMessage(
                        this.TelnetQueue,
                        this.ConnectPack, negSettings, this, MainWindow_TelnetStartupComplete,
                        TypeTelnetDevice.Printer);
                    this.ConnectThread.PostInputMessage(startupMessage);
                }
            }
        }
        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            string itemText = null;

            if (sender is MenuItem)
            {
                itemText = (sender as MenuItem).Header as string;
            }

            if (itemText == "Test")
            {
                var logList     = new TelnetLogList();
                var negSettings = NegotiateSettings.Build5250Settings("SRICHTER", "Steve25");

                var lines = System.IO.File.ReadAllLines("c:\\downloads\\hextext.txt");
                var ba    = ParseHexLines(lines);

                // print the bytes of the response stream as lines of hex text.
                {
                    var rep = ba.ToHexReport(16);
                    logList.AddItem(Direction.Read, "Length:" + ba.Length + " Byte stream bytes:");
                    logList.AddItems(Direction.Read, rep);
                }

                var inputArray      = new NetworkStreamBackedInputByteArray(ba, ba.Length);
                var sessionSettings = new SessionSettings();

                var rv = Process5250.GetAndParseWorkstationCommandList(
                    inputArray, sessionSettings);

                logList.AddItems(rv.Item2);
                var wrkstnCmdList = rv.Item1;

                // draw the fields and literals on the canvas.
                if (wrkstnCmdList != null)
                {
                    foreach (var workstationCmd in wrkstnCmdList)
                    {
                    }
                }

                foreach (var item in logList)
                {
                    this.Model.RunLog.Add(item.Text);
                }

                return;
            }

            else if (itemText == "Parse server stream")
            {
                var text  = TextBox1.Text;
                var lines = text.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

                var ba = ParseHexLines(lines);

                // print the bytes of the response stream as lines of hex text.
                {
                    TelnetLogList logList = new TelnetLogList();
                    var           rep     = ba.ToHexReport(16);
                    logList.AddItem(Direction.Read, "Length:" + ba.Length + " Byte stream bytes:");
                    logList.AddItems(Direction.Read, rep);
                }
            }

            else if (itemText == "Parse response stream")
            {
                var logList     = new TelnetLogList();
                var negSettings = NegotiateSettings.Build5250Settings("SRICHTER", "Steve25");

                var lines = System.IO.File.ReadAllLines("c:\\downloads\\hextext.txt");
                var ba    = ParseHexLines(lines);

                // print the bytes of the response stream as lines of hex text.
                {
                    var rep = ba.ToHexReport(16);
                    logList.AddItem(Direction.Read, "Length:" + ba.Length + " Byte stream bytes:");
                    logList.AddItems(Direction.Read, rep);
                }

                Process5250.ParseResponseStream(logList, ba);

                foreach (var item in logList)
                {
                    if (item.NewGroup == true)
                    {
                        this.Model.RunLog.Add("");
                    }
                    this.Model.RunLog.Add(item.Text);
                }

                return;
            }

            else if (itemText == "Exit")
            {
                this.Close();
            }

            else if (itemText == "Settings")
            {
            }

            else if (itemText == "Print")
            {
                LinePrinter.PrintLines(this.Model.RunLog);
            }
            else if (itemText == "Clear log")
            {
                Model.RunLog.Clear();
            }
        }
        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));
        }