Newer
Older
KeeperJerry_Launcher / Launcher / source / hasher / HashedFile.java
package launcher.hasher;

import java.io.IOException;
import java.nio.file.Path;
import java.util.Arrays;

import launcher.LauncherAPI;
import launcher.helper.IOHelper;
import launcher.helper.SecurityHelper;
import launcher.helper.SecurityHelper.DigestAlgorithm;
import launcher.helper.VerifyHelper;
import launcher.serialize.HInput;
import launcher.serialize.HOutput;

public final class HashedFile extends HashedEntry {
    private static final byte[] DUMMY_HASH = new byte[0];

    // Instance
    @LauncherAPI public final long size;
    private final byte[] digest;

    @LauncherAPI
    public HashedFile(long size, byte[] digest) {
        this.size = VerifyHelper.verifyLong(size, VerifyHelper.L_NOT_NEGATIVE, "Illegal size: " + size);
        this.digest = Arrays.copyOf(digest, digest.length);
    }

    @LauncherAPI
    public HashedFile(Path file, long size, boolean hash) throws IOException {
        this(size, hash ? SecurityHelper.digest(DigestAlgorithm.MD5, file) : DUMMY_HASH);
    }

    @LauncherAPI
    public HashedFile(HInput input) throws IOException {
        this(input.readVarLong(), input.readByteArray(SecurityHelper.CRYPTO_MAX_LENGTH));
    }

    @Override
    public Type getType() {
        return Type.FILE;
    }

    @Override
    public long size() {
        return size;
    }

    @Override
    public void write(HOutput output) throws IOException {
        output.writeVarLong(size);
        output.writeByteArray(digest, SecurityHelper.CRYPTO_MAX_LENGTH);
    }

    @LauncherAPI
    public boolean isSame(HashedFile o) {
        return size == o.size && Arrays.equals(digest, o.digest);
    }

    @LauncherAPI
    public boolean isSame(Path file) throws IOException {
        return isSame(new HashedFile(file, IOHelper.readAttributes(file).size(), true));
    }

    @LauncherAPI
    public boolean isSameDigest(byte[] digest) {
        return Arrays.equals(this.digest, digest);
    }
}