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