public MeshCentralTerminal(MeshCentralTunnel parent, int protocol, int width, int height)
        {
            this.parent   = parent;
            this.protocol = protocol;
            this.width    = width;
            this.height   = height;

            // Start the capture thread
            mainThread = new Thread(new ThreadStart(MainTerminalLoop));
            mainThread.Start();
        }
 public void Dispose()
 {
     if (process != null)
     {
         try { Process p = Process.GetProcessById(process.ProcessInfo.dwProcessId); if (p.HasExited == false)
               {
                   p.Kill();
               }
         } catch (Exception) { }
         try { process.Dispose(); } catch (Exception) { }
         process = null;
     }
     inputPipe     = null;
     outputPipe    = null;
     pseudoConsole = null;
     writer        = null;
     mainThread    = null;
     parent        = null;
 }
 /// <summary>
 /// Reads PseudoConsole output and copies it to the terminal's standard out.
 /// </summary>
 /// <param name="outputReadSide">the "read" side of the pseudo console output pipe</param>
 private static void CopyPipeToOutput(SafeFileHandle outputReadSide, MeshCentralTunnel tunnel)
 {
     byte[] buffer = new byte[1024];
     using (var pseudoConsoleOutput = new FileStream(outputReadSide, FileAccess.Read))
     {
         while (true)
         {
             int len = 0;
             try { len = pseudoConsoleOutput.Read(buffer, 0, buffer.Length); } catch (Exception) { }
             if (len == 0)
             {
                 tunnel.disconnect(); return;
             }
             if (tunnel.WebSocket != null)
             {
                 try { tunnel.WebSocket.SendBinary(buffer, 0, len); } catch (Exception) { }
             }
         }
     }
 }