public override void Finish()
{
if (this.entries == null)
{
return;
}
if (this.curEntry != null)
{
this.CloseEntry();
}
long noOfEntries = (long)this.entries.Count;
long num = 0L;
foreach (ZipEntry zipEntry in this.entries)
{
this.WriteLeInt(33639248);
this.WriteLeShort(51);
this.WriteLeShort(zipEntry.Version);
this.WriteLeShort(zipEntry.Flags);
this.WriteLeShort((int)((short)zipEntry.CompressionMethodForHeader));
this.WriteLeInt((int)zipEntry.DosTime);
this.WriteLeInt((int)zipEntry.Crc);
if (zipEntry.IsZip64Forced() || zipEntry.CompressedSize >= (long)((ulong)-1))
{
this.WriteLeInt(-1);
}
else
{
this.WriteLeInt((int)zipEntry.CompressedSize);
}
if (zipEntry.IsZip64Forced() || zipEntry.Size >= (long)((ulong)-1))
{
this.WriteLeInt(-1);
}
else
{
this.WriteLeInt((int)zipEntry.Size);
}
byte[] array = ZipConstants.ConvertToArray(zipEntry.Flags, zipEntry.Name);
if (array.Length > 65535)
{
throw new ZipException("Name too long.");
}
ZipExtraData zipExtraData = new ZipExtraData(zipEntry.ExtraData);
if (zipEntry.CentralHeaderRequiresZip64)
{
zipExtraData.StartNewEntry();
if (zipEntry.IsZip64Forced() || zipEntry.Size >= (long)((ulong)-1))
{
zipExtraData.AddLeLong(zipEntry.Size);
}
if (zipEntry.IsZip64Forced() || zipEntry.CompressedSize >= (long)((ulong)-1))
{
zipExtraData.AddLeLong(zipEntry.CompressedSize);
}
if (zipEntry.Offset >= (long)((ulong)-1))
{
zipExtraData.AddLeLong(zipEntry.Offset);
}
zipExtraData.AddNewEntry(1);
}
else
{
zipExtraData.Delete(1);
}
if (zipEntry.AESKeySize > 0)
{
ZipOutputStream.AddExtraDataAES(zipEntry, zipExtraData);
}
byte[] entryData = zipExtraData.GetEntryData();
byte[] array2 = (zipEntry.Comment == null) ? new byte[0] : ZipConstants.ConvertToArray(zipEntry.Flags, zipEntry.Comment);
if (array2.Length > 65535)
{
throw new ZipException("Comment too long.");
}
this.WriteLeShort(array.Length);
this.WriteLeShort(entryData.Length);
this.WriteLeShort(array2.Length);
this.WriteLeShort(0);
this.WriteLeShort(0);
if (zipEntry.ExternalFileAttributes != -1)
{
this.WriteLeInt(zipEntry.ExternalFileAttributes);
}
else if (zipEntry.IsDirectory)
{
this.WriteLeInt(16);
}
else
{
this.WriteLeInt(0);
}
if (zipEntry.Offset >= (long)((ulong)-1))
{
this.WriteLeInt(-1);
}
else
{
this.WriteLeInt((int)zipEntry.Offset);
}
if (array.Length > 0)
{
this.baseOutputStream_.Write(array, 0, array.Length);
}
if (entryData.Length > 0)
{
this.baseOutputStream_.Write(entryData, 0, entryData.Length);
}
if (array2.Length > 0)
{
this.baseOutputStream_.Write(array2, 0, array2.Length);
}
num += (long)(46 + array.Length + entryData.Length + array2.Length);
}
using (ZipHelperStream zipHelperStream = new ZipHelperStream(this.baseOutputStream_))
{
zipHelperStream.WriteEndOfCentralDirectory(noOfEntries, num, this.offset, this.zipComment);
}
this.entries = null;
}