Example usage for org.apache.commons.compress.utils CRC32VerifyingInputStream CRC32VerifyingInputStream

List of usage examples for org.apache.commons.compress.utils CRC32VerifyingInputStream CRC32VerifyingInputStream

Introduction

In this page you can find the example usage for org.apache.commons.compress.utils CRC32VerifyingInputStream CRC32VerifyingInputStream.

Prototype

public CRC32VerifyingInputStream(final InputStream in, final long size, final long expectedCrc32) 

Source Link

Usage

From source file:bobs.is.compress.sevenzip.SevenZFile.java

private StartHeader readStartHeader(final long startHeaderCrc) throws IOException {
    final StartHeader startHeader = new StartHeader();
    DataInputStream dataInputStream = null;
    try {//from w ww . j  a  v a 2s.c om
        dataInputStream = new DataInputStream(new CRC32VerifyingInputStream(
                new BoundedRandomAccessFileInputStream(file, 20), 20, startHeaderCrc));
        startHeader.nextHeaderOffset = Long.reverseBytes(dataInputStream.readLong());
        startHeader.nextHeaderSize = Long.reverseBytes(dataInputStream.readLong());
        startHeader.nextHeaderCrc = 0xffffFFFFL & Integer.reverseBytes(dataInputStream.readInt());
        return startHeader;
    } finally {
        if (dataInputStream != null) {
            dataInputStream.close();
        }
    }
}

From source file:bobs.is.compress.sevenzip.SevenZFile.java

private DataInputStream readEncodedHeader(final DataInputStream header, final Archive archive,
        final byte[] password) throws IOException {
    readStreamsInfo(header, archive);/* w w w.j  ava  2  s .c  om*/

    // FIXME: merge with buildDecodingStream()/buildDecoderStack() at some stage?
    final Folder folder = archive.folders[0];
    final int firstPackStreamIndex = 0;
    final long folderOffset = SIGNATURE_HEADER_SIZE + archive.packPos + 0;

    file.seek(folderOffset);
    InputStream inputStreamStack = new BoundedRandomAccessFileInputStream(file,
            archive.packSizes[firstPackStreamIndex]);
    for (final Coder coder : folder.getOrderedCoders()) {
        if (coder.numInStreams != 1 || coder.numOutStreams != 1) {
            throw new IOException("Multi input/output stream coders are not yet supported");
        }
        inputStreamStack = Coders.addDecoder(fileName, inputStreamStack, folder.getUnpackSizeForCoder(coder),
                coder, password);
    }
    if (folder.hasCrc) {
        inputStreamStack = new CRC32VerifyingInputStream(inputStreamStack, folder.getUnpackSize(), folder.crc);
    }
    final byte[] nextHeader = new byte[(int) folder.getUnpackSize()];
    final DataInputStream nextHeaderInputStream = new DataInputStream(inputStreamStack);
    try {
        nextHeaderInputStream.readFully(nextHeader);
    } finally {
        nextHeaderInputStream.close();
    }
    return new DataInputStream(new ByteArrayInputStream(nextHeader));
}

From source file:bobs.is.compress.sevenzip.SevenZFile.java

public InputStream getStreamByIndex(int entryIndex) throws IOException {
    final int folderIndex = getArchive().streamMap.fileFolderIndex[entryIndex];
    if (folderIndex < 0) {
        getDeferredBlockStreams().clear();
        // TODO: previously it'd return an empty stream?
        // new BoundedInputStream(new ByteArrayInputStream(new byte[0]), 0);
        return null;
    }//from  ww  w .  j  a  va 2 s  .  c o  m
    final SevenZArchiveEntry file = getArchive().files[entryIndex];
    if (getCurrentFolderIndex() == folderIndex) {
        // (COMPRESS-320).
        // The current entry is within the same (potentially opened) folder. The
        // previous stream has to be fully decoded before we can start reading
        // but don't do it eagerly -- if the user skips over the entire folder nothing
        // is effectively decompressed.

        file.setContentMethods(getArchive().files[entryIndex - 1].getContentMethods());
    } else {
        // We're opening a new folder. Discard any queued streams/ folder stream.
        currentFolderIndex = folderIndex;
        getDeferredBlockStreams().clear();
        if (currentFolderInputStream != null) {
            currentFolderInputStream.close();
            currentFolderInputStream = null;
        }

        final Folder folder = getArchive().folders[folderIndex];
        final int firstPackStreamIndex = getArchive().streamMap.folderFirstPackStreamIndex[folderIndex];
        final long folderOffset = SIGNATURE_HEADER_SIZE + getArchive().packPos
                + getArchive().streamMap.packStreamOffsets[firstPackStreamIndex];
        currentFolderInputStream = buildDecoderStack(folder, folderOffset, firstPackStreamIndex, file);
    }

    InputStream fileStream = new BoundedInputStream(currentFolderInputStream, file.getSize());
    if (file.getHasCrc()) {
        fileStream = new CRC32VerifyingInputStream(fileStream, file.getSize(), file.getCrcValue());
    }

    getDeferredBlockStreams().add(fileStream);
    return fileStream;
}

