public ConsoleWindowBackendAnalyzer()
        {
            preferredTerminal = ConfigurationManager.Instance.Get("general", "terminal", TerminalTypes.Termsharp);
#if EMUL8_PLATFORM_WINDOWS
            if (preferredTerminal != TerminalTypes.Termsharp)
            {
                Logger.LogAs(this, LogLevel.Warning, "Only >>Termsharp<< terminal is available on Windows - forcing to use it.");
            }
#endif
            if (preferredTerminal == TerminalTypes.Termsharp)
            {
                ApplicationExtensions.InvokeInUIThreadAndWait(() =>
                {
                    terminalWidget = new TerminalWidget(() => window.HasFocus);
                });
                IO = terminalWidget.IO;
            }
#if !EMUL8_PLATFORM_WINDOWS
            else
            {
                ptyUnixStream = new PtyUnixStream();
                IO            = new IOProvider(new StreamIOSource(ptyUnixStream));
            }
#endif
        }
Example #2
0
        // isMonitorWindows is not used for ProcessBasedProvider
        public bool TryOpen(string consoleName, out IIOSource io, bool isMonitorWindow = false)
        {
            var ptyUnixStream = new PtyUnixStream();

            io = new StreamIOSource(ptyUnixStream);

            if (!CheckScreenTool())
            {
                process = null;
                return(false);
            }

            var commandString = $"{ScreenTool} {(ptyUnixStream.SlaveName)}";

            process = CreateProcess(consoleName, commandString);
            if (!RunProcess(process))
            {
                process = null;
                return(false);
            }

            // here we give 1s time for screen to start; otherwise some initial data (e.g. banner could be lost)
            Thread.Sleep(1000);
            return(true);
        }
Example #3
0
        public UartPtyTerminal(string linkName, bool forceCreate = false)
        {
            var ptyUnixStream = new PtyUnixStream();

            io = new IOProvider {
                Backend = new StreamIOSource(ptyUnixStream)
            };
            io.ByteRead += b => CallCharReceived((byte)b);

            if (File.Exists(linkName))
            {
                if (!forceCreate)
                {
                    throw new RecoverableException(string.Format("File `{0}' already exists. Use forceCreate to overwrite it.", linkName));
                }

                try
                {
                    File.Delete(linkName);
                }
                catch (Exception e)
                {
                    throw new RecoverableException(string.Format("There was an error when removing existing `{0}' symlink: {1}", linkName, e.Message));
                }
            }
            try
            {
                var slavePtyFile = new UnixFileInfo(ptyUnixStream.SlaveName);
                symlink = slavePtyFile.CreateSymbolicLink(linkName);
            }
            catch (Exception e)
            {
                throw new RecoverableException(string.Format("There was an error when when creating a symlink `{0}': {1}", linkName, e.Message));
            }
        }
 private void Initialize()
 {
     ptyStream = new PtyUnixStream();
     io        = new IOProvider {
         Backend = new StreamIOSource(ptyStream)
     };
     io.ByteRead += CharReceived;
     CreateSymlink(linkName);
 }
 public SlipRadio(string linkName)
 {
     ptyStream = new PtyUnixStream();
     io        = new IOProvider {
         Backend = new StreamIOSource(ptyStream)
     };
     buffer       = new List <byte>();
     io.ByteRead += CharReceived;
     CreateSymlink(linkName);
 }
Example #6
0
 // this constructor is needed by the monitor; do not remove it
 public UARTWindowBackendAnalyzer()
 {
     preferredTerminal = ConfigurationManager.Instance.Get("general", "terminal", TerminalTypes.XTerm);
     if (preferredTerminal == TerminalTypes.Termsharp)
     {
         terminalWidget = new TerminalWidget();
         IO             = terminalWidget.IO;
     }
     else
     {
         var stream = new PtyUnixStream();
         IO = new DetachableIO(new StreamIOSource(stream, stream.Name));
     }
 }
Example #7
0
        public UartPtyTerminal(string linkName, bool forceCreate = false)
        {
            ptyStream = new PtyUnixStream();

            this.linkName    = linkName;
            this.forceCreate = forceCreate;

            io = new IOProvider {
                Backend = new StreamIOSource(ptyStream)
            };
            io.ByteRead += b => CallCharReceived((byte)b);

            CreateSymlink();
        }
