gecko-dev/plugin/oji/MRJ/testing/ConsoleApplet/Console.java
beard%netscape.com 86022c9184 First Checked In.
1999-03-12 21:35:17 +00:00

119 lines
2.8 KiB
Java

/*
Console.java
Simple console that lets an Applet attach to the system console.
by Patrick C. Beard.
*/
package netscape.console;
import java.io.*;
import java.awt.*;
public class Console {
// Save primordial System streams.
private static InputStream in;
private static PrintStream out;
private static PrintStream err;
private static TextArea console;
private static class Input extends InputStream {
byte[] buffer = new byte[1024];
int position = 0;
int count = 0;
private void fillBuffer() throws EOFException {
// int length = readLine(buffer, 0, buffer.length);
int length = 1024;
if (length == -1)
throw new EOFException();
count = length;
position = 0;
}
public int read() throws IOException {
synchronized(this) {
if (position >= count)
fillBuffer();
return buffer[position++];
}
}
public int read(byte[] b, int offset, int length) throws IOException {
synchronized(this) {
// only fill the buffer at the outset, always returns at most one line of data.
if (position >= count)
fillBuffer();
int initialOffset = offset;
while (offset < length && position < count) {
b[offset++] = buffer[position++];
}
return (offset - initialOffset);
}
}
}
private static class Output extends OutputStream implements Runnable {
StringBuffer buffer = new StringBuffer();
public Output() {
Thread flusher = new Thread(this, getClass().getName() + "-Flusher");
flusher.setDaemon(true);
flusher.start();
}
public synchronized void write(int b) throws IOException {
this.buffer.append((char)b);
notify();
}
public synchronized void write(byte[] buffer, int offset, int count) throws IOException {
this.buffer.append(new String(buffer, 0, offset, count));
notify();
}
public synchronized void flush() throws IOException {
String value = this.buffer.toString();
console.append(value);
this.buffer.setLength(0);
}
/**
* When I/O occurs, it is placed in a StringBuffer, which is flushed in a different thread.
* This prevents deadlocks that could occur when the AWT itself is printing messages.
*/
public synchronized void run() {
for (;;) {
try {
wait();
flush();
} catch (InterruptedException ie) {
} catch (IOException ioe) {
}
}
}
}
private static class Error extends Output {}
public static void init(TextArea text) {
in = System.in;
out = System.out;
err = System.err;
console = text;
System.setIn(new Input());
System.setOut(new PrintStream(new Output()));
System.setErr(new PrintStream(new Error()));
}
public static void dispose() {
System.setIn(in);
System.setOut(out);
System.setErr(err);
console = null;
}
}