aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/io/PipedWriter.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/io/PipedWriter.java')
-rw-r--r--libjava/java/io/PipedWriter.java304
1 files changed, 128 insertions, 176 deletions
diff --git a/libjava/java/io/PipedWriter.java b/libjava/java/io/PipedWriter.java
index cc36acd..a0a51d1 100644
--- a/libjava/java/io/PipedWriter.java
+++ b/libjava/java/io/PipedWriter.java
@@ -1,5 +1,5 @@
-/* PipedWriter.java -- Write portion of piped streams.
- Copyright (C) 1998 Free Software Foundation, Inc.
+/* PipedWriter.java -- Write portion of piped character streams.
+ Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -27,6 +27,10 @@ executable file might be covered by the GNU General Public License. */
package java.io;
+// NOTE: This implementation is very similar to that of PipedOutputStream.
+// If you fix a bug in here, chances are you should make a similar change to
+// the PipedOutputStream code.
+
/**
* This class writes its chars to a <code>PipedReader</code> to
* which it is connected.
@@ -36,182 +40,130 @@ package java.io;
* they are in the same thread, read and write operations could deadlock
* the thread.
*
- * @version 0.0
- *
* @author Aaron M. Renn (arenn@urbanophile.com)
*/
public class PipedWriter extends Writer
{
-
-/*************************************************************************/
-
-/*
- * Instance Variables
- */
-
-/**
- * This is the <code>PipedReader</code> to which this object
- * is connected.
- */
-private PipedReader snk;
-
-/**
- * This flag indicates whether or not this stream has ever been
- * connected to an input stream
- */
-private boolean ever_connected;
-
-/**
- * This flag indicates whether the <code>close</code> method has ever
- * been called for this stream.
- */
-private boolean closed;
-
-/*************************************************************************/
-
-/**
- * This method initializes a new <code>PipedWriter</code> instance.
- * This constructor creates an unconnected object. It must be connected
- * to a <code>PipedReader</code> object using the <code>connect</code>
- * method prior to writing any data or an exception will be thrown.
- */
-public
-PipedWriter()
-{
- ; // Do Nothing
-}
-
-/*************************************************************************/
-
-/**
- * This method initializes a new <code>PipedWriter</code> instance
- * to write to the specified <code>PipedReader</code>. This stream
- * is then ready for writing.
- *
- * @param snk The <code>PipedReader</code> to connect this stream to.
- *
- * @exception IOException If an error occurs
- */
-public
-PipedWriter(PipedReader snk) throws IOException
-{
- connect(snk);
-}
-
-/*************************************************************************/
-
-/*
- * Instance Methods
- */
-
-/**
- * This method connects this object to the specified
- * <code>PipedReader</code> object. This stream will then be ready
- * for writing. If this stream is already connected or has been
- * previously closed, then an exception is thrown.
- *
- * @param snk The <code>PipedReader</code> to connect this stream to
- *
- * @exception IOException If an error occurs
- */
-public void
-connect(PipedReader snk) throws IOException
-{
- if (snk == this.snk)
- return;
-
- if (ever_connected)
- throw new IOException("Already connected");
-
- if (closed)
- throw new IOException("Stream is closed and cannot be reopened");
-
- synchronized (lock) {
-
- this.snk = snk;
- ever_connected = true;
- snk.src = this;
-
- snk.connect(this);
-
- } // synchronized
-}
-
-/*************************************************************************/
-
-/**
- * This method closes this stream so that no more data can be written
- * to it. Any further attempts to write to this stream may throw an
- * exception
- *
- * @exception IOException If an error occurs
- */
-public void
-close() throws IOException
-{
- synchronized (lock) {
-
- closed = true;
- snk.close();
- notifyAll();
-
- } // synchronized
+ /** Target PipedReader to which this is connected. Null only if this
+ * Writer hasn't been connected yet. */
+ PipedReader sink;
+
+ /** Set to true if close() has been called on this Writer. */
+ boolean closed;
+
+ /** Buffer used to implement single-argument write */
+ char[] read_buf = new char[1];
+
+ /**
+ * Create an unconnected PipedWriter. It must be connected
+ * to a <code>PipedReader</code> using the <code>connect</code>
+ * method prior to writing any data or an exception will be thrown.
+ */
+ public PipedWriter()
+ {
+ }
+
+ /**
+ * Create a new <code>PipedWriter</code> instance
+ * to write to the specified <code>PipedReader</code>. This stream
+ * is then ready for writing.
+ *
+ * @param sink The <code>PipedReader</code> to connect this stream to.
+ *
+ * @exception IOException If <code>sink</code> has already been connected
+ * to a different PipedWriter.
+ */
+ public PipedWriter(PipedReader sink) throws IOException
+ {
+ sink.connect(this);
+ }
+
+ /**
+ * Connects this object to the specified <code>PipedReader</code>
+ * object. This stream will then be ready for writing.
+ *
+ * @param sink The <code>PipedReader</code> to connect this stream to
+ *
+ * @exception IOException If the stream has not been connected or has
+ * been closed.
+ */
+ public void connect(PipedReader sink) throws IOException
+ {
+ if (sink != null)
+ throw new IOException ("Already connected");
+ sink.connect(this);
+ }
+
+ /**
+ * Write a single char of date to the stream. Note that this method will
+ * block if the <code>PipedReader</code> to which this object is
+ * connected has a full buffer.
+ *
+ * @param b The char of data to be written, passed as an <code>int</code>.
+ *
+ * @exception IOException If the stream has not been connected or has
+ * been closed.
+ */
+ public void write(char b) throws IOException
+ {
+ read_buf[0] = b;
+ sink.receive (read_buf, 0, 1);
+ }
+
+ /**
+ * This method writes <code>len</code> chars of data from the char array
+ * <code>buf</code> starting at index <code>offset</code> in the array
+ * to the stream. Note that this method will block if the
+ * <code>PipedReader</code> to which this object is connected has
+ * a buffer that cannot hold all of the chars to be written.
+ *
+ * @param buf The array containing chars to write to the stream.
+ * @param offset The index into the array to start writing chars from.
+ * @param len The number of chars to write.
+ *
+ * @exception IOException If the stream has not been connected or has
+ * been closed.
+ */
+ public void write(char[] b, int off, int len) throws IOException
+ {
+ if (sink == null)
+ throw new IOException ("Not connected");
+ if (closed)
+ throw new IOException ("Pipe closed");
+
+ sink.receive (b, off, len);
+ }
+
+ /**
+ * This method does nothing.
+ *
+ * @exception IOException If the stream is closed.
+ * @specnote You'd think that this method would block until the sink
+ * had read all available data. Thats not the case - this method
+ * appears to be a no-op?
+ */
+ public void flush()
+ {
+ }
+
+ /**
+ * This method closes this stream so that no more data can be written
+ * to it. Any further attempts to write to this stream may throw an
+ * exception
+ *
+ * @exception IOException If an error occurs
+ */
+ public void close()
+ {
+ // A close call on an unconnected PipedWriter has no effect.
+ if (sink != null)
+ {
+ closed = true;
+ // Notify any waiting readers that the stream is now closed.
+ synchronized (sink)
+ {
+ sink.notifyAll();
+ }
+ }
+ }
}
-
-/*************************************************************************/
-
-/**
- * This methods writes a single byte of data to the pipe. This call may
- * block if the pipe is full.
- *
- * @param c The <code>char</code> to write, passed as an <code>int</code>.
- *
- * @exception IOException If an error occurs.
- */
-public void
-write(int c) throws IOException
-{
- char[] buf = new char[1];
- buf[0] = (char)c;
-
- write(buf, 0, buf.length);
-}
-
-/*************************************************************************/
-
-/**
- * This method writes <code>len</code> chars of data from the char array
- * <code>buf</code> starting at index <code>offset</code> in the array
- * to the stream. Note that this method will block if the
- * <code>PipedReader</code> to which this object is connected has
- * a buffer that cannot hold all of the chars to be written.
- *
- * @param buf The array containing chars to write to thes stream.
- * @param offset The index into the array to start writing chars from.
- * @param len The number of chars to write.
- *
- * @exception IOException If an error occurs
- */
-public void
-write(char[] buf, int offset, int len) throws IOException
-{
- snk.write(buf, 0, len);
-}
-
-/*************************************************************************/
-
-/**
- * This method flushes any unwritten chars to the underlying output
- * sink. This method does nothing in this class because this class does
- * not buffer any chars.
- *
- * @exception IOException If an error occurs
- */
-public void
-flush() throws IOException
-{
- ; // Do Nothing
-}
-
-} // class PipedWriter
-