Example #8
0
        public bool TryOpen(string consoleName, out IIOSource io)
        {
            var ptyUnixStream = new PtyUnixStream();

            io = new StreamIOSource(ptyUnixStream);

            var commandString = string.Format("screen {0}", ptyUnixStream.SlaveName);

            process = CreateProcess(consoleName, commandString);
            if (!RunProcess(process))
            {
                process = null;
                return(false);
            }

            // here we give 1s time for screen to start; otherwise some initial data (e.g. banner could be lost)
            Thread.Sleep(1000);
            return(true);
        }
        public static void Run(string[] args)
        {
            var options       = new Options();
            var optionsParser = new OptionsParser();

            if (!optionsParser.Parse(options, args))
            {
                return;
            }

            using (var context = ObjectCreator.OpenContext())
            {
                var monitor = new Emul8.UserInterface.Monitor();
                context.RegisterSurrogate(typeof(Emul8.UserInterface.Monitor), monitor);

                // we must initialize plugins AFTER registering monitor surrogate
                // as some plugins might need it for construction
                TypeManager.Instance.PluginManager.Init("CLI");

                Logger.AddBackend(ConsoleBackend.Instance, "console");

                EmulationManager.Instance.ProgressMonitor.Handler = new CLIProgressMonitor();

                var crashHandler = new CrashHandler();
                AppDomain.CurrentDomain.UnhandledException += (sender, e) => crashHandler.HandleCrash(e);

                var resetEvent = new ManualResetEventSlim();
                if (options.StdInOut)
                {
                    Logger.AddBackend(new FileBackend("logger.log"), "file");
                    var world = new StreamIOSource(Console.OpenStandardInput(), Console.OpenStandardOutput());
                    var io    = new DetachableIO(world);
                    monitor.Quitted += resetEvent.Set;
                    var handler = new StdInOutHandler(io, monitor, options.Plain);
                    handler.Start();
                }
                else
                {
                    Shell shell = null;
                    Type  preferredUARTAnalyzer = null;
                    if (options.Port > 0)
                    {
                        var io = new DetachableIO(new SocketIOSource(options.Port));
                        shell          = ShellProvider.GenerateShell(io, monitor, true, false);
                        shell.Quitted += resetEvent.Set;
                    }
                    else if (options.ConsoleMode)
                    {
                        preferredUARTAnalyzer = typeof(UARTMultiplexedBackendAnalyzer);

                        var stream = new PtyUnixStream("/dev/fd/1");
                        var world  = new StreamIOSource(stream, stream.Name);

                        Logger.AddBackend(new FileBackend("logger.log"), "file");
                        var consoleTerm = new ConsoleTerminal(world);
                        UARTMultiplexedBackendAnalyzer.Multiplexer = consoleTerm;

                        monitor.Console = consoleTerm;

                        shell = ShellProvider.GenerateShell(monitor);
                        consoleTerm.AttachTerminal("shell", shell.Terminal);

                        shell.Quitted += resetEvent.Set;
                    }
                    else
                    {
                        preferredUARTAnalyzer = typeof(UARTWindowBackendAnalyzer);

                        var stream   = new PtyUnixStream();
                        var dio      = new DetachableIO(new StreamIOSource(stream, stream.Name));
                        var terminal = new UARTWindowBackendAnalyzer(dio);
                        shell = ShellProvider.GenerateShell(dio, monitor);

                        shell.Quitted   += resetEvent.Set;
                        monitor.Quitted += shell.Stop;

                        try
                        {
                            terminal.Show();
                        }
                        catch (InvalidOperationException ex)
                        {
                            Console.ForegroundColor = ConsoleColor.Red;
                            Console.Error.WriteLine(ex.Message);
                            resetEvent.Set();
                        }
                    }

                    if (preferredUARTAnalyzer != null)
                    {
                        EmulationManager.Instance.CurrentEmulation.BackendManager.SetPreferredAnalyzer(typeof(UARTBackend), preferredUARTAnalyzer);
                        EmulationManager.Instance.EmulationChanged += () =>
                        {
                            EmulationManager.Instance.CurrentEmulation.BackendManager.SetPreferredAnalyzer(typeof(UARTBackend), preferredUARTAnalyzer);
                        };
                    }
                    monitor.Interaction     = shell.Writer;
                    monitor.UseConsole      = options.ConsoleMode;
                    monitor.MachineChanged += emu => shell.SetPrompt(emu != null ? new Prompt(string.Format("({0}) ", emu), ConsoleColor.DarkYellow) : null);

                    if (options.Execute != null)
                    {
                        shell.Started += s => s.InjectInput(string.Format("{0}\n", options.Execute));
                    }
                    else if (!string.IsNullOrEmpty(options.ScriptPath))
                    {
                        shell.Started += s => s.InjectInput(string.Format("i {0}{1}\n", Path.IsPathRooted(options.ScriptPath) ? "@" : "$CWD/", options.ScriptPath));
                    }

                    new Thread(x => shell.Start(true))
                    {
                        IsBackground = true, Name = "Shell thread"
                    }.Start();
                }

                resetEvent.Wait();
                EmulationManager.Instance.Clear();
                TypeManager.Instance.Dispose();
                Logger.Dispose();
            }
        }
Example #10
0
        public MainWindow(string title, string pty)
        {
            Title  = title;
            Width  = 700;
            Height = 400;

            terminal             = new TermSharp.Terminal();
            Content              = terminal;
            terminal.InnerMargin = new WidgetSpacing(5, 0, 5, 0);
            Padding              = new WidgetSpacing();

            terminal.Cursor.Enabled = true;

            Font.RegisterFontFromFile(Path.Combine(Directory.GetCurrentDirectory(), "External/TermsharpConsole/RobotoMono-Regular.ttf"));
            var robotoMonoFont = Font.FromName("Roboto Mono");

            if (robotoMonoFont.Family.Contains("Roboto"))
            {
                terminal.CurrentFont = robotoMonoFont;
            }

            var contextMenu = new Menu();

            var copyMenuItem = new MenuItem("Copy");

            copyMenuItem.Clicked += (sender, e) => Clipboard.SetText(terminal.CollectClipboardData().Text);
            contextMenu.Items.Add(copyMenuItem);

            var pasteMenuItem = new MenuItem("Paste");

            contextMenu.Items.Add(pasteMenuItem);

            terminal.ContextMenu = contextMenu;

            CloseRequested += delegate
            {
                Application.Exit();
            };

            terminal.SetFocus();

            var readerThread = new Thread(() =>
            {
                var stream       = new PtyUnixStream(pty);
                var vt100decoder = new TermSharp.Vt100.Decoder(terminal, stream.WriteByte, new ConsoleDecoderLogger());
                var utfDecoder   = new ByteUtf8Decoder(vt100decoder.Feed);

                Application.Invoke(() =>
                {
                    pasteMenuItem.Clicked += delegate
                    {
                        var text        = Clipboard.GetText();
                        var textAsBytes = Encoding.UTF8.GetBytes(text);
                        foreach (var b in textAsBytes)
                        {
                            stream.WriteByte(b);
                        }
                    };
                });

                var encoder = new TermSharp.Vt100.Encoder(x =>
                {
                    terminal.ClearSelection();
                    terminal.MoveScrollbarToEnd();
                    stream.WriteByte(x);
                });

                terminal.KeyPressed += (s, a) =>
                {
                    a.Handled = true;

                    var modifiers = a.Modifiers;
                    if (!Utilities.IsOnOsX)
                    {
                        modifiers &= ~(ModifierKeys.Command);
                    }

                    if (modifiers == ModifierKeys.Shift)
                    {
                        if (a.Key == Key.PageUp)
                        {
                            terminal.PageUp();
                            return;
                        }
                        if (a.Key == Key.PageDown)
                        {
                            terminal.PageDown();
                            return;
                        }
                    }
                    encoder.Feed(a.Key, modifiers);
                };

                var buffer            = new List <byte>();
                var noTimeoutNextTime = true;
                while (true)
                {
                    if (noTimeoutNextTime)
                    {
                        noTimeoutNextTime = false;
                    }
                    else
                    {
                        stream.ReadTimeout = 10;
                    }
                    var readByte = buffer.Count > 1024 ? BufferFull : stream.ReadByte();
                    if (readByte == StreamClosed)
                    {
                        Application.Invoke(Application.Exit);
                        return;
                    }
                    if (readByte >= 0)
                    {
                        buffer.Add((byte)readByte);
                    }
                    else
                    {
                        var bufferToWrite = buffer;
                        Application.Invoke(() =>
                        {
                            foreach (var b in bufferToWrite)
                            {
                                utfDecoder.Feed(b);
                            }
                        });
                        buffer            = new List <byte>();
                        noTimeoutNextTime = true;
                    }
                }
            })
            {
                IsBackground = true
            };

            readerThread.Start();
        }
        public UARTWindowBackendAnalyzer()
        {
            var stream = new PtyUnixStream();

            IO = new DetachableIO(new StreamIOSource(stream, stream.Name));
        }