package org.crsh.ssh.term.inline; import org.crsh.shell.ShellProcess; import org.crsh.shell.ShellProcessContext; import org.crsh.shell.ShellResponse; import org.crsh.ssh.term.SSHContext; import org.crsh.text.Screenable; import org.crsh.text.Style; import java.io.IOException; import java.io.PrintStream; import java.util.concurrent.CountDownLatch; /** ShellProcessContext for SSH inline commands */ public class SSHInlineShellProcessContext implements ShellProcessContext { /** . */ private static final String MSG = "Cannot determine tty width : you should force pseudo-tty allocation (-t option)"; /** . */ private boolean msgDone; /** . */ private ShellResponse response; /** . */ private final CountDownLatch latch; /** . */ private final SSHContext context; /** . */ private final ShellProcess process; /** . */ private final PrintStream out; /** . */ private final PrintStream err; SSHInlineShellProcessContext(SSHContext context, ShellProcess process, PrintStream out, PrintStream err) { this.out = out; this.context = context; this.process = process; this.latch = new CountDownLatch(1); this.response = null; this.err = err; this.msgDone = false; } public SSHInlineShellProcessContext execute() { process.execute(this); return this; } public boolean takeAlternateBuffer() { return false; } public boolean releaseAlternateBuffer() { return false; } public int getWidth() { int width = context.getWidth(); if (width == -1) { if (!msgDone) { msgDone = true; out.print(MSG); out.flush(); } } return width; } public int getHeight() { int height = context.getHeight(); if (height == -1) { if (!msgDone) { msgDone = true; out.print(MSG); out.flush(); } } return height; } public String getProperty(String name) { return context.getProperty(name); } public String readLine(String msg, boolean echo) { return null; } @Override public Appendable append(char c) throws IOException { return append(Character.toString(c)); } @Override public Appendable append(CharSequence s) throws IOException { return append(s, 0, s.length()); } @Override public Appendable append(CharSequence csq, int start, int end) throws IOException { while (start < end) { // This is not perfect but it will be OK for now // ideally we should reuse the IO / ConsoleTerm stuff // but for now we don't have the time to do it properly char c = csq.charAt(start++); if (c == '\r') { // } else if (c == '\n') { out.print("\r\n"); } else { out.print(c); } } return this; } @Override public Screenable append(Style style) throws IOException { return null; } @Override public Screenable cls() throws IOException { return null; } public void flush() throws IOException { out.flush(); } public void end(ShellResponse response) { this.response = response; this.latch.countDown(); } ShellResponse getResponse() { try { latch.await(); return response; } catch (InterruptedException e) { throw new RuntimeException(e); } } }