196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/*
296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * this work for additional information regarding copyright ownership.
596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * (the "License"); you may not use this file except in compliance with
796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * the License.  You may obtain a copy of the License at
896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See the License for the specific language governing permissions and
1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * limitations under the License.
1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
1796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpackage org.apache.commons.io.output;
1896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
1996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.IOException;
2096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.OutputStream;
2196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
2296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
2396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/**
2496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * An output stream which triggers an event when a specified number of bytes of
2596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * data have been written to it. The event can be used, for example, to throw
2696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * an exception if a maximum has been reached, or to switch the underlying
2796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * stream type when the threshold is exceeded.
2896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p>
2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * This class overrides all <code>OutputStream</code> methods. However, these
3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * overrides ultimately call the corresponding methods in the underlying output
3196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * stream implementation.
3296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p>
3396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * NOTE: This implementation may trigger the event <em>before</em> the threshold
3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * is actually reached, since it triggers when a pending write operation would
3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * cause the threshold to be exceeded.
3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
3796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @author <a href="mailto:martinc@apache.org">Martin Cooper</a>
3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @version $Id: ThresholdingOutputStream.java 540714 2007-05-22 19:39:44Z niallp $
4096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpublic abstract class ThresholdingOutputStream
4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    extends OutputStream
4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project{
4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
4596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------- Data members
4696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
4896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
4996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * The threshold at which the event will be triggered.
5096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private int threshold;
5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * The number of bytes written to the output stream.
5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private long written;
5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Whether or not the configured threshold has been exceeded.
6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private boolean thresholdExceeded;
6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ----------------------------------------------------------- Constructors
6796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
6896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
7096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Constructs an instance of this class which will trigger an event at the
7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * specified threshold.
7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
7396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param threshold The number of bytes at which to trigger an event.
7496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
7596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public ThresholdingOutputStream(int threshold)
7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
7796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        this.threshold = threshold;
7896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
7996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // --------------------------------------------------- OutputStream methods
8296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
8596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Writes the specified byte to this output stream.
8696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param b The byte to be written.
8896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
8996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @exception IOException if an error occurs.
9096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
9196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void write(int b) throws IOException
9296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
9396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        checkThreshold(1);
9496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getStream().write(b);
9596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        written++;
9696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
9796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
9896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
9996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
10096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Writes <code>b.length</code> bytes from the specified byte array to this
10196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * output stream.
10296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
10396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param b The array of bytes to be written.
10496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
10596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @exception IOException if an error occurs.
10696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
10796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void write(byte b[]) throws IOException
10896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
10996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        checkThreshold(b.length);
11096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getStream().write(b);
11196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        written += b.length;
11296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
11396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
11496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
11596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
11696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Writes <code>len</code> bytes from the specified byte array starting at
11796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * offset <code>off</code> to this output stream.
11896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
11996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param b   The byte array from which the data will be written.
12096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param off The start offset in the byte array.
12196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param len The number of bytes to write.
12296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
12396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @exception IOException if an error occurs.
12496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
12596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void write(byte b[], int off, int len) throws IOException
12696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
12796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        checkThreshold(len);
12896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getStream().write(b, off, len);
12996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        written += len;
13096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
13196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
13296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
13396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
13496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Flushes this output stream and forces any buffered output bytes to be
13596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * written out.
13696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
13796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @exception IOException if an error occurs.
13896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
13996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void flush() throws IOException
14096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
14196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getStream().flush();
14296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
14396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
14496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
14596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
14696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Closes this output stream and releases any system resources associated
14796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * with this stream.
14896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
14996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @exception IOException if an error occurs.
15096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
15196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void close() throws IOException
15296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
15396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        try
15496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        {
15596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            flush();
15696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
15796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        catch (IOException ignored)
15896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        {
15996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            // ignore
16096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
16196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getStream().close();
16296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
16396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
16496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
16596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // --------------------------------------------------------- Public methods
16696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
16796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
16896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
16996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Returns the threshold, in bytes, at which an event will be triggered.
17096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
17196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return The threshold point, in bytes.
17296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
17396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public int getThreshold()
17496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
17596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return threshold;
17696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
17796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
17896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
17996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
18096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Returns the number of bytes that have been written to this output stream.
18196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
18296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return The number of bytes written.
18396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
18496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public long getByteCount()
18596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
18696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return written;
18796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
18896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
18996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
19096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
19196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Determines whether or not the configured threshold has been exceeded for
19296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * this output stream.
19396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
19496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return <code>true</code> if the threshold has been reached;
19596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *         <code>false</code> otherwise.
19696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
19796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public boolean isThresholdExceeded()
19896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
19996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return (written > threshold);
20096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
20196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
20296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
20396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ------------------------------------------------------ Protected methods
20496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
20596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
20696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
20796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Checks to see if writing the specified number of bytes would cause the
20896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * configured threshold to be exceeded. If so, triggers an event to allow
20996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * a concrete implementation to take action on this.
21096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
21196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param count The number of bytes about to be written to the underlying
21296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *              output stream.
21396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
21496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @exception IOException if an error occurs.
21596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
21696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    protected void checkThreshold(int count) throws IOException
21796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
21896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (!thresholdExceeded && (written + count > threshold))
21996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        {
22096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            thresholdExceeded = true;
22196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            thresholdReached();
22296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
22396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
22496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
22596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
22696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Resets the byteCount to zero.  You can call this from
22796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * {@link #thresholdReached()} if you want the event to be triggered again.
22896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
22996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    protected void resetByteCount()
23096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
23196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        this.thresholdExceeded = false;
23296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        this.written = 0;
23396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
23496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
23596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ------------------------------------------------------- Abstract methods
23696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
23796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
23896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
23996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Returns the underlying output stream, to which the corresponding
24096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * <code>OutputStream</code> methods in this class will ultimately delegate.
24196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
24296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return The underlying output stream.
24396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
24496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @exception IOException if an error occurs.
24596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
24696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    protected abstract OutputStream getStream() throws IOException;
24796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
24896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
24996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
25096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Indicates that the configured threshold has been reached, and that a
25196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * subclass should take whatever action necessary on this event. This may
25296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * include changing the underlying output stream.
25396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
25496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @exception IOException if an error occurs.
25596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
25696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    protected abstract void thresholdReached() throws IOException;
25796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project}
258