14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.util.io;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.IOException;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.OutputStream;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
6d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root
7d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root/**
8d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root * An output stream which copies anything written into it to another stream.
9d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root */
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class TeeOutputStream
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends OutputStream
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private OutputStream output1;
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private OutputStream output2;
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
16d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root    /**
17d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root     * Base constructor.
18d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root     *
19d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root     * @param output1 the output stream that is wrapped.
20d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root     * @param output2 a secondary stream that anything written to output1 is also written to.
21d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root     */
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public TeeOutputStream(OutputStream output1, OutputStream output2)
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.output1 = output1;
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.output2 = output2;
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void write(byte[] buf)
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.output1.write(buf);
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.output2.write(buf);
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void write(byte[] buf, int off, int len)
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.output1.write(buf, off, len);
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.output2.write(buf, off, len);
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void write(int b)
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.output1.write(b);
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.output2.write(b);
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void flush()
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.output1.flush();
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.output2.flush();
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void close()
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.output1.close();
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.output2.close();
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}