001    package org.crsh.ssh.term.inline;
002    
003    import org.crsh.shell.ShellProcess;
004    import org.crsh.shell.ShellProcessContext;
005    import org.crsh.shell.ShellResponse;
006    import org.crsh.ssh.term.SSHContext;
007    import org.crsh.text.Chunk;
008    import org.crsh.text.Text;
009    
010    import java.io.IOException;
011    import java.io.PrintStream;
012    import java.util.concurrent.CountDownLatch;
013    
014    /** ShellProcessContext for SSH inline commands */
015    public class SSHInlineShellProcessContext implements ShellProcessContext {
016    
017      /** . */
018      private static final String MSG = "Cannot determine tty width : you should force pseudo-tty allocation (-t option)";
019    
020      /** . */
021      private boolean msgDone;
022    
023      /** . */
024      private ShellResponse response;
025    
026      /** . */
027      private final CountDownLatch latch;
028    
029      /** . */
030      private final SSHContext context;
031    
032      /** . */
033      private final ShellProcess process;
034    
035      /** . */
036      private final PrintStream out;
037    
038      /** . */
039      private final PrintStream err;
040    
041      SSHInlineShellProcessContext(SSHContext context, ShellProcess process, PrintStream out, PrintStream err) {
042        this.out = out;
043        this.context = context;
044        this.process = process;
045        this.latch = new CountDownLatch(1);
046        this.response = null;
047        this.err = err;
048        this.msgDone = false;
049      }
050    
051      public SSHInlineShellProcessContext execute() {
052        process.execute(this);
053        return this;
054      }
055    
056      public boolean takeAlternateBuffer() {
057        return false;
058      }
059    
060      public boolean releaseAlternateBuffer() {
061        return false;
062      }
063    
064      public int getWidth() {
065        int width = context.getWidth();
066        if (width == -1) {
067          if (!msgDone) {
068            msgDone = true;
069            out.print(MSG);
070            out.flush();
071          }
072        }
073        return width;
074      }
075    
076      public int getHeight() {
077        int height = context.getHeight();
078        if (height == -1) {
079          if (!msgDone) {
080            msgDone = true;
081            out.print(MSG);
082            out.flush();
083            }
084        }
085        return height;
086      }
087    
088      public String getProperty(String name) {
089        return context.getProperty(name);
090      }
091    
092      public String readLine(String msg, boolean echo) {
093        return null;
094      }
095    
096      public Class<Chunk> getConsumedType() {
097        return Chunk.class;
098      }
099    
100      public void provide(Chunk element) throws IOException {
101        if (element instanceof Text) {
102          CharSequence seq = ((Text)element).getText();
103          int length = seq.length();
104          if (length > 0) {
105            for (int i = 0;i < length;i++) {
106              // This is not perfect but it will be OK for now
107              // ideally we should reuse the IO / ConsoleTerm stuff
108              // but for now we don't have the time to do it properly
109              char c = seq.charAt(i);
110              if (c == '\r') {
111                //
112              } else if (c == '\n') {
113                out.print("\r\n");
114              } else {
115                out.print(c);
116              }
117            }
118          }
119        }
120      }
121    
122      public void flush() throws IOException {
123        out.flush();
124      }
125    
126      public void end(ShellResponse response) {
127        this.response = response;
128        this.latch.countDown();
129      }
130    
131      ShellResponse getResponse() {
132        try {
133          latch.await();
134          return response;
135        }
136        catch (InterruptedException e) {
137          throw new RuntimeException(e);
138        }
139      }
140    
141    }