package com.jediterm.terminal;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.nio.charset.Charset;
/**
* @author traff
*/
public abstract class ProcessTtyConnector implements TtyConnector {
protected final InputStream myInputStream;
protected final OutputStream myOutputStream;
protected InputStreamReader myReader;
protected Charset myCharset;
private Dimension myPendingTermSize;
private Dimension myPendingPixelSize;
private Process myProcess;
public ProcessTtyConnector(@NotNull Process process, Charset charset) {
myOutputStream = process.getOutputStream();
myCharset = charset;
myInputStream = process.getInputStream();
myReader = new InputStreamReader(myInputStream, charset);
myProcess = process;
}
@Override
public void resize(Dimension termSize, Dimension pixelSize) {
setPendingTermSize(termSize);
setPendingPixelSize(pixelSize);
if (isConnected()) {
resizeImmediately();
setPendingTermSize(null);
setPendingPixelSize(null);
}
}
protected abstract void resizeImmediately();
@Override
public abstract String getName();
public int read(char[] buf, int offset, int length) throws IOException {
return myReader.read(buf, offset, length);
//return myInputStream.read(buf, offset, length);
}
public void write(byte[] bytes) throws IOException {
myOutputStream.write(bytes);
myOutputStream.flush();
}
@Override
public abstract boolean isConnected();
@Override
public void write(String string) throws IOException {
myOutputStream.write(string.getBytes(myCharset));
myOutputStream.flush();
}
protected void setPendingTermSize(Dimension pendingTermSize) {
this.myPendingTermSize = pendingTermSize;
}
protected void setPendingPixelSize(Dimension pendingPixelSize) {
this.myPendingPixelSize = pendingPixelSize;
}
protected Dimension getPendingTermSize() {
return myPendingTermSize;
}
protected Dimension getPendingPixelSize() {
return myPendingPixelSize;
}
@Override
public boolean init(Questioner q) {
return isConnected();
}
@Override
public void close() {
myProcess.destroy();
}
@Override
public int waitFor() throws InterruptedException {
return myProcess.waitFor();
}
}