Home | History | Annotate | Download | only in index
      1 /*
      2  * IndexBase
      3  *
      4  * Author: Lasse Collin <lasse.collin (at) tukaani.org>
      5  *
      6  * This file has been put into the public domain.
      7  * You can do whatever you want with this file.
      8  */
      9 
     10 package org.tukaani.xz.index;
     11 
     12 import org.tukaani.xz.common.Util;
     13 import org.tukaani.xz.XZIOException;
     14 
     15 abstract class IndexBase {
     16     private final XZIOException invalidIndexException;
     17     long blocksSum = 0;
     18     long uncompressedSum = 0;
     19     long indexListSize = 0;
     20     long recordCount = 0;
     21 
     22     IndexBase(XZIOException invalidIndexException) {
     23         this.invalidIndexException = invalidIndexException;
     24     }
     25 
     26     private long getUnpaddedIndexSize() {
     27         // Index Indicator + Number of Records + List of Records + CRC32
     28         return 1 + Util.getVLISize(recordCount) + indexListSize + 4;
     29     }
     30 
     31     public long getIndexSize() {
     32         return (getUnpaddedIndexSize() + 3) & ~3;
     33     }
     34 
     35     public long getStreamSize() {
     36         return Util.STREAM_HEADER_SIZE + blocksSum + getIndexSize()
     37                 + Util.STREAM_HEADER_SIZE;
     38     }
     39 
     40     int getIndexPaddingSize() {
     41         return (int)((4 - getUnpaddedIndexSize()) & 3);
     42     }
     43 
     44     void add(long unpaddedSize, long uncompressedSize) throws XZIOException {
     45         blocksSum += (unpaddedSize + 3) & ~3;
     46         uncompressedSum += uncompressedSize;
     47         indexListSize += Util.getVLISize(unpaddedSize)
     48                          + Util.getVLISize(uncompressedSize);
     49         ++recordCount;
     50 
     51         if (blocksSum < 0 || uncompressedSum < 0
     52                 || getIndexSize() > Util.BACKWARD_SIZE_MAX
     53                 || getStreamSize() < 0)
     54             throw invalidIndexException;
     55     }
     56 }
     57