From source file:bobs.is.compress.sevenzip.SevenZFile.java

private void buildDecodingStream() throws IOException {
    final int folderIndex = getArchive().streamMap.fileFolderIndex[getCurrentEntryIndex()];
    if (folderIndex < 0) {
        getDeferredBlockStreams().clear();
        // TODO: previously it'd return an empty stream?
        // new BoundedInputStream(new ByteArrayInputStream(new byte[0]), 0);
        return;/*from   w w w.jav  a  2s.com*/
    }
    final SevenZArchiveEntry file = getArchive().files[getCurrentEntryIndex()];
    if (getCurrentFolderIndex() == folderIndex) {
        // (COMPRESS-320).
        // The current entry is within the same (potentially opened) folder. The
        // previous stream has to be fully decoded before we can start reading
        // but don't do it eagerly -- if the user skips over the entire folder nothing
        // is effectively decompressed.

        file.setContentMethods(getArchive().files[getCurrentEntryIndex() - 1].getContentMethods());
    } else {
        // We're opening a new folder. Discard any queued streams/ folder stream.
        currentFolderIndex = folderIndex;
        getDeferredBlockStreams().clear();
        if (currentFolderInputStream != null) {
            currentFolderInputStream.close();
            currentFolderInputStream = null;
        }

        final Folder folder = getArchive().folders[folderIndex];
        final int firstPackStreamIndex = getArchive().streamMap.folderFirstPackStreamIndex[folderIndex];
        final long folderOffset = SIGNATURE_HEADER_SIZE + getArchive().packPos
                + getArchive().streamMap.packStreamOffsets[firstPackStreamIndex];
        currentFolderInputStream = buildDecoderStack(folder, folderOffset, firstPackStreamIndex, file);
    }

    InputStream fileStream = new BoundedInputStream(currentFolderInputStream, file.getSize());
    if (file.getHasCrc()) {
        fileStream = new CRC32VerifyingInputStream(fileStream, file.getSize(), file.getCrcValue());
    }

    getDeferredBlockStreams().add(fileStream);
}

From source file:bobs.is.compress.sevenzip.SevenZFile.java

private InputStream buildDecoderStack(final Folder folder, final long folderOffset,
        final int firstPackStreamIndex, final SevenZArchiveEntry entry) throws IOException {
    file.seek(folderOffset);//from   www . j  a v  a 2 s .  c  om
    InputStream inputStreamStack = new BufferedInputStream(
            new BoundedRandomAccessFileInputStream(file, getArchive().packSizes[firstPackStreamIndex]));
    final LinkedList<SevenZMethodConfiguration> methods = new LinkedList<SevenZMethodConfiguration>();
    for (final Coder coder : folder.getOrderedCoders()) {
        if (coder.numInStreams != 1 || coder.numOutStreams != 1) {
            throw new IOException("Multi input/output stream coders are not yet supported");
        }
        final SevenZMethod method = SevenZMethod.byId(coder.decompressionMethodId);
        inputStreamStack = Coders.addDecoder(fileName, inputStreamStack, folder.getUnpackSizeForCoder(coder),
                coder, password);
        methods.addFirst(new SevenZMethodConfiguration(method,
                Coders.findByMethod(method).getOptionsFromCoder(coder, inputStreamStack)));
    }
    entry.setContentMethods(methods);
    if (folder.hasCrc) {
        return new CRC32VerifyingInputStream(inputStreamStack, folder.getUnpackSize(), folder.crc);
    }
    return inputStreamStack;
}

From source file:srebrinb.compress.sevenzip.SevenZFile.java

private StartHeader readStartHeader(final long startHeaderCrc) throws IOException {
    final StartHeader startHeader = new StartHeader();
    // using Stream rather than ByteBuffer for the benefit of the
    // built-in CRC check
    try (DataInputStream dataInputStream = new DataInputStream(new CRC32VerifyingInputStream(
            new BoundedSeekableByteChannelInputStream(channel, 20), 20, startHeaderCrc))) {
        startHeader.nextHeaderOffset = Long.reverseBytes(dataInputStream.readLong());
        startHeader.nextHeaderSize = Long.reverseBytes(dataInputStream.readLong());
        startHeader.nextHeaderCrc = 0xffffFFFFL & Integer.reverseBytes(dataInputStream.readInt());
        return startHeader;
    }/* w  w  w.jav  a  2 s.c  o  m*/
}

From source file:srebrinb.compress.sevenzip.SevenZFile.java

private ByteBuffer readEncodedHeader(final ByteBuffer header, final Archive archive, final byte[] password)
        throws IOException {
    readStreamsInfo(header, archive);/*from   w  w  w .  ja v a2  s.c  om*/

    // FIXME: merge with buildDecodingStream()/buildDecoderStack() at some stage?
    final Folder folder = archive.folders[0];
    final int firstPackStreamIndex = 0;
    final long folderOffset = SIGNATURE_HEADER_SIZE + archive.packPos + 0;

    channel.position(folderOffset);
    InputStream inputStreamStack = new BoundedSeekableByteChannelInputStream(channel,
            archive.packSizes[firstPackStreamIndex]);
    for (final Coder coder : folder.getOrderedCoders()) {
        if (coder.numInStreams != 1 || coder.numOutStreams != 1) {
            throw new IOException("Multi input/output stream coders are not yet supported");
        }
        inputStreamStack = Coders.addDecoder(fileName, inputStreamStack, //NOSONAR
                folder.getUnpackSizeForCoder(coder), coder, password);
    }
    if (folder.hasCrc) {
        inputStreamStack = new CRC32VerifyingInputStream(inputStreamStack, folder.getUnpackSize(), folder.crc);
    }
    final byte[] nextHeader = new byte[(int) folder.getUnpackSize()];
    try (DataInputStream nextHeaderInputStream = new DataInputStream(inputStreamStack)) {
        nextHeaderInputStream.readFully(nextHeader);
    }
    return ByteBuffer.wrap(nextHeader).order(ByteOrder.LITTLE_ENDIAN);
}

From source file:srebrinb.compress.sevenzip.SevenZFile.java

private void buildDecodingStream() throws IOException {
    final int folderIndex = archive.streamMap.fileFolderIndex[currentEntryIndex];
    if (folderIndex < 0) {
        deferredBlockStreams.clear();//w  w  w . ja v a  2  s.c om
        // TODO: previously it'd return an empty stream?
        // new BoundedInputStream(new ByteArrayInputStream(new byte[0]), 0);
        return;
    }
    final SevenZArchiveEntry file = archive.files[currentEntryIndex];
    if (currentFolderIndex == folderIndex) {
        // (COMPRESS-320).
        // The current entry is within the same (potentially opened) folder. The
        // previous stream has to be fully decoded before we can start reading
        // but don't do it eagerly -- if the user skips over the entire folder nothing
        // is effectively decompressed.

        file.setContentMethods(archive.files[currentEntryIndex - 1].getContentMethods());
    } else {
        // We're opening a new folder. Discard any queued streams/ folder stream.
        currentFolderIndex = folderIndex;
        deferredBlockStreams.clear();
        if (currentFolderInputStream != null) {
            currentFolderInputStream.close();
            currentFolderInputStream = null;
        }

        final Folder folder = archive.folders[folderIndex];
        final int firstPackStreamIndex = archive.streamMap.folderFirstPackStreamIndex[folderIndex];
        final long folderOffset = SIGNATURE_HEADER_SIZE + archive.packPos
                + archive.streamMap.packStreamOffsets[firstPackStreamIndex];
        currentFolderInputStream = buildDecoderStack(folder, folderOffset, firstPackStreamIndex, file);
    }

    InputStream fileStream = new BoundedInputStream(currentFolderInputStream, file.getSize());
    if (file.getHasCrc()) {
        fileStream = new CRC32VerifyingInputStream(fileStream, file.getSize(), file.getCrcValue());
    }

    deferredBlockStreams.add(fileStream);
}

From source file:srebrinb.compress.sevenzip.SevenZFile.java

private InputStream buildDecoderStack(final Folder folder, final long folderOffset,
        final int firstPackStreamIndex, final SevenZArchiveEntry entry) throws IOException {
    channel.position(folderOffset);/*from  www.  j av a  2  s. co m*/
    InputStream inputStreamStack = new BufferedInputStream(
            new BoundedSeekableByteChannelInputStream(channel, archive.packSizes[firstPackStreamIndex]));
    final LinkedList<SevenZMethodConfiguration> methods = new LinkedList<>();
    for (final Coder coder : folder.getOrderedCoders()) {
        if (coder.numInStreams != 1 || coder.numOutStreams != 1) {
            throw new IOException("Multi input/output stream coders are not yet supported");
        }
        final SevenZMethod method = SevenZMethod.byId(coder.decompressionMethodId);
        inputStreamStack = Coders.addDecoder(fileName, inputStreamStack, folder.getUnpackSizeForCoder(coder),
                coder, password);
        methods.addFirst(new SevenZMethodConfiguration(method,
                Coders.findByMethod(method).getOptionsFromCoder(coder, inputStreamStack)));
    }
    entry.setContentMethods(methods);
    if (folder.hasCrc) {
        return new CRC32VerifyingInputStream(inputStreamStack, folder.getUnpackSize(), folder.crc);
    }
    return inputStreamStack;
}