PipedWriter.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.io;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.util.Msg;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Places information on a communications pipe. When two threads want to pass
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * data back and forth, one creates a piped writer and the other creates a piped
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reader.
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see PipedReader
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class PipedWriter extends Writer {
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The destination PipedReader
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private PipedReader dest;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean closed;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new unconnected {@code PipedWriter}. The resulting writer
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * must be connected to a {@code PipedReader} before data may be written to
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * it.
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see PipedReader
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PipedWriter() {
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super();
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code PipedWriter} connected to the {@link PipedReader}
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code dest}. Any data written to this writer can be read from {@code
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * dest}.
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dest
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code PipedReader} to connect to.
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code dest} is already connected.
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PipedWriter(PipedReader dest) throws IOException {
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(dest);
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        connect(dest);
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes this writer. If a {@link PipedReader} is connected to this writer,
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * it is closed as well and the pipe is disconnected. Any data buffered in
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the reader can still be read.
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while closing this writer.
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void close() throws IOException {
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            /* Is the pipe connected? */
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (dest != null) {
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                dest.done();
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                dest = null;
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            closed = true;
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Connects this {@code PipedWriter} to a {@link PipedReader}. Any data
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * written to this writer becomes readable in the reader.
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param stream
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the reader to connect to.
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this writer is closed or already connected, or if {@code
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             stream} is already connected.
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void connect(PipedReader stream) throws IOException {
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (this.dest != null) {
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IOException(Msg.getString("K0079")); //$NON-NLS-1$
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (closed) {
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IOException(Msg.getString("K0078")); //$NON-NLS-1$
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            stream.establishConnection();
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.dest = stream;
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Notifies the readers of this {@code PipedReader} that characters can be read. This
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method does nothing if this Writer is not connected.
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs while flushing this writer.
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void flush() throws IOException {
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (dest != null) {
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            dest.flush();
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Writes {@code count} characters from the character array {@code buffer}
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * starting at offset {@code index} to this writer. The written data can
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * then be read from the connected {@link PipedReader} instance.
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Separate threads should be used to write to a {@code PipedWriter} and to
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * read from the connected {@code PipedReader}. If the same thread is used,
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * a deadlock may occur.
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </p>
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the buffer to write.
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the index of the first character in {@code buffer} to write.
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param count
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of characters from {@code buffer} to write to this
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            writer.
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IndexOutOfBoundsException
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code offset < 0} or {@code count < 0}, or if {@code
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             offset + count} is bigger than the length of {@code buffer}.
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InterruptedIOException
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the pipe is full and the current thread is interrupted
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             waiting for space to write data. This case is not currently
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             handled correctly.
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this writer is closed or not connected, if the target
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             reader is closed or if the thread reading from the target
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             reader is no longer alive. This case is currently not handled
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             correctly.
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code buffer} is {@code null}.
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void write(char[] buffer, int offset, int count) throws IOException {
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-note
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // changed array notation to be consistent with the rest of harmony
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-note
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (closed) {
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IOException(Msg.getString("K0078")); //$NON-NLS-1$
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (dest == null) {
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IOException(Msg.getString("K007b")); //$NON-NLS-1$
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (buffer == null) {
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new NullPointerException(Msg.getString("K0047")); //$NON-NLS-1$
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // avoid int overflow
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Exception priorities (in case of multiple errors) differ from
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // RI, but are spec-compliant.
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // removed redundant check, used (offset | count) < 0
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // instead of (offset < 0) || (count < 0) to safe one operation
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((offset | count) < 0 || count > buffer.length - offset) {
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IndexOutOfBoundsException(Msg.getString("K002f")); //$NON-NLS-1$
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            dest.receive(buffer, offset, count);
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Writes a single character {@code c} to this writer. This character can
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * then be read from the connected {@link PipedReader} instance.
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Separate threads should be used to write to a {@code PipedWriter} and to
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * read from the connected {@code PipedReader}. If the same thread is used,
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * a deadlock may occur.
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </p>
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param c
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the character to write.
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InterruptedIOException
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the pipe is full and the current thread is interrupted
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             waiting for space to write data. This case is not currently
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             handled correctly.
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this writer is closed or not connected, if the target
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             reader is closed or if the thread reading from the target
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             reader is no longer alive. This case is currently not handled
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             correctly.
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void write(int c) throws IOException {
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (closed) {
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IOException(Msg.getString("K0078")); //$NON-NLS-1$
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (dest == null) {
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IOException(Msg.getString("K007b")); //$NON-NLS-1$
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            dest.receive((char) c);
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
225