Formatted code to GoogleCodeStyle. Fixed misc warnings
This commit is contained in:
parent
d647d23829
commit
90ee355958
@ -14,9 +14,10 @@ package dorkbox.util.input;
|
||||
import java.nio.charset.Charset;
|
||||
|
||||
public class Encoding {
|
||||
|
||||
/**
|
||||
* Get the default encoding. Will first look at the LC_CTYPE environment variable, then the input.encoding
|
||||
* system property, then the default charset according to the JVM.
|
||||
* Get the default encoding. Will first look at the LC_CTYPE environment variable, then the input.encoding system
|
||||
* property, then the default charset according to the JVM.
|
||||
*
|
||||
* @return The default encoding to use when none is specified.
|
||||
*/
|
||||
|
@ -15,6 +15,10 @@
|
||||
*/
|
||||
package dorkbox.util.input;
|
||||
|
||||
import org.fusesource.jansi.Ansi;
|
||||
import org.fusesource.jansi.AnsiConsole;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
@ -25,10 +29,6 @@ import java.security.ProtectionDomain;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import org.fusesource.jansi.Ansi;
|
||||
import org.fusesource.jansi.AnsiConsole;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import dorkbox.util.OS;
|
||||
import dorkbox.util.bytes.ByteBuffer2;
|
||||
import dorkbox.util.bytes.ByteBuffer2Poolable;
|
||||
@ -40,18 +40,13 @@ import dorkbox.util.objectPool.ObjectPoolFactory;
|
||||
import dorkbox.util.objectPool.ObjectPoolHolder;
|
||||
|
||||
public class InputConsole {
|
||||
|
||||
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(InputConsole.class);
|
||||
private static final InputConsole consoleProxyReader = new InputConsole();
|
||||
private static final char[] emptyLine = new char[0];
|
||||
|
||||
/**
|
||||
* empty method to allow code to initialize the input console.
|
||||
*/
|
||||
public static void init() {
|
||||
}
|
||||
|
||||
// this is run by our init...
|
||||
{
|
||||
static {
|
||||
AnsiConsole.systemInstall();
|
||||
|
||||
Thread consoleThread = new Thread(new Runnable() {
|
||||
@ -81,8 +76,21 @@ public class InputConsole {
|
||||
Runtime.getRuntime().addShutdownHook(shutdownThread);
|
||||
}
|
||||
|
||||
/** return null if no data */
|
||||
public static final String readLine() {
|
||||
/**
|
||||
* Permit our InputConsole to be initialized
|
||||
*/
|
||||
public static void init() {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Created Terminal: {} ({}w x {}h)", consoleProxyReader.terminal.getClass().getSimpleName(),
|
||||
consoleProxyReader.terminal.getWidth(),
|
||||
consoleProxyReader.terminal.getHeight());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* return null if no data
|
||||
*/
|
||||
public static String readLine() {
|
||||
char[] line = consoleProxyReader.readLine0();
|
||||
return new String(line);
|
||||
}
|
||||
@ -100,13 +108,17 @@ public class InputConsole {
|
||||
};
|
||||
|
||||
|
||||
/** return -1 if no data */
|
||||
public static final int read() {
|
||||
/**
|
||||
* return -1 if no data
|
||||
*/
|
||||
public static int read() {
|
||||
return consoleProxyReader.read0();
|
||||
}
|
||||
|
||||
/** return null if no data */
|
||||
public static final char[] readLinePassword() {
|
||||
/**
|
||||
* return null if no data
|
||||
*/
|
||||
public static char[] readLinePassword() {
|
||||
return consoleProxyReader.readLinePassword0();
|
||||
}
|
||||
|
||||
@ -133,7 +145,9 @@ public class InputConsole {
|
||||
private ThreadLocal<Integer> threadBufferCounter = new ThreadLocal<Integer>();
|
||||
|
||||
private ThreadLocal<ObjectPoolHolder<ByteBuffer2>> readLineBuff = new ThreadLocal<ObjectPoolHolder<ByteBuffer2>>();
|
||||
private List<ObjectPoolHolder<ByteBuffer2>> readLineBuffers = new CopyOnWriteArrayList<ObjectPoolHolder<ByteBuffer2>>();
|
||||
private List<ObjectPoolHolder<ByteBuffer2>>
|
||||
readLineBuffers =
|
||||
new CopyOnWriteArrayList<ObjectPoolHolder<ByteBuffer2>>();
|
||||
|
||||
private final Terminal terminal;
|
||||
private final Boolean enableBackspace;
|
||||
@ -147,11 +161,11 @@ public class InputConsole {
|
||||
try {
|
||||
readers2 = Integer.parseInt(readers);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
this.pool = ObjectPoolFactory.create(new ByteBuffer2Poolable(), readers2);
|
||||
|
||||
|
||||
String type = System.getProperty(TerminalType.TYPE, TerminalType.AUTO).toLowerCase();
|
||||
if ("dumb".equals(System.getenv("TERM"))) {
|
||||
type = TerminalType.NONE;
|
||||
@ -164,20 +178,18 @@ public class InputConsole {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Terminal t;
|
||||
try {
|
||||
if (type.equals(TerminalType.UNIX)) {
|
||||
t = new UnixTerminal();
|
||||
}
|
||||
else if (type.equals(TerminalType.WIN) || type.equals(TerminalType.WINDOWS)) {
|
||||
} else if (type.equals(TerminalType.WIN) || type.equals(TerminalType.WINDOWS)) {
|
||||
t = new WindowsTerminal();
|
||||
}
|
||||
else if (type.equals(TerminalType.NONE) || type.equals(TerminalType.OFF) || type.equals(TerminalType.FALSE)) {
|
||||
} else if (type.equals(TerminalType.NONE) || type.equals(TerminalType.OFF) || type.equals(TerminalType.FALSE)) {
|
||||
t = new UnsupportedTerminal();
|
||||
} else {
|
||||
if (isIDEAutoDetect()) {
|
||||
logger.debug("Terminal is in UNSUPPORTED (best guess). Unable to support single key input. Only line input available.");
|
||||
logger.debug(
|
||||
"Terminal is in UNSUPPORTED (best guess). Unable to support single key input. Only line input available.");
|
||||
t = new UnsupportedTerminal();
|
||||
} else {
|
||||
if (OS.isWindows()) {
|
||||
@ -187,16 +199,14 @@ public class InputConsole {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
} catch (Exception e) {
|
||||
logger.error("Failed to construct terminal, falling back to unsupported");
|
||||
t = new UnsupportedTerminal();
|
||||
}
|
||||
|
||||
try {
|
||||
t.init();
|
||||
}
|
||||
catch (Throwable e) {
|
||||
} catch (Throwable e) {
|
||||
logger.error("Terminal initialization failed, falling back to unsupported");
|
||||
t = new UnsupportedTerminal();
|
||||
|
||||
@ -211,7 +221,6 @@ public class InputConsole {
|
||||
|
||||
this.terminal = t;
|
||||
this.enableBackspace = Boolean.parseBoolean(System.getProperty(TerminalType.ENABLE_BACKSPACE, "true"));
|
||||
logger.debug("Created Terminal: {} ({}x{})", t.getClass().getSimpleName(), t.getWidth(), t.getHeight());
|
||||
}
|
||||
|
||||
// called when the JVM is shutting down.
|
||||
@ -243,11 +252,13 @@ public class InputConsole {
|
||||
return this.terminal.isEchoEnabled();
|
||||
}
|
||||
|
||||
/** return -1 if no data or bunged-up */
|
||||
private final int read0() {
|
||||
/**
|
||||
* return -1 if no data or bunged-up
|
||||
*/
|
||||
private int read0() {
|
||||
Integer bufferCounter = this.threadBufferCounter.get();
|
||||
ObjectPoolHolder<ByteBuffer2> objectPoolHolder = this.readBuff.get();
|
||||
ByteBuffer2 buffer = null;
|
||||
ByteBuffer2 buffer;
|
||||
|
||||
if (objectPoolHolder == null) {
|
||||
bufferCounter = 0;
|
||||
@ -283,8 +294,10 @@ public class InputConsole {
|
||||
return c;
|
||||
}
|
||||
|
||||
/** return empty char[] if no data */
|
||||
private final char[] readLinePassword0() {
|
||||
/**
|
||||
* return empty char[] if no data
|
||||
*/
|
||||
private char[] readLinePassword0() {
|
||||
// don't bother in an IDE. it won't work.
|
||||
boolean echoEnabled = this.terminal.isEchoEnabled();
|
||||
this.terminal.setEchoEnabled(false);
|
||||
@ -294,8 +307,10 @@ public class InputConsole {
|
||||
return readLine0;
|
||||
}
|
||||
|
||||
/** return empty char[] if no data */
|
||||
private final char[] readLine0() {
|
||||
/**
|
||||
* return empty char[] if no data
|
||||
*/
|
||||
private char[] readLine0() {
|
||||
synchronized (this.inputLock) {
|
||||
// empty here, because we don't want to register a readLine WHILE we are still processing
|
||||
// the current line info.
|
||||
@ -326,7 +341,7 @@ public class InputConsole {
|
||||
}
|
||||
|
||||
buffer.rewind();
|
||||
char[] readChars = buffer.readChars(len/2); // java always stores chars in 2 bytes
|
||||
char[] readChars = buffer.readChars(len / 2); // java always stores chars in 2 bytes
|
||||
|
||||
// dump the chars in the buffer (safer for passwords, etc)
|
||||
buffer.clearSecure();
|
||||
@ -351,7 +366,7 @@ public class InputConsole {
|
||||
}
|
||||
}
|
||||
|
||||
private final void run() {
|
||||
private void run() {
|
||||
Logger logger2 = logger;
|
||||
|
||||
final boolean ansiEnabled = Ansi.isEnabled();
|
||||
@ -383,7 +398,6 @@ public class InputConsole {
|
||||
this.inputLockSingle.notifyAll();
|
||||
}
|
||||
|
||||
|
||||
// now to handle readLine stuff
|
||||
|
||||
// if we type a backspace key, swallow it + previous in READLINE. READCHAR will have it passed.
|
||||
@ -399,7 +413,7 @@ public class InputConsole {
|
||||
int amtToOverwrite = 2 * 2; // backspace is always 2 chars (^?) * 2 because it's bytes
|
||||
|
||||
if (length > 1) {
|
||||
char charAt = buffer.readChar(length-2);
|
||||
char charAt = buffer.readChar(length - 2);
|
||||
amtToOverwrite += getPrintableCharacters(charAt);
|
||||
|
||||
// delete last item in our buffer
|
||||
@ -408,7 +422,7 @@ public class InputConsole {
|
||||
|
||||
// now figure out where the cursor is really at.
|
||||
// this is more memory friendly than buf.toString.length
|
||||
for (int i=0;i<length;i+=2) {
|
||||
for (int i = 0; i < length; i += 2) {
|
||||
charAt = buffer.readChar(i);
|
||||
position += getPrintableCharacters(charAt);
|
||||
}
|
||||
@ -418,7 +432,7 @@ public class InputConsole {
|
||||
|
||||
char[] overwrite = new char[amtToOverwrite];
|
||||
char c = ' ';
|
||||
for (int i=0;i<amtToOverwrite;i++) {
|
||||
for (int i = 0; i < amtToOverwrite; i++) {
|
||||
overwrite[i] = c;
|
||||
}
|
||||
|
||||
@ -429,14 +443,12 @@ public class InputConsole {
|
||||
out.flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (asChar == '\n') {
|
||||
} else if (asChar == '\n') {
|
||||
// ignoring \r, because \n is ALWAYS the last character in a new line sequence. (even for windows)
|
||||
synchronized (this.inputLockLine) {
|
||||
this.inputLockLine.notifyAll();
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
// only append if we are not a new line.
|
||||
// our windows console PREVENTS us from returning '\r' (it truncates '\r\n', and returns just '\n')
|
||||
for (ObjectPoolHolder<ByteBuffer2> objectPoolHolder : this.readLineBuffers) {
|
||||
@ -462,7 +474,7 @@ public class InputConsole {
|
||||
File locFile = new File(loc.getFile());
|
||||
return locFile.isDirectory();
|
||||
|
||||
} catch (Exception e) {
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
|
||||
// fall-back to unsupported
|
||||
@ -471,25 +483,22 @@ public class InputConsole {
|
||||
|
||||
|
||||
/**
|
||||
* Return the number of characters that will be printed when the specified
|
||||
* character is echoed to the screen
|
||||
* Return the number of characters that will be printed when the specified character is echoed to the screen
|
||||
*
|
||||
* Adapted from cat by Torbjorn Granlund, as repeated in stty by David MacKenzie.
|
||||
*/
|
||||
public static int getPrintableCharacters(final int ch) {
|
||||
private static int getPrintableCharacters(final int ch) {
|
||||
// StringBuilder sbuff = new StringBuilder();
|
||||
|
||||
if (ch >= 32) {
|
||||
if (ch < 127) {
|
||||
// sbuff.append((char) ch);
|
||||
return 1;
|
||||
}
|
||||
else if (ch == 127) {
|
||||
} else if (ch == 127) {
|
||||
// sbuff.append('^');
|
||||
// sbuff.append('?');
|
||||
return 2;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
// sbuff.append('M');
|
||||
// sbuff.append('-');
|
||||
int count = 2;
|
||||
@ -498,22 +507,19 @@ public class InputConsole {
|
||||
if (ch < 128 + 127) {
|
||||
// sbuff.append((char) (ch - 128));
|
||||
count++;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
// sbuff.append('^');
|
||||
// sbuff.append('?');
|
||||
count += 2;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
// sbuff.append('^');
|
||||
// sbuff.append((char) (ch - 128 + 64));
|
||||
count += 2;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
// sbuff.append('^');
|
||||
// sbuff.append((char) (ch + 64));
|
||||
return 2;
|
||||
|
@ -18,15 +18,16 @@ package dorkbox.util.input;
|
||||
import java.io.IOException;
|
||||
|
||||
public abstract class Terminal {
|
||||
|
||||
protected final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(getClass());
|
||||
|
||||
|
||||
public static final int DEFAULT_WIDTH = 80;
|
||||
public static final int DEFAULT_HEIGHT = 24;
|
||||
protected static final int DEFAULT_WIDTH = 80;
|
||||
protected static final int DEFAULT_HEIGHT = 24;
|
||||
|
||||
private volatile boolean echoEnabled;
|
||||
|
||||
public Terminal() {
|
||||
protected Terminal() {
|
||||
}
|
||||
|
||||
public abstract void init() throws IOException;
|
||||
@ -42,6 +43,7 @@ public abstract class Terminal {
|
||||
}
|
||||
|
||||
public abstract int getWidth();
|
||||
|
||||
public abstract int getHeight();
|
||||
|
||||
/**
|
||||
|
@ -16,6 +16,7 @@
|
||||
package dorkbox.util.input;
|
||||
|
||||
public class TerminalType {
|
||||
|
||||
public static final String TYPE = "input.terminal";
|
||||
public static final String READERS = "input.terminal.readers";
|
||||
public static final String ENABLE_BACKSPACE = "input.enableBackspace";
|
||||
|
@ -32,25 +32,22 @@ import java.nio.charset.UnmappableCharacterException;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* NOTE for JLine: the default InputStreamReader that comes from the JRE
|
||||
* usually read more bytes than needed from the input stream, which
|
||||
* is not usable in a character per character model used in the console.
|
||||
* We thus use the harmony code which only reads the minimal number of bytes,
|
||||
* with a modification to ensure we can read larger characters (UTF-16 has
|
||||
* up to 4 bytes, and UTF-32, rare as it is, may have up to 8).
|
||||
* NOTE for JLine: the default InputStreamReader that comes from the JRE usually read more bytes than needed from the
|
||||
* input stream, which is not usable in a character per character model used in the console. We thus use the harmony
|
||||
* code which only reads the minimal number of bytes, with a modification to ensure we can read larger characters
|
||||
* (UTF-16 has up to 4 bytes, and UTF-32, rare as it is, may have up to 8).
|
||||
*
|
||||
*
|
||||
* A class for turning a byte stream into a character stream. Data read from the
|
||||
* source input stream is converted into characters by either a default or a
|
||||
* provided character converter. The default encoding is taken from the
|
||||
* "file.encoding" system property. {@code InputStreamReader} contains a buffer
|
||||
* of bytes read from the source stream and converts these into characters as
|
||||
* needed. The buffer size is 8K.
|
||||
* A class for turning a byte stream into a character stream. Data read from the source input stream is converted into
|
||||
* characters by either a default or a provided character converter. The default encoding is taken from the
|
||||
* "file.encoding" system property. {@code InputStreamReader} contains a buffer of bytes read from the source stream and
|
||||
* converts these into characters as needed. The buffer size is 8K.
|
||||
*
|
||||
* @see OutputStreamWriter
|
||||
*/
|
||||
public class InputStreamReader extends Reader {
|
||||
@SuppressWarnings("ALL")
|
||||
class InputStreamReader extends Reader {
|
||||
|
||||
private InputStream in;
|
||||
|
||||
private static final int BUFFER_SIZE = 8192;
|
||||
@ -64,13 +61,11 @@ public class InputStreamReader extends Reader {
|
||||
ByteBuffer bytes = ByteBuffer.allocate(BUFFER_SIZE);
|
||||
|
||||
/**
|
||||
* Constructs a new {@code InputStreamReader} on the {@link InputStream}
|
||||
* {@code in}. This constructor sets the character converter to the encoding
|
||||
* specified in the "file.encoding" property and falls back to ISO 8859_1
|
||||
* Constructs a new {@code InputStreamReader} on the {@link InputStream} {@code in}. This constructor sets the
|
||||
* character converter to the encoding specified in the "file.encoding" property and falls back to ISO 8859_1
|
||||
* (ISO-Latin-1) if the property doesn't exist.
|
||||
*
|
||||
* @param in
|
||||
* the input stream from which to read characters.
|
||||
* @param in the input stream from which to read characters.
|
||||
*/
|
||||
public InputStreamReader(InputStream in) {
|
||||
super(in);
|
||||
@ -84,19 +79,14 @@ public class InputStreamReader extends Reader {
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new InputStreamReader on the InputStream {@code in}. The
|
||||
* character converter that is used to decode bytes into characters is
|
||||
* identified by name by {@code enc}. If the encoding cannot be found, an
|
||||
* Constructs a new InputStreamReader on the InputStream {@code in}. The character converter that is used to decode
|
||||
* bytes into characters is identified by name by {@code enc}. If the encoding cannot be found, an
|
||||
* UnsupportedEncodingException error is thrown.
|
||||
*
|
||||
* @param in
|
||||
* the InputStream from which to read characters.
|
||||
* @param enc
|
||||
* identifies the character converter to use.
|
||||
* @throws NullPointerException
|
||||
* if {@code enc} is {@code null}.
|
||||
* @throws UnsupportedEncodingException
|
||||
* if the encoding specified by {@code enc} cannot be found.
|
||||
* @param in the InputStream from which to read characters.
|
||||
* @param enc identifies the character converter to use.
|
||||
* @throws NullPointerException if {@code enc} is {@code null}.
|
||||
* @throws UnsupportedEncodingException if the encoding specified by {@code enc} cannot be found.
|
||||
*/
|
||||
public InputStreamReader(InputStream in, final String enc)
|
||||
// throws UnsupportedEncodingException
|
||||
@ -121,13 +111,10 @@ public class InputStreamReader extends Reader {
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new InputStreamReader on the InputStream {@code in} and
|
||||
* CharsetDecoder {@code dec}.
|
||||
* Constructs a new InputStreamReader on the InputStream {@code in} and CharsetDecoder {@code dec}.
|
||||
*
|
||||
* @param in
|
||||
* the source InputStream from which to read characters.
|
||||
* @param dec
|
||||
* the CharsetDecoder used by the character conversion.
|
||||
* @param in the source InputStream from which to read characters.
|
||||
* @param dec the CharsetDecoder used by the character conversion.
|
||||
*/
|
||||
public InputStreamReader(InputStream in, CharsetDecoder dec) {
|
||||
super(in);
|
||||
@ -138,13 +125,10 @@ public class InputStreamReader extends Reader {
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new InputStreamReader on the InputStream {@code in} and
|
||||
* Charset {@code charset}.
|
||||
* Constructs a new InputStreamReader on the InputStream {@code in} and Charset {@code charset}.
|
||||
*
|
||||
* @param in
|
||||
* the source InputStream from which to read characters.
|
||||
* @param charset
|
||||
* the Charset that defines the character converter
|
||||
* @param in the source InputStream from which to read characters.
|
||||
* @param charset the Charset that defines the character converter
|
||||
*/
|
||||
public InputStreamReader(InputStream in, Charset charset) {
|
||||
super(in);
|
||||
@ -156,11 +140,9 @@ public class InputStreamReader extends Reader {
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes this reader. This implementation closes the source InputStream and
|
||||
* releases all local storage.
|
||||
* Closes this reader. This implementation closes the source InputStream and releases all local storage.
|
||||
*
|
||||
* @throws IOException
|
||||
* if an error occurs attempting to close this reader.
|
||||
* @throws IOException if an error occurs attempting to close this reader.
|
||||
*/
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
@ -174,11 +156,10 @@ public class InputStreamReader extends Reader {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the encoding used to convert bytes into characters.
|
||||
* The value {@code null} is returned if this reader has been closed.
|
||||
* Returns the name of the encoding used to convert bytes into characters. The value {@code null} is returned if this
|
||||
* reader has been closed.
|
||||
*
|
||||
* @return the name of the character converter or {@code null} if this
|
||||
* reader is closed.
|
||||
* @return the name of the character converter or {@code null} if this reader is closed.
|
||||
*/
|
||||
public String getEncoding() {
|
||||
if (!isOpen()) {
|
||||
@ -188,16 +169,12 @@ public class InputStreamReader extends Reader {
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a single character from this reader and returns it as an integer
|
||||
* with the two higher-order bytes set to 0. Returns -1 if the end of the
|
||||
* reader has been reached. The byte value is either obtained from
|
||||
* converting bytes in this reader's buffer or by first filling the buffer
|
||||
* from the source InputStream and then reading from the buffer.
|
||||
* Reads a single character from this reader and returns it as an integer with the two higher-order bytes set to 0.
|
||||
* Returns -1 if the end of the reader has been reached. The byte value is either obtained from converting bytes in
|
||||
* this reader's buffer or by first filling the buffer from the source InputStream and then reading from the buffer.
|
||||
*
|
||||
* @return the character read or -1 if the end of the reader has been
|
||||
* reached.
|
||||
* @throws IOException
|
||||
* if this reader is closed or some other I/O error occurs.
|
||||
* @return the character read or -1 if the end of the reader has been reached.
|
||||
* @throws IOException if this reader is closed or some other I/O error occurs.
|
||||
*/
|
||||
@Override
|
||||
public int read() throws IOException {
|
||||
@ -212,28 +189,18 @@ public class InputStreamReader extends Reader {
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads at most {@code length} characters from this reader and stores them
|
||||
* at position {@code offset} in the character array {@code buf}. Returns
|
||||
* the number of characters actually read or -1 if the end of the reader has
|
||||
* been reached. The bytes are either obtained from converting bytes in this
|
||||
* reader's buffer or by first filling the buffer from the source
|
||||
* InputStream and then reading from the buffer.
|
||||
* Reads at most {@code length} characters from this reader and stores them at position {@code offset} in the
|
||||
* character array {@code buf}. Returns the number of characters actually read or -1 if the end of the reader has been
|
||||
* reached. The bytes are either obtained from converting bytes in this reader's buffer or by first filling the buffer
|
||||
* from the source InputStream and then reading from the buffer.
|
||||
*
|
||||
* @param buf
|
||||
* the array to store the characters read.
|
||||
* @param offset
|
||||
* the initial position in {@code buf} to store the characters
|
||||
* read from this reader.
|
||||
* @param length
|
||||
* the maximum number of characters to read.
|
||||
* @return the number of characters read or -1 if the end of the reader has
|
||||
* been reached.
|
||||
* @throws IndexOutOfBoundsException
|
||||
* if {@code offset < 0} or {@code length < 0}, or if
|
||||
* {@code offset + length} is greater than the length of
|
||||
* {@code buf}.
|
||||
* @throws IOException
|
||||
* if this reader is closed or some other I/O error occurs.
|
||||
* @param buf the array to store the characters read.
|
||||
* @param offset the initial position in {@code buf} to store the characters read from this reader.
|
||||
* @param length the maximum number of characters to read.
|
||||
* @return the number of characters read or -1 if the end of the reader has been reached.
|
||||
* @throws IndexOutOfBoundsException if {@code offset < 0} or {@code length < 0}, or if {@code offset + length} is
|
||||
* greater than the length of {@code buf}.
|
||||
* @throws IOException if this reader is closed or some other I/O error occurs.
|
||||
*/
|
||||
@Override
|
||||
public int read(char[] buf, int offset, int length) throws IOException {
|
||||
@ -322,17 +289,14 @@ public class InputStreamReader extends Reader {
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates whether this reader is ready to be read without blocking. If
|
||||
* the result is {@code true}, the next {@code read()} will not block. If
|
||||
* the result is {@code false} then this reader may or may not block when
|
||||
* {@code read()} is called. This implementation returns {@code true} if
|
||||
* there are bytes available in the buffer or the source stream has bytes
|
||||
* available.
|
||||
* Indicates whether this reader is ready to be read without blocking. If the result is {@code true}, the next {@code
|
||||
* read()} will not block. If the result is {@code false} then this reader may or may not block when {@code read()} is
|
||||
* called. This implementation returns {@code true} if there are bytes available in the buffer or the source stream
|
||||
* has bytes available.
|
||||
*
|
||||
* @return {@code true} if the receiver will not block when {@code read()}
|
||||
* is called, {@code false} if unknown or blocking will occur.
|
||||
* @throws IOException
|
||||
* if this reader is closed or some other I/O error occurs.
|
||||
* @return {@code true} if the receiver will not block when {@code read()} is called, {@code false} if unknown or
|
||||
* blocking will occur.
|
||||
* @throws IOException if this reader is closed or some other I/O error occurs.
|
||||
*/
|
||||
@Override
|
||||
public boolean ready() throws IOException {
|
||||
|
@ -15,11 +15,13 @@
|
||||
*/
|
||||
package dorkbox.util.input.posix;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import com.sun.jna.Library;
|
||||
|
||||
public interface PosixTerminalControl extends Library {
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
@SuppressWarnings("ALL")
|
||||
interface PosixTerminalControl extends Library {
|
||||
|
||||
public static final int TCSANOW = 0;
|
||||
public static final int TBUFLEN = 124;
|
||||
|
||||
|
@ -15,29 +15,47 @@
|
||||
*/
|
||||
package dorkbox.util.input.posix;
|
||||
|
||||
import com.sun.jna.Structure;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.sun.jna.Structure;
|
||||
@SuppressWarnings("ALL")
|
||||
class TermiosStruct extends Structure {
|
||||
|
||||
public class TermiosStruct extends Structure {
|
||||
/** input mode flags */
|
||||
/**
|
||||
* input mode flags
|
||||
*/
|
||||
public int c_iflag;
|
||||
/** output mode flags */
|
||||
/**
|
||||
* output mode flags
|
||||
*/
|
||||
public int c_oflag;
|
||||
/** control mode flags */
|
||||
/**
|
||||
* control mode flags
|
||||
*/
|
||||
public int c_cflag;
|
||||
/** local mode flags */
|
||||
/**
|
||||
* local mode flags
|
||||
*/
|
||||
public int c_lflag;
|
||||
/** line discipline */
|
||||
/**
|
||||
* line discipline
|
||||
*/
|
||||
public byte c_line;
|
||||
|
||||
/** control characters */
|
||||
/**
|
||||
* control characters
|
||||
*/
|
||||
public byte[] c_cc = new byte[32];
|
||||
|
||||
/** input speed */
|
||||
/**
|
||||
* input speed
|
||||
*/
|
||||
public int c_ispeed;
|
||||
/** output speed */
|
||||
/**
|
||||
* output speed
|
||||
*/
|
||||
public int c_ospeed;
|
||||
|
||||
public TermiosStruct() {
|
||||
|
@ -15,18 +15,18 @@
|
||||
*/
|
||||
package dorkbox.util.input.posix;
|
||||
|
||||
import com.sun.jna.Native;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import com.sun.jna.Native;
|
||||
|
||||
import dorkbox.util.input.Encoding;
|
||||
import dorkbox.util.input.Terminal;
|
||||
|
||||
/**
|
||||
* Terminal that is used for unix platforms. Terminal initialization
|
||||
* is handled via JNA and ioctl/tcgetattr/tcsetattr/cfmakeraw.
|
||||
* Terminal that is used for unix platforms. Terminal initialization is handled via JNA and
|
||||
* ioctl/tcgetattr/tcsetattr/cfmakeraw.
|
||||
*
|
||||
* This implementation should work for an reasonable POSIX system.
|
||||
*/
|
||||
@ -35,9 +35,9 @@ public class UnixTerminal extends Terminal {
|
||||
private volatile TermiosStruct termInfoDefault = new TermiosStruct();
|
||||
private volatile TermiosStruct termInfo = new TermiosStruct();
|
||||
|
||||
private Reader reader;
|
||||
private final Reader reader;
|
||||
|
||||
private PosixTerminalControl term;
|
||||
private final PosixTerminalControl term;
|
||||
private ByteBuffer windowSizeBuffer = ByteBuffer.allocate(8);
|
||||
|
||||
|
||||
@ -48,7 +48,7 @@ public class UnixTerminal extends Terminal {
|
||||
this.term = (PosixTerminalControl) Native.loadLibrary("c", PosixTerminalControl.class);
|
||||
|
||||
// save off the defaults
|
||||
if (this.term.tcgetattr(0, this.termInfoDefault) !=0) {
|
||||
if (this.term.tcgetattr(0, this.termInfoDefault) != 0) {
|
||||
throw new IOException("Failed to get terminal info");
|
||||
}
|
||||
}
|
||||
@ -77,17 +77,17 @@ public class UnixTerminal extends Terminal {
|
||||
// t->c_cc[VMIN] = 1;
|
||||
// t->c_cc[VTIME] = 0;
|
||||
|
||||
if (this.term.tcgetattr(0, this.termInfo) !=0) {
|
||||
if (this.term.tcgetattr(0, this.termInfo) != 0) {
|
||||
throw new IOException("Failed to get terminal info");
|
||||
}
|
||||
|
||||
this.termInfo.c_iflag &= ~PosixTerminalControl.IXON; // DISABLE - flow control mediated by ^S and ^Q
|
||||
// struct.c_iflag |= PosixTerminalControl.IUTF8; // DISABLE - flow control mediated by ^S and ^Q
|
||||
|
||||
this.termInfo.c_lflag &= ~PosixTerminalControl.ICANON; // DISABLE - canonical mode (pass chars straight through to terminal)
|
||||
this.termInfo.c_lflag &=
|
||||
~PosixTerminalControl.ICANON; // DISABLE - canonical mode (pass chars straight through to terminal)
|
||||
// struct.c_lflag &= ~PosixTerminalControl.ISIG; // DISABLE - When any of the characters INTR, QUIT, SUSP, or DSUSP are received, generate the corresponding signal.
|
||||
|
||||
|
||||
// If MIN > 0 and TIME = 0, MIN sets the number of characters to receive before the read is satisfied. As TIME is zero, the timer is not used.
|
||||
this.termInfo.c_cc[PosixTerminalControl.VMIN] = 1; // Minimum number of characters for noncanonical read (MIN).
|
||||
this.termInfo.c_cc[PosixTerminalControl.VTIME] = 0; // Timeout in deciseconds for noncanonical read (TIME).
|
||||
@ -96,16 +96,14 @@ public class UnixTerminal extends Terminal {
|
||||
this.termInfo.c_cc[PosixTerminalControl.VEOF] = 0; // eof disabled
|
||||
this.termInfo.c_cc[PosixTerminalControl.VEOL] = 0; // eol disabled
|
||||
|
||||
|
||||
if (this.term.tcsetattr(0, PosixTerminalControl.TCSANOW, this.termInfo) != 0) {
|
||||
throw new IOException("Can not set terminal flags");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore the original terminal configuration, which can be used when
|
||||
* shutting down the console reader. The ConsoleReader cannot be
|
||||
* used after calling this method.
|
||||
* Restore the original terminal configuration, which can be used when shutting down the console reader. The
|
||||
* ConsoleReader cannot be used after calling this method.
|
||||
*/
|
||||
@Override
|
||||
public final void restore() throws IOException {
|
||||
@ -123,8 +121,7 @@ public class UnixTerminal extends Terminal {
|
||||
return DEFAULT_WIDTH;
|
||||
}
|
||||
|
||||
short columns = (short)(0x000000FF &this.windowSizeBuffer.get(2) + (0x000000FF & this.windowSizeBuffer.get(3)) * 256);
|
||||
return columns;
|
||||
return (short) (0x000000FF & this.windowSizeBuffer.get(2) + (0x000000FF & this.windowSizeBuffer.get(3)) * 256);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -136,21 +133,20 @@ public class UnixTerminal extends Terminal {
|
||||
return DEFAULT_HEIGHT;
|
||||
}
|
||||
|
||||
short rows = (short)(0x000000FF &this.windowSizeBuffer.get(0) + (0x000000FF & this.windowSizeBuffer.get(1)) * 256);
|
||||
return rows;
|
||||
return
|
||||
(short) (0x000000FF & this.windowSizeBuffer.get(0) + (0x000000FF & this.windowSizeBuffer.get(1)) * 256);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final synchronized void setEchoEnabled(final boolean enabled) {
|
||||
// have to reget them, since flags change everything
|
||||
if (this.term.tcgetattr(0, this.termInfo) !=0) {
|
||||
if (this.term.tcgetattr(0, this.termInfo) != 0) {
|
||||
this.logger.error("Failed to get terminal info");
|
||||
}
|
||||
|
||||
if (enabled) {
|
||||
this.termInfo.c_lflag |= PosixTerminalControl.ECHO; // ENABLE Echo input characters.
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this.termInfo.c_lflag &= ~PosixTerminalControl.ECHO; // DISABLE Echo input characters.
|
||||
}
|
||||
|
||||
|
@ -23,10 +23,10 @@ import dorkbox.util.input.Terminal;
|
||||
|
||||
public class UnsupportedTerminal extends Terminal {
|
||||
|
||||
private ByteBuffer2 buffer = new ByteBuffer2(8, -1);
|
||||
private final ByteBuffer2 buffer = new ByteBuffer2(8, -1);
|
||||
|
||||
private int readerCount = -1;
|
||||
private InputStream in;
|
||||
private final InputStream in;
|
||||
|
||||
public UnsupportedTerminal() {
|
||||
this.in = System.in;
|
||||
@ -64,7 +64,7 @@ public class UnsupportedTerminal extends Terminal {
|
||||
this.buffer.clearSecure();
|
||||
|
||||
while ((read = sysIn.read()) != -1) {
|
||||
asChar = (char)read;
|
||||
asChar = (char) read;
|
||||
if (asChar == '\n') {
|
||||
this.readerCount = this.buffer.position();
|
||||
this.buffer.rewind();
|
||||
@ -73,18 +73,16 @@ public class UnsupportedTerminal extends Terminal {
|
||||
this.buffer.writeChar(asChar);
|
||||
}
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// EACH thread will have it's own count!
|
||||
if (this.readerCount == this.buffer.position()) {
|
||||
this.readerCount = -1;
|
||||
return '\n';
|
||||
} else {
|
||||
char c = this.buffer.readChar();
|
||||
return c;
|
||||
return this.buffer.readChar();
|
||||
}
|
||||
}
|
||||
}
|
@ -12,52 +12,42 @@
|
||||
package dorkbox.util.input.windows;
|
||||
|
||||
/**
|
||||
* Console mode
|
||||
* <p/>
|
||||
* Constants copied <tt>wincon.h</tt>.
|
||||
* Console mode <p/> Constants copied <tt>wincon.h</tt>.
|
||||
*/
|
||||
public enum ConsoleMode {
|
||||
/**
|
||||
* The ReadFile or ReadConsole function returns only when a carriage return
|
||||
* character is read. If this mode is disable, the functions return when one
|
||||
* or more characters are available.
|
||||
* The ReadFile or ReadConsole function returns only when a carriage return character is read. If this mode is
|
||||
* disable, the functions return when one or more characters are available.
|
||||
*/
|
||||
ENABLE_LINE_INPUT(2),
|
||||
|
||||
/**
|
||||
* Characters read by the ReadFile or ReadConsole function are written to
|
||||
* the active screen buffer as they are read. This mode can be used only if
|
||||
* the ENABLE_LINE_INPUT mode is also enabled.
|
||||
* Characters read by the ReadFile or ReadConsole function are written to the active screen buffer as they are read.
|
||||
* This mode can be used only if the ENABLE_LINE_INPUT mode is also enabled.
|
||||
*/
|
||||
ENABLE_ECHO_INPUT(4),
|
||||
|
||||
/**
|
||||
* CTRL+C is processed by the system and is not placed in the input buffer.
|
||||
* If the input buffer is being read by ReadFile or ReadConsole, other
|
||||
* control keys are processed by the system and are not returned in the
|
||||
* ReadFile or ReadConsole buffer. If the ENABLE_LINE_INPUT mode is also
|
||||
* enabled, backspace, carriage return, and linefeed characters are handled
|
||||
* by the system.
|
||||
* CTRL+C is processed by the system and is not placed in the input buffer. If the input buffer is being read by
|
||||
* ReadFile or ReadConsole, other control keys are processed by the system and are not returned in the ReadFile or
|
||||
* ReadConsole buffer. If the ENABLE_LINE_INPUT mode is also enabled, backspace, carriage return, and linefeed
|
||||
* characters are handled by the system.
|
||||
*/
|
||||
ENABLE_PROCESSED_INPUT(1),
|
||||
|
||||
/**
|
||||
* User interactions that change the size of the console screen buffer are
|
||||
* reported in the console's input buffee. Information about these events
|
||||
* can be read from the input buffer by applications using
|
||||
* theReadConsoleInput function, but not by those using ReadFile
|
||||
* orReadConsole.
|
||||
* User interactions that change the size of the console screen buffer are reported in the console's input buffee.
|
||||
* Information about these events can be read from the input buffer by applications using theReadConsoleInput
|
||||
* function, but not by those using ReadFile orReadConsole.
|
||||
*/
|
||||
ENABLE_WINDOW_INPUT(8),
|
||||
|
||||
/**
|
||||
* If the mouse pointer is within the borders of the console window and the
|
||||
* window has the keyboard focus, mouse events generated by mouse movement
|
||||
* and button presses are placed in the input buffer. These events are
|
||||
* discarded by ReadFile or ReadConsole, even when this mode is enabled.
|
||||
* If the mouse pointer is within the borders of the console window and the window has the keyboard focus, mouse
|
||||
* events generated by mouse movement and button presses are placed in the input buffer. These events are discarded by
|
||||
* ReadFile or ReadConsole, even when this mode is enabled.
|
||||
*/
|
||||
ENABLE_MOUSE_INPUT(16),
|
||||
;
|
||||
ENABLE_MOUSE_INPUT(16),;
|
||||
|
||||
|
||||
public final int code;
|
||||
|
@ -11,27 +11,25 @@
|
||||
*/
|
||||
package dorkbox.util.input.windows;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.PrintStream;
|
||||
|
||||
import org.fusesource.jansi.internal.Kernel32.INPUT_RECORD;
|
||||
import org.fusesource.jansi.internal.Kernel32.KEY_EVENT_RECORD;
|
||||
import org.fusesource.jansi.internal.WindowsSupport;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.PrintStream;
|
||||
|
||||
import dorkbox.util.input.Terminal;
|
||||
|
||||
/**
|
||||
* Terminal implementation for Microsoft Windows. Terminal initialization in
|
||||
* {@link #init} is accomplished by calling the Win32 APIs <a
|
||||
* href="http://msdn.microsoft.com/library/default.asp?
|
||||
* url=/library/en-us/dllproc/base/setconsolemode.asp">SetConsoleMode</a> and
|
||||
* <a href="http://msdn.microsoft.com/library/default.asp?
|
||||
* url=/library/en-us/dllproc/base/getconsolemode.asp">GetConsoleMode</a> to
|
||||
* disable character echoing.
|
||||
* <p/>
|
||||
* Terminal implementation for Microsoft Windows. Terminal initialization in {@link #init} is accomplished by calling
|
||||
* the Win32 APIs <a href="http://msdn.microsoft.com/library/default.asp? url=/library/en-us/dllproc/base/setconsolemode.asp">SetConsoleMode</a>
|
||||
* and <a href="http://msdn.microsoft.com/library/default.asp? url=/library/en-us/dllproc/base/getconsolemode.asp">GetConsoleMode</a>
|
||||
* to disable character echoing. <p/>
|
||||
*
|
||||
* @since 2.0 (customized)
|
||||
*/
|
||||
public class WindowsTerminal extends Terminal {
|
||||
|
||||
private volatile int originalMode;
|
||||
private final PrintStream out;
|
||||
|
||||
@ -52,9 +50,8 @@ public class WindowsTerminal extends Terminal {
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore the original terminal configuration, which can be used when
|
||||
* shutting down the console reader. The ConsoleReader cannot be
|
||||
* used after calling this method.
|
||||
* Restore the original terminal configuration, which can be used when shutting down the console reader. The
|
||||
* ConsoleReader cannot be used after calling this method.
|
||||
*/
|
||||
@Override
|
||||
public final void restore() throws IOException {
|
||||
@ -92,16 +89,16 @@ public class WindowsTerminal extends Terminal {
|
||||
return input;
|
||||
}
|
||||
|
||||
private final int readInput() {
|
||||
private int readInput() {
|
||||
// this HOOKS the input event, and prevents it from going to the console "proper"
|
||||
try {
|
||||
INPUT_RECORD[] events = null;
|
||||
INPUT_RECORD[] events;
|
||||
while (true) {
|
||||
// we ALWAYS read until we have an event we care about!
|
||||
events = WindowsSupport.readConsoleInput(1);
|
||||
|
||||
if (events != null) {
|
||||
for (int i = 0; i < events.length; i++ ) {
|
||||
for (int i = 0; i < events.length; i++) {
|
||||
KEY_EVENT_RECORD keyEvent = events[i].keyEvent;
|
||||
//Log.trace(keyEvent.keyDown? "KEY_DOWN" : "KEY_UP", "key code:", keyEvent.keyCode, "char:", (long)keyEvent.uchar);
|
||||
if (keyEvent.keyDown) {
|
||||
|
Loading…
Reference in New Issue
Block a user