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
20b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughesimport java.util.Arrays;
21b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The Adler-32 class is used to compute the {@code Adler32} checksum from a set
2499c59bfa432e36933a7a5033fba8b89209f737bcElliott Hughes * of data. Compared to {@link CRC32} it trades reliability for speed.
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Refer to RFC 1950 for the specification.
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
27a5d31fa2ea5c9d3de6ac05ae4250f931bed2d445Elliott Hughespublic class Adler32 implements Checksum {
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private long adler = 1;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Adler32} checksum for all input received.
33f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson     *
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return The checksum for this instance.
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getValue() {
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return adler;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reset this instance to its initial checksum.
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void reset() {
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        adler = 1;
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Update this {@code Adler32} checksum with the single byte provided as
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * argument.
50f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson     *
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the byte to update checksum with.
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void update(int i) {
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        adler = updateByteImpl(i, adler);
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Update this {@code Adler32} checksum using the contents of {@code buf}.
60f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson     *
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buf
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            bytes to update checksum with.
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void update(byte[] buf) {
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        update(buf, 0, buf.length);
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Update this {@code Adler32} checksum with the contents of {@code buf},
70b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes     * starting from {@code offset} and reading {@code byteCount} bytes of data.
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
72b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes    public void update(byte[] buf, int offset, int byteCount) {
73b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes        Arrays.checkOffsetAndCount(buf.length, offset, byteCount);
74b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes        adler = updateImpl(buf, offset, byteCount, adler);
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
77b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes    private native long updateImpl(byte[] buf, int offset, int byteCount, long adler1);
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native long updateByteImpl(int val, long adler1);
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
81