1f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util.zip;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.OutputStream;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The {@code CheckedOutputStream} class is used to maintain a running checksum
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of all data written to a stream. The purpose of this checksum is to establish
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * data integrity, by publishing the checksum to other parties wanting to read
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the non corrupted data.
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class CheckedOutputStream extends java.io.FilterOutputStream {
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final Checksum check;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code CheckedOutputStream} on {@code OutputStream}
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code os}. The checksum is calculated using the algorithm implemented
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * by {@code csum}.
37f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson     *
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param os
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the output stream to calculate checksum for.
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param cs
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            an entity implementing the checksum algorithm.
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CheckedOutputStream(OutputStream os, Checksum cs) {
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(os);
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        check = cs;
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the checksum calculated on the stream read so far.
50f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson     *
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the updated checksum.
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Checksum getChecksum() {
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return check;
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Writes the specified byte to the underlying stream. The checksum is
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * updated with {@code val}.
60f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson     *
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param val
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the data value to written to the output stream.
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an IO error has occurred.
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void write(int val) throws IOException {
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        out.write(val);
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        check.update(val);
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Writes n bytes of data from {@code buf} starting at offset {@code off} to
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the underlying stream. The checksum is updated with the bytes written.
75f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson     *
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buf
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            data written to the output stream.
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param off
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the offset to start reading the data from {@code buf} written
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            to the output stream.
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param nbytes
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            number of bytes to write to the output stream.
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an IO error has occurred.
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void write(byte[] buf, int off, int nbytes) throws IOException {
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        out.write(buf, off, nbytes);
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        check.update(buf, off, nbytes);
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
92