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