1db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornpackage com.android.internal.util;
2db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
39b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackbornimport android.util.Log;
46d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackbornimport android.util.Printer;
56d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn
6db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.io.IOException;
7db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.io.OutputStream;
8db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.io.PrintWriter;
9db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.io.UnsupportedEncodingException;
10db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.io.Writer;
11db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.nio.ByteBuffer;
12db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.nio.CharBuffer;
13db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.nio.charset.Charset;
14db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.nio.charset.CharsetEncoder;
15db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.nio.charset.CoderResult;
16db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornimport java.nio.charset.CodingErrorAction;
17db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
18db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackbornpublic class FastPrintWriter extends PrintWriter {
19b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn    private static class DummyWriter extends Writer {
20e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        @Override
21e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        public void close() throws IOException {
22e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            UnsupportedOperationException ex
23e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                    = new UnsupportedOperationException("Shouldn't be here");
24e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            throw ex;
25e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
26e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
27e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        @Override
28e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        public void flush() throws IOException {
29e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            close();
30e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
31e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
32e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        @Override
33e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        public void write(char[] buf, int offset, int count) throws IOException {
34e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            close();
35e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
36e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    };
37e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
388c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    private final int mBufferLen;
398c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    private final char[] mText;
40db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    private int mPos;
41db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
42db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    final private OutputStream mOutputStream;
43e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    final private boolean mAutoFlush;
44e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    final private String mSeparator;
458c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn
468c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    final private Writer mWriter;
476d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn    final private Printer mPrinter;
488c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn
49db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    private CharsetEncoder mCharset;
508c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    final private ByteBuffer mBytes;
518c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn
52e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    private boolean mIoError;
53db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
54db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
55db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Constructs a new {@code PrintWriter} with {@code out} as its target
56db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * stream. By default, the new print writer does not automatically flush its
57db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * contents to the target stream when a newline is encountered.
58db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
59db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param out
60db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the target output stream.
61db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @throws NullPointerException
62db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             if {@code out} is {@code null}.
63db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
64db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public FastPrintWriter(OutputStream out) {
658c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        this(out, false, 8192);
66db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
67db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
68db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
69db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Constructs a new {@code PrintWriter} with {@code out} as its target
70db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * stream. The parameter {@code autoFlush} determines if the print writer
71db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * automatically flushes its contents to the target stream when a newline is
72db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * encountered.
73db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
74db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param out
75db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the target output stream.
76db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param autoFlush
77db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            indicates whether contents are flushed upon encountering a
78db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            newline sequence.
79db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @throws NullPointerException
80db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             if {@code out} is {@code null}.
81db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
82db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public FastPrintWriter(OutputStream out, boolean autoFlush) {
838c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        this(out, autoFlush, 8192);
848c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    }
858c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn
868c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    /**
878c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * Constructs a new {@code PrintWriter} with {@code out} as its target
888c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * stream and a custom buffer size. The parameter {@code autoFlush} determines
898c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * if the print writer automatically flushes its contents to the target stream
908c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * when a newline is encountered.
918c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *
928c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @param out
938c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            the target output stream.
948c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @param autoFlush
958c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            indicates whether contents are flushed upon encountering a
968c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            newline sequence.
978c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @param bufferLen
988c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            specifies the size of the FastPrintWriter's internal buffer; the
998c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            default is 8192.
1008c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @throws NullPointerException
1018c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *             if {@code out} is {@code null}.
1028c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     */
1038c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    public FastPrintWriter(OutputStream out, boolean autoFlush, int bufferLen) {
104b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn        super(new DummyWriter(), autoFlush);
1058c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        if (out == null) {
1068c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn            throw new NullPointerException("out is null");
1078c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        }
1088c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        mBufferLen = bufferLen;
1098c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        mText = new char[bufferLen];
1108c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        mBytes = ByteBuffer.allocate(mBufferLen);
111db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mOutputStream = out;
112e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mWriter = null;
1136d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mPrinter = null;
114e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mAutoFlush = autoFlush;
115e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mSeparator = System.lineSeparator();
116db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        initDefaultEncoder();
117db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
118db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
119db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
120db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Constructs a new {@code PrintWriter} with {@code wr} as its target
121db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * writer. By default, the new print writer does not automatically flush its
122db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * contents to the target writer when a newline is encountered.
123db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
1248c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * <p>NOTE: Unlike PrintWriter, this version will still do buffering inside of
1258c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * FastPrintWriter before sending data to the Writer.  This means you must call
1268c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * flush() before retrieving any data from the Writer.</p>
1278c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *
128db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param wr
129db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the target writer.
130db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @throws NullPointerException
131db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             if {@code wr} is {@code null}.
132db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
133db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public FastPrintWriter(Writer wr) {
1348c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        this(wr, false, 8192);
135db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
136db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
137db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
1386d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * Constructs a new {@code PrintWriter} with {@code wr} as its target
139db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * writer. The parameter {@code autoFlush} determines if the print writer
140db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * automatically flushes its contents to the target writer when a newline is
141db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * encountered.
142db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
143db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param wr
144db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the target writer.
145db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param autoFlush
146db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            indicates whether to flush contents upon encountering a
147db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            newline sequence.
148db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @throws NullPointerException
149db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             if {@code out} is {@code null}.
150db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
151db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public FastPrintWriter(Writer wr, boolean autoFlush) {
1528c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        this(wr, autoFlush, 8192);
1538c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    }
1548c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn
1558c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    /**
1566d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * Constructs a new {@code PrintWriter} with {@code wr} as its target
1578c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * writer and a custom buffer size. The parameter {@code autoFlush} determines
1588c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * if the print writer automatically flushes its contents to the target writer
1598c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * when a newline is encountered.
1608c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *
1618c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @param wr
1628c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            the target writer.
1638c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @param autoFlush
1648c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            indicates whether to flush contents upon encountering a
1658c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            newline sequence.
1668c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @param bufferLen
1678c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            specifies the size of the FastPrintWriter's internal buffer; the
1688c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *            default is 8192.
1698c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     * @throws NullPointerException
1708c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     *             if {@code wr} is {@code null}.
1718c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn     */
1728c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn    public FastPrintWriter(Writer wr, boolean autoFlush, int bufferLen) {
173b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn        super(new DummyWriter(), autoFlush);
1748c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        if (wr == null) {
1758c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn            throw new NullPointerException("wr is null");
1768c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        }
1778c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        mBufferLen = bufferLen;
1788c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        mText = new char[bufferLen];
1798c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        mBytes = null;
180db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mOutputStream = null;
181e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mWriter = wr;
1826d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mPrinter = null;
183e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mAutoFlush = autoFlush;
184e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mSeparator = System.lineSeparator();
185db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        initDefaultEncoder();
186db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
187db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
1886d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn    /**
1896d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * Constructs a new {@code PrintWriter} with {@code pr} as its target
1906d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * printer and the default buffer size.  Because a {@link Printer} is line-base,
1916d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * autoflush is always enabled.
1926d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *
1936d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * @param pr
1946d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *            the target writer.
1956d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * @throws NullPointerException
1966d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *             if {@code pr} is {@code null}.
1976d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     */
1986d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn    public FastPrintWriter(Printer pr) {
1996d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        this(pr, 512);
2006d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn    }
2016d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn
2026d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn    /**
2036d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * Constructs a new {@code PrintWriter} with {@code pr} as its target
2046d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * printer and a custom buffer size.  Because a {@link Printer} is line-base,
2056d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * autoflush is always enabled.
2066d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *
2076d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * @param pr
2086d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *            the target writer.
2096d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * @param bufferLen
2106d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *            specifies the size of the FastPrintWriter's internal buffer; the
2116d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *            default is 512.
2126d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     * @throws NullPointerException
2136d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     *             if {@code pr} is {@code null}.
2146d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn     */
2156d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn    public FastPrintWriter(Printer pr, int bufferLen) {
216b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn        super(new DummyWriter(), true);
2176d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        if (pr == null) {
2186d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn            throw new NullPointerException("pr is null");
2196d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        }
2206d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mBufferLen = bufferLen;
2216d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mText = new char[bufferLen];
2226d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mBytes = null;
2236d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mOutputStream = null;
2246d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mWriter = null;
2256d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mPrinter = pr;
2266d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mAutoFlush = true;
2276d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        mSeparator = System.lineSeparator();
2286d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        initDefaultEncoder();
2296d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn    }
2306d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn
231e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    private final void initEncoder(String csn) throws UnsupportedEncodingException {
232e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        try {
233e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            mCharset = Charset.forName(csn).newEncoder();
234e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        } catch (Exception e) {
235e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            throw new UnsupportedEncodingException(csn);
236e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
237e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mCharset.onMalformedInput(CodingErrorAction.REPLACE);
238e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        mCharset.onUnmappableCharacter(CodingErrorAction.REPLACE);
239db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
240db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
241db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
242e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     * Flushes this writer and returns the value of the error flag.
243db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
244e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     * @return {@code true} if either an {@code IOException} has been thrown
245e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     *         previously or if {@code setError()} has been called;
246e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     *         {@code false} otherwise.
247e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     * @see #setError()
248db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
249e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    public boolean checkError() {
250e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        flush();
251e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
252e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            return mIoError;
253e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
254db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
255db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
256db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
257e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     * Sets the error state of the stream to false.
258e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     * @since 1.6
259db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
260e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    protected void clearError() {
261e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
262e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            mIoError = false;
263e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
264db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
265db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
266e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    /**
267e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     * Sets the error flag of this writer to true.
268db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
269e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    protected void setError() {
270e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
271e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            mIoError = true;
272db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
273db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
274db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
275db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    private final void initDefaultEncoder() {
276db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mCharset = Charset.defaultCharset().newEncoder();
277db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mCharset.onMalformedInput(CodingErrorAction.REPLACE);
278db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mCharset.onUnmappableCharacter(CodingErrorAction.REPLACE);
279db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
280db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
281e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    private void appendLocked(char c) throws IOException {
282db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        int pos = mPos;
2838c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        if (pos >= (mBufferLen-1)) {
284e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            flushLocked();
285db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            pos = mPos;
286db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
287db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mText[pos] = c;
288db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mPos = pos+1;
289db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
290db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
291e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    private void appendLocked(String str, int i, final int length) throws IOException {
2928c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        final int BUFFER_LEN = mBufferLen;
293db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if (length > BUFFER_LEN) {
294db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            final int end = i + length;
295db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            while (i < end) {
296db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                int next = i + BUFFER_LEN;
297e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(str, i, next < end ? BUFFER_LEN : (end - i));
298db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                i = next;
299db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            }
300db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            return;
301db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
302db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        int pos = mPos;
303db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if ((pos+length) > BUFFER_LEN) {
304e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            flushLocked();
305db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            pos = mPos;
306db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
307db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        str.getChars(i, i + length, mText, pos);
308db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mPos = pos + length;
309db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
310db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
311e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    private void appendLocked(char[] buf, int i, final int length) throws IOException {
3128c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        final int BUFFER_LEN = mBufferLen;
313db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if (length > BUFFER_LEN) {
314db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            final int end = i + length;
315db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            while (i < end) {
316db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                int next = i + BUFFER_LEN;
317e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(buf, i, next < end ? BUFFER_LEN : (end - i));
318db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                i = next;
319db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            }
320db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            return;
321db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
322db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        int pos = mPos;
323db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if ((pos+length) > BUFFER_LEN) {
324e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            flushLocked();
325db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            pos = mPos;
326db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
327db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        System.arraycopy(buf, i, mText, pos, length);
328db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        mPos = pos + length;
329db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
330db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
331e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    private void flushBytesLocked() throws IOException {
3329b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn        if (!mIoError) {
3339b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn            int position;
3349b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn            if ((position = mBytes.position()) > 0) {
3359b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                mBytes.flip();
3369b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                mOutputStream.write(mBytes.array(), 0, position);
3379b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                mBytes.clear();
3389b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn            }
339db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
340db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
341db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
342e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    private void flushLocked() throws IOException {
343db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        //Log.i("PackageManager", "flush mPos=" + mPos);
344db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if (mPos > 0) {
345db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            if (mOutputStream != null) {
346db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                CharBuffer charBuffer = CharBuffer.wrap(mText, 0, mPos);
347db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                CoderResult result = mCharset.encode(charBuffer, mBytes, true);
348ce78b9e1146ce204605fb179f10c842644fea61dAndreas Gampe                while (!mIoError) {
349db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                    if (result.isError()) {
350db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                        throw new IOException(result.toString());
351db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                    } else if (result.isOverflow()) {
352e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                        flushBytesLocked();
353db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                        result = mCharset.encode(charBuffer, mBytes, true);
354db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                        continue;
355db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                    }
356db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                    break;
357db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn                }
3589b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                if (!mIoError) {
3599b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                    flushBytesLocked();
3609b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                    mOutputStream.flush();
3619b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                }
3626d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn            } else if (mWriter != null) {
3639b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                if (!mIoError) {
3649b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                    mWriter.write(mText, 0, mPos);
3659b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                    mWriter.flush();
3669b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                }
3676d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn            } else {
3686d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                int nonEolOff = 0;
3696d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                final int sepLen = mSeparator.length();
3706d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                final int len = sepLen < mPos ? sepLen : mPos;
3716d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                while (nonEolOff < len && mText[mPos-1-nonEolOff]
3726d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                        == mSeparator.charAt(mSeparator.length()-1-nonEolOff)) {
3736d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                    nonEolOff++;
3746d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                }
3756d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                if (nonEolOff >= mPos) {
3766d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                    mPrinter.println("");
3776d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                } else {
3786d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                    mPrinter.println(new String(mText, 0, mPos-nonEolOff));
3796d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                }
380db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            }
381db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            mPos = 0;
382db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
383db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
384db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
385db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
386db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Ensures that all pending data is sent out to the target. It also
387db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * flushes the target. If an I/O error occurs, this writer's error
388db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * state is set to {@code true}.
389db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
390db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    @Override
391db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void flush() {
392e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
393e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
394e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                flushLocked();
3959b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                if (!mIoError) {
3969b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                    if (mOutputStream != null) {
3979b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                        mOutputStream.flush();
3989b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                    } else if (mWriter != null) {
3999b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                        mWriter.flush();
4009b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                    }
401e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                }
402e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
4039b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                Log.w("FastPrintWriter", "Write failure", e);
404e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                setError();
405e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
406e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
407e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    }
408e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
409e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    @Override
410e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    public void close() {
411e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
412e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
413e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                flushLocked();
414e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                if (mOutputStream != null) {
415e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                    mOutputStream.close();
4166d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                } else if (mWriter != null) {
417e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                    mWriter.close();
418e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                }
419e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
4209b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                Log.w("FastPrintWriter", "Write failure", e);
421e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                setError();
422e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
423db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
424db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
425db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
426db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
427db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Prints the string representation of the specified character array
428db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * to the target.
429db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
430db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param charArray
431db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the character array to print to the target.
432db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @see #print(String)
433db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
434db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void print(char[] charArray) {
435e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
436e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
437e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(charArray, 0, charArray.length);
438e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
4399b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                Log.w("FastPrintWriter", "Write failure", e);
4409b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                setError();
441e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
442db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
443db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
444db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
445db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
446db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Prints the string representation of the specified character to the
447db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * target.
448db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
449db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param ch
450db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the character to print to the target.
451db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @see #print(String)
452db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
453db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void print(char ch) {
454e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
455e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
456e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(ch);
457e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
4589b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                Log.w("FastPrintWriter", "Write failure", e);
4599b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                setError();
460e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
461db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
462db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
463db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
464db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
465db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Prints a string to the target. The string is converted to an array of
466db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * bytes using the encoding chosen during the construction of this writer.
467db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * The bytes are then written to the target with {@code write(int)}.
468db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * <p>
469db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * If an I/O error occurs, this writer's error flag is set to {@code true}.
470db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
471db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param str
472db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the string to print to the target.
473db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @see #write(int)
474db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
475db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void print(String str) {
476db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if (str == null) {
477db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            str = String.valueOf((Object) null);
478db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
479e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
480e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
481e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(str, 0, str.length());
482e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
4839b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                Log.w("FastPrintWriter", "Write failure", e);
484e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                setError();
485e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
486e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
487e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    }
488e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
489e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
490e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    @Override
491e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    public void print(int inum) {
492e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        if (inum == 0) {
493e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            print("0");
494e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        } else {
495e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            super.print(inum);
496e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
497e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    }
498e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
499e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    @Override
500e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    public void print(long lnum) {
501e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        if (lnum == 0) {
502e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            print("0");
503e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        } else {
504e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            super.print(lnum);
505e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
506e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    }
507e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
508e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    /**
509e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     * Prints a newline. Flushes this writer if the autoFlush flag is set to {@code true}.
510e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn     */
511e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    public void println() {
512e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
513e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
514e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(mSeparator, 0, mSeparator.length());
515e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                if (mAutoFlush) {
516e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                    flushLocked();
517e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                }
518e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
5199b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                Log.w("FastPrintWriter", "Write failure", e);
520e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                setError();
521e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
522e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
523e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    }
524e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
525e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    @Override
526e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    public void println(int inum) {
527e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        if (inum == 0) {
528e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            println("0");
529e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        } else {
530e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            super.println(inum);
531e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        }
532e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    }
533e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn
534e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    @Override
535e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn    public void println(long lnum) {
536e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        if (lnum == 0) {
537e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            println("0");
538e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        } else {
53920cdcee47d10986969e7e2a53a40a6ecabae3827Dianne Hackborn            super.println(lnum);
540db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
541db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
542db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
543db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
544db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Prints the string representation of the character array {@code chars} followed by a newline.
545db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Flushes this writer if the autoFlush flag is set to {@code true}.
546db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
547db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void println(char[] chars) {
548db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        print(chars);
549db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        println();
550db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
551db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
552db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
553db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Prints the string representation of the char {@code c} followed by a newline.
554db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Flushes this writer if the autoFlush flag is set to {@code true}.
555db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
556db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void println(char c) {
557db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        print(c);
558db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        println();
559db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
560db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
561db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
562db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Writes {@code count} characters from {@code buffer} starting at {@code
563db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * offset} to the target.
564db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * <p>
565db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * This writer's error flag is set to {@code true} if this writer is closed
566db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * or an I/O error occurs.
567db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
568db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param buf
569db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the buffer to write to the target.
570db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param offset
571db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the index of the first character in {@code buffer} to write.
572db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param count
573db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the number of characters in {@code buffer} to write.
574db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @throws IndexOutOfBoundsException
575db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             if {@code offset < 0} or {@code count < 0}, or if {@code
576db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             offset + count} is greater than the length of {@code buf}.
577db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
578db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    @Override
579db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void write(char[] buf, int offset, int count) {
580e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
581e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
582e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(buf, offset, count);
583e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
5849b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                Log.w("FastPrintWriter", "Write failure", e);
5859b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                setError();
586e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
587db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
588db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
589db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
590db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
591db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Writes one character to the target. Only the two least significant bytes
592db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * of the integer {@code oneChar} are written.
593db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * <p>
594db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * This writer's error flag is set to {@code true} if this writer is closed
595db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * or an I/O error occurs.
596db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
597db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param oneChar
598db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the character to write to the target.
599db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
600db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    @Override
601db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void write(int oneChar) {
602e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
603e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
604e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked((char) oneChar);
605e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
6069b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                Log.w("FastPrintWriter", "Write failure", e);
6079b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                setError();
608e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
609db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
610db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
611db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
612db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
613db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Writes the characters from the specified string to the target.
614db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
615db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param str
616db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the non-null string containing the characters to write.
617db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
618db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    @Override
619db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void write(String str) {
620e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
621e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
622e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(str, 0, str.length());
623e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
6249b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                Log.w("FastPrintWriter", "Write failure", e);
6259b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                setError();
626e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
627db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
628db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
629db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
630db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
631db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Writes {@code count} characters from {@code str} starting at {@code
632db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * offset} to the target.
633db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
634db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param str
635db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the non-null string containing the characters to write.
636db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param offset
637db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the index of the first character in {@code str} to write.
638db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param count
639db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the number of characters from {@code str} to write.
640db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @throws IndexOutOfBoundsException
641db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             if {@code offset < 0} or {@code count < 0}, or if {@code
642db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             offset + count} is greater than the length of {@code str}.
643db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
644db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    @Override
645db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public void write(String str, int offset, int count) {
646e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn        synchronized (lock) {
647e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            try {
648e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn                appendLocked(str, offset, count);
649e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            } catch (IOException e) {
6509b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                Log.w("FastPrintWriter", "Write failure", e);
6519b78db41a0f2230001535b3ca33a3ebc31e6c6c1Dianne Hackborn                setError();
652e5a9c92377e035b24f50f9f66f4cdfd9cf79c2ddDianne Hackborn            }
653db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
654db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
655db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn
656db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    /**
657db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * Appends a subsequence of the character sequence {@code csq} to the
658db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * target. This method works the same way as {@code
659db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * PrintWriter.print(csq.subsequence(start, end).toString())}. If {@code
660db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * csq} is {@code null}, then the specified subsequence of the string "null"
661db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * will be written to the target.
662db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *
663db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param csq
664db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the character sequence appended to the target.
665db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param start
666db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the index of the first char in the character sequence appended
667db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            to the target.
668db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @param end
669db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            the index of the character following the last character of the
670db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *            subsequence appended to the target.
671db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @return this writer.
672db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     * @throws StringIndexOutOfBoundsException
673db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             if {@code start > end}, {@code start < 0}, {@code end < 0} or
674db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             either {@code start} or {@code end} are greater or equal than
675db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     *             the length of {@code csq}.
676db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn     */
677db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    @Override
678db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    public PrintWriter append(CharSequence csq, int start, int end) {
679db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        if (csq == null) {
680db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn            csq = "null";
681db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        }
682db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        String output = csq.subSequence(start, end).toString();
683db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        write(output, 0, output.length());
684db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn        return this;
685db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn    }
686db4e33f1f1d766afa3218a6bbdbb561e7962c854Dianne Hackborn}
687