blob: 0dd3a59e5b079aa20de0514108798a0304866172 [file] [log] [blame]
/*
* Copyright (c) 2002-2018, the original author or authors.
*
* This software is distributable under the BSD license. See the terms of the
* BSD license in the documentation provided with this software.
*
* https://opensource.org/licenses/BSD-3-Clause
*/
package jdk.internal.org.jline.utils;
import java.io.IOException;
import java.io.Reader;
/**
* Non blocking reader
*/
public abstract class NonBlockingReader extends Reader {
public static final int EOF = -1;
public static final int READ_EXPIRED = -2;
/**
* Shuts down the thread that is handling blocking I/O. Note that if the
* thread is currently blocked waiting for I/O it will not actually
* shut down until the I/O is received.
*/
public void shutdown() {
}
@Override
public int read() throws IOException {
return read(0L, false);
}
/**
* Peeks to see if there is a byte waiting in the input stream without
* actually consuming the byte.
*
* @param timeout The amount of time to wait, 0 == forever
* @return -1 on eof, -2 if the timeout expired with no available input
* or the character that was read (without consuming it).
* @throws IOException if anything wrong happens
*/
public int peek(long timeout) throws IOException {
return read(timeout, true);
}
/**
* Attempts to read a character from the input stream for a specific
* period of time.
*
* @param timeout The amount of time to wait for the character
* @return The character read, -1 if EOF is reached, or -2 if the
* read timed out.
* @throws IOException if anything wrong happens
*/
public int read(long timeout) throws IOException {
return read(timeout, false);
}
/**
* This version of read() is very specific to jline's purposes, it
* will always always return a single byte at a time, rather than filling
* the entire buffer.
* @param b the buffer
* @param off the offset in the buffer
* @param len the maximum number of chars to read
* @throws IOException if anything wrong happens
*/
@Override
public int read(char[] b, int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
int c = this.read(0L);
if (c == EOF) {
return EOF;
}
b[off] = (char) c;
return 1;
}
public abstract int readBuffered(char[] b) throws IOException;
public int available() {
return 0;
}
/**
* Attempts to read a character from the input stream for a specific
* period of time.
* @param timeout The amount of time to wait for the character
* @param isPeek <code>true</code>if the character read must not be consumed
* @return The character read, -1 if EOF is reached, or -2 if the
* read timed out.
* @throws IOException if anything wrong happens
*/
protected abstract int read(long timeout, boolean isPeek) throws IOException;
}