package com.netifera.platform.host.terminal.probe; import com.netifera.platform.api.dispatcher.IMessenger; import com.netifera.platform.api.dispatcher.IProbeMessage; import com.netifera.platform.api.dispatcher.MessengerException; import com.netifera.platform.host.terminal.ITerminal; import com.netifera.platform.host.terminal.ITerminalOutputHandler; public class RemoteTerminal implements ITerminal { private final String ptyName; private final RemoteTerminalManager manager; private final ITerminalOutputHandler outputHandler; private int lastWidth = -1; private int lastHeight = -1; RemoteTerminal(String ptyName, RemoteTerminalManager manager, ITerminalOutputHandler outputHandler) { this.ptyName = ptyName; this.manager = manager; this.outputHandler = outputHandler; } public String getName() { return ptyName; } public void sendInput(byte[] data) { emitMessage(new TerminalInput(ptyName, data)); } public void receiveOutput(byte[] data) { outputHandler.terminalOutput(ptyName, data, data.length); } public void setSize(int width, int height) { if(width == lastWidth && height == lastHeight) return; emitMessage(new TerminalSizeChange(ptyName, width, height)); lastWidth = width; lastHeight = height; } public void close() { emitMessage(new CloseTerminal(ptyName)); } void setClosed() { manager.removeTerminal(ptyName); outputHandler.terminalClosed(ptyName); } private void emitMessage(IProbeMessage message) { final IMessenger messenger = manager.getProbe().getMessenger(); if(messenger == null) { manager.getLogger().error("Cannot send message because probe has no active messenger"); setClosed(); return; } try { messenger.emitMessage(message); } catch (MessengerException e) { manager.getLogger().warning("Messenger error sending message " + e.getMessage(), e); setClosed(); } } }