11d96b51e7f1e0a9d8cfa88f12dfe7cdb46d07634Jesse Wilson/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the License.  You may obtain a copy of the License at
81d96b51e7f1e0a9d8cfa88f12dfe7cdb46d07634Jesse Wilson *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
101d96b51e7f1e0a9d8cfa88f12dfe7cdb46d07634Jesse Wilson *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.util.zip;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The Adler-32 class is used to compute the {@code Adler32} checksum from a set
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of data. Compared to the CRC-32 algorithm it trades reliabilty for speed.
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Refer to RFC 1950 for the specification.
24407a2013b289b6b0e860b4275671b7b0194c42fcJesse Wilson *
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see CRC32
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Adler32 implements java.util.zip.Checksum {
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private long adler = 1;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the {@code Adler32} checksum for all input received.
331d96b51e7f1e0a9d8cfa88f12dfe7cdb46d07634Jesse Wilson     *
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The checksum for this instance.
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long getValue() {
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return adler;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reset this instance to its initial checksum.
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void reset() {
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        adler = 1;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Update this {@code Adler32} checksum with the single byte provided as
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * argument.
501d96b51e7f1e0a9d8cfa88f12dfe7cdb46d07634Jesse Wilson     *
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param i
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the byte to update checksum with.
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void update(int i) {
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        adler = updateByteImpl(i, adler);
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Update this {@code Adler32} checksum using the contents of {@code buf}.
601d96b51e7f1e0a9d8cfa88f12dfe7cdb46d07634Jesse Wilson     *
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param buf
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            bytes to update checksum with.
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void update(byte[] buf) {
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        update(buf, 0, buf.length);
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Update this {@code Adler32} checksum with the contents of {@code buf},
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * starting from the offset provided and reading n bytes of data.
711d96b51e7f1e0a9d8cfa88f12dfe7cdb46d07634Jesse Wilson     *
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param buf
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            buffer to obtain data from.
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param off
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            offset in {@code buf} to start reading from.
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param nbytes
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            number of bytes from {@code buf} to use.
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if {@code offset > buf.length} or {@code nbytes} is negative
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             or {@code offset + nbytes > buf.length}.
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void update(byte[] buf, int off, int nbytes) {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // avoid int overflow, check null buf
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (off <= buf.length && nbytes >= 0 && off >= 0
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                && buf.length - off >= nbytes) {
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            adler = updateImpl(buf, off, nbytes, adler);
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new ArrayIndexOutOfBoundsException();
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private native long updateImpl(byte[] buf, int off, int nbytes, long adler1);
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private native long updateByteImpl(int val, long adler1);
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
96