// Token: 0x0600051B RID: 1307 RVA: 0x00024F38 File Offset: 0x00023138
public static bool WriteCentralDirectoryStructure(Stream s, ICollection <ZipEntry> entries, uint numSegments, Zip64Option zip64, string comment, ZipContainer container)
{
ZipSegmentedStream zipSegmentedStream = s as ZipSegmentedStream;
if (zipSegmentedStream != null)
{
zipSegmentedStream.ContiguousWrite = true;
}
long num = 0L;
using (MemoryStream memoryStream = new MemoryStream())
{
foreach (ZipEntry zipEntry in entries)
{
if (zipEntry.IncludedInMostRecentSave)
{
zipEntry.WriteCentralDirectoryEntry(memoryStream);
}
}
byte[] array = memoryStream.ToArray();
s.Write(array, 0, array.Length);
num = (long)array.Length;
}
CountingStream countingStream = s as CountingStream;
long num2 = (countingStream != null) ? countingStream.ComputedPosition : s.Position;
long num3 = num2 - num;
uint num4 = (zipSegmentedStream != null) ? zipSegmentedStream.CurrentSegment : 0u;
long num5 = num2 - num3;
int num6 = ZipOutput.CountEntries(entries);
bool flag = zip64 == Zip64Option.Always || num6 >= 65535 || num5 > (long)((ulong)-1) || num3 > (long)((ulong)-1);
byte[] array3;
if (flag)
{
if (zip64 == Zip64Option.Default)
{
StackFrame stackFrame = new StackFrame(1);
if (stackFrame.GetMethod().DeclaringType == typeof(ZipFile))
{
throw new ZipException("The archive requires a ZIP64 Central Directory. Consider setting the ZipFile.UseZip64WhenSaving property.");
}
throw new ZipException("The archive requires a ZIP64 Central Directory. Consider setting the ZipOutputStream.EnableZip64 property.");
}
else
{
byte[] array2 = ZipOutput.GenZip64EndOfCentralDirectory(num3, num2, num6, numSegments);
array3 = ZipOutput.GenCentralDirectoryFooter(num3, num2, zip64, num6, comment, container);
if (num4 != 0u)
{
uint value = zipSegmentedStream.ComputeSegment(array2.Length + array3.Length);
int num7 = 16;
Array.Copy(BitConverter.GetBytes(value), 0, array2, num7, 4);
num7 += 4;
Array.Copy(BitConverter.GetBytes(value), 0, array2, num7, 4);
num7 = 60;
Array.Copy(BitConverter.GetBytes(value), 0, array2, num7, 4);
num7 += 4;
num7 += 8;
Array.Copy(BitConverter.GetBytes(value), 0, array2, num7, 4);
}
s.Write(array2, 0, array2.Length);
}
}
else
{
array3 = ZipOutput.GenCentralDirectoryFooter(num3, num2, zip64, num6, comment, container);
}
if (num4 != 0u)
{
ushort value2 = (ushort)zipSegmentedStream.ComputeSegment(array3.Length);
int num8 = 4;
Array.Copy(BitConverter.GetBytes(value2), 0, array3, num8, 2);
num8 += 2;
Array.Copy(BitConverter.GetBytes(value2), 0, array3, num8, 2);
num8 += 2;
}
s.Write(array3, 0, array3.Length);
if (zipSegmentedStream != null)
{
zipSegmentedStream.ContiguousWrite = false;
}
return(flag);
}