internal void FinishOutputStream(Stream s,
CountingStream entryCounter,
Stream encryptor,
Stream compressor,
Crisis.Ionic.Crc.CrcCalculatorStream output)
{
if (output == null) return;
output.Close();
// by calling Close() on the deflate stream, we write the footer bytes, as necessary.
if ((compressor as Crisis.Ionic.Zlib.DeflateStream) != null)
compressor.Close();
#if BZIP
else if ((compressor as Ionic.BZip2.BZip2OutputStream) != null)
compressor.Close();
#if !NETCF
else if ((compressor as Ionic.BZip2.ParallelBZip2OutputStream) != null)
compressor.Close();
#endif
#endif
#if !NETCF
else if ((compressor as Crisis.Ionic.Zlib.ParallelDeflateOutputStream) != null)
compressor.Close();
#endif
encryptor.Flush();
encryptor.Close();
_LengthOfTrailer = 0;
_UncompressedSize = output.TotalBytesSlurped;
#if AESCRYPTO
WinZipAesCipherStream wzacs = encryptor as WinZipAesCipherStream;
if (wzacs != null && _UncompressedSize > 0)
{
s.Write(wzacs.FinalAuthentication, 0, 10);
_LengthOfTrailer += 10;
}
#endif
_CompressedFileDataSize = entryCounter.BytesWritten;
_CompressedSize = _CompressedFileDataSize; // may be adjusted
_Crc32 = output.Crc;
// Set _RelativeOffsetOfLocalHeader now, to allow for re-streaming
StoreRelativeOffset();
}