Пример #1
0
 public WriteToTextBox(VCustomTab TabRT, Process ProcessObj)
 {
     WTabRT      = TabRT;
     WProcessObj = ProcessObj;
 }
Пример #2
0
        public async Task RunProcessAsync(string ansicon_cmd, string plink_cmd)
        {
            // Execute plink.exe
            // Exit on error and close the tab
            // Else stay on the tab, wait for the user input
            // and return output.
            // Create a tab
            VCustomTab myTabPage = new VCustomTab("");

            try
            {
                using (Process myProcess = new Process())
                {
                    String macname = macTxtBox.Text;
                    String usrname = usrTxtBox.Text;
                    String pwd     = pwdTxtBox.Text;
                    //String args = plink_cmd + " -l " + usrname + " -pw " + pwd + " " + macname;
                    String           args      = $"{plink_cmd} -l {usrname} -pw {pwd} {macname}";
                    ProcessStartInfo startInfo = new ProcessStartInfo(ansicon_cmd, args);
                    startInfo.WindowStyle            = ProcessWindowStyle.Hidden;
                    startInfo.UseShellExecute        = false;
                    startInfo.CreateNoWindow         = true;
                    startInfo.RedirectStandardOutput = true;
                    startInfo.RedirectStandardError  = true;
                    startInfo.RedirectStandardInput  = true;


                    // plink.exe is the cmd tool for putty.
                    myProcess.StartInfo = startInfo;
                    //myProcess.OutputDataReceived += CaptureOutput;
                    //myProcess.ErrorDataReceived += CaptureError;
                    // This code assumes the process you are starting will terminate itself.
                    // Given that is is started without a window so you cannot terminate it
                    // on the desktop, it must terminate itself or you can do it programmatically
                    // from this application using the Kill method.


                    myProcess.OutputDataReceived += ProcessOutputHandler;
                    String outstr = "vj";
                    myProcess.Start();

                    tabProc = new TabProcess(myProcess.StandardInput, myProcess.StandardOutput);

                    StreamWriter process_std_input_stream = myProcess.StandardInput;
                    String       tempStr = "";
                    //outstr = await ReadFromProcessAsync(myProcess.StandardOutput);
                    outstr = await tabProc.ReadFromProcessAsync();

                    tempStr += outstr;
                    //outstr = await ReadFromProcessAsync(myProcess.StandardOutput);
                    outstr = await tabProc.ReadFromProcessAsync();

                    tempStr += outstr;

                    string nextcmd = "\n"; // Enter after success
                    //await WriteToProcessAsync(myProcess.StandardInput, nextcmd);
                    await tabProc.WriteToProcessAsync(nextcmd);

                    ANSIEscapeSeq ansi_seq = new ANSIEscapeSeq();
                    // TODO: The end with character may differ : Taken Care, ANSIEscapeSeq class
                    while (outstr != null && !outstr.Trim().EndsWith("$"))
                    {
                        tempStr += outstr + "\n";
                        //outstr = await ReadFromProcessAsync(myProcess.StandardOutput);
                        outstr = await tabProc.ReadFromProcessAsync();

                        /*
                         * byte[] escTitleBytesRec = Encoding.ASCII.GetBytes(outstr);
                         * foreach (byte b in escTitleBytesRec)
                         *  Console.Write((char)b + "( " + b + ") ");
                         */
                        //myTabPage.WriteLine(outstr + "\n");
                    }
                    // Get the command prompt and title now.
                    var out_tup = ansi_seq.getTitleAndCommandPrompt(outstr);
                    myTabPage.setTitle(out_tup.Item1);
                    myTabPage.setPrompt(out_tup.Item2);
                    myTabPage.setProcessTab(tabProc);
                    tabControl1.TabPages.Add(myTabPage);

                    myTabPage.WriteLine(tempStr);
                    myTabPage.WriteLine(out_tup.Item2);

                    // Loop until the command is logout or exit or on error.

                    //await ReadFromMemStreamAsync();
                    //outstr = await ReadFromProcessAsync(myProcess.StandardOutput);
                    Console.WriteLine($"Form1: The output we got is: {outstr}");

                    /*
                     * try
                     * {
                     *  Thread.Sleep(10000);
                     *  //nextcmd = "logout";
                     *  nextcmd = "";
                     *  await WriteToProcessAsync(myProcess.StandardInput, nextcmd);
                     * }
                     * catch (Exception eex)
                     * {
                     *  Console.WriteLine($"An error occurred {eex.Message}");  // The $ is the fstrings in python.
                     * }
                     *
                     * if (myProcess.HasExited)
                     * {
                     *  myProcess.Close();
                     *  myProcess.Dispose();
                     * }
                     * else
                     * {
                     *  myProcess.Kill();
                     * }
                     */
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }