| /* |
| * IndexEncoder |
| * |
| * Author: Lasse Collin <lasse.collin@tukaani.org> |
| * |
| * This file has been put into the public domain. |
| * You can do whatever you want with this file. |
| */ |
| |
| package org.tukaani.xz.index; |
| |
| import java.io.OutputStream; |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.zip.CheckedOutputStream; |
| import org.tukaani.xz.common.EncoderUtil; |
| import org.tukaani.xz.XZIOException; |
| |
| public class IndexEncoder extends IndexBase { |
| private final ArrayList records = new ArrayList(); |
| |
| public IndexEncoder() { |
| super(new XZIOException("XZ Stream or its Index has grown too big")); |
| } |
| |
| public void add(long unpaddedSize, long uncompressedSize) |
| throws XZIOException { |
| super.add(unpaddedSize, uncompressedSize); |
| records.add(new IndexRecord(unpaddedSize, uncompressedSize)); |
| } |
| |
| public void encode(OutputStream out) throws IOException { |
| java.util.zip.CRC32 crc32 = new java.util.zip.CRC32(); |
| CheckedOutputStream outChecked = new CheckedOutputStream(out, crc32); |
| |
| // Index Indicator |
| outChecked.write(0x00); |
| |
| // Number of Records |
| EncoderUtil.encodeVLI(outChecked, recordCount); |
| |
| // List of Records |
| for (Iterator i = records.iterator(); i.hasNext(); ) { |
| IndexRecord record = (IndexRecord)i.next(); |
| EncoderUtil.encodeVLI(outChecked, record.unpadded); |
| EncoderUtil.encodeVLI(outChecked, record.uncompressed); |
| } |
| |
| // Index Padding |
| for (int i = getIndexPaddingSize(); i > 0; --i) |
| outChecked.write(0x00); |
| |
| // CRC32 |
| long value = crc32.getValue(); |
| for (int i = 0; i < 4; ++i) |
| out.write((byte)(value >>> (i * 8))); |
| } |
| } |