decodeStream method

void decodeStream(
  1. InputStreamBase input,
  2. OutputStreamBase output, {
  3. bool verify = false,
})

Implementation

void decodeStream(InputStreamBase input, OutputStreamBase output,
    {bool verify = false}) {
  final br = Bz2BitReader(input);

  _groupPos = 0;
  _groupNo = 0;
  _gSel = 0;
  _gMinlen = 0;

  if (br.readByte() != BZip2.bzhSignature[0] ||
      br.readByte() != BZip2.bzhSignature[1] ||
      br.readByte() != BZip2.bzhSignature[2]) {
    throw ArchiveException('Invalid Signature');
  }

  _blockSize100k = br.readByte() - BZip2.hdr0;
  if (_blockSize100k < 0 || _blockSize100k > 9) {
    throw ArchiveException('Invalid BlockSize');
  }

  _tt = Uint32List(_blockSize100k * 100000);

  var combinedCrc = 0;

  while (true) {
    final type = _readBlockType(br);
    if (type == blockCompressed) {
      var storedBlockCrc = 0;
      storedBlockCrc = (storedBlockCrc << 8) | br.readByte();
      storedBlockCrc = (storedBlockCrc << 8) | br.readByte();
      storedBlockCrc = (storedBlockCrc << 8) | br.readByte();
      storedBlockCrc = (storedBlockCrc << 8) | br.readByte();

      var blockCrc = _readCompressed(br, output);
      blockCrc = BZip2.finalizeCrc(blockCrc);

      if (verify && blockCrc != storedBlockCrc) {
        throw ArchiveException('Invalid block checksum.');
      }
      combinedCrc = ((combinedCrc << 1) | (combinedCrc >> 31)) & 0xffffffff;
      combinedCrc ^= blockCrc;
    } else if (type == blockEos) {
      var storedCrc = 0;
      storedCrc = (storedCrc << 8) | br.readByte();
      storedCrc = (storedCrc << 8) | br.readByte();
      storedCrc = (storedCrc << 8) | br.readByte();
      storedCrc = (storedCrc << 8) | br.readByte();

      if (verify && storedCrc != combinedCrc) {
        throw ArchiveException(
            'Invalid combined checksum: $combinedCrc : $storedCrc');
      }

      output.flush();
      return;
    }
  }
}