internal static int WriteLocalHeader()

in src/ICSharpCode.SharpZipLib/Zip/ZipFormat.cs [50:159]


		internal static int WriteLocalHeader(Stream stream, ZipEntry entry, out EntryPatchData patchData, 
			bool headerInfoAvailable, bool patchEntryHeader, long streamOffset, StringCodec stringCodec)
		{
			patchData = new EntryPatchData();

			stream.WriteLEInt(ZipConstants.LocalHeaderSignature);
			stream.WriteLEShort(entry.Version);
			stream.WriteLEShort(entry.Flags);
			stream.WriteLEShort((byte)entry.CompressionMethodForHeader);
			stream.WriteLEInt((int)entry.DosTime);

			if (headerInfoAvailable)
			{
				stream.WriteLEInt((int)entry.Crc);
				if (entry.LocalHeaderRequiresZip64)
				{
					stream.WriteLEInt(-1);
					stream.WriteLEInt(-1);
				}
				else
				{
					stream.WriteLEInt((int)entry.CompressedSize + entry.EncryptionOverheadSize);
					stream.WriteLEInt((int)entry.Size);
				}
			}
			else
			{
				if (patchEntryHeader)
					patchData.CrcPatchOffset = streamOffset + stream.Position;
				
				stream.WriteLEInt(0);  // Crc

				if (patchEntryHeader)
					patchData.SizePatchOffset = streamOffset + stream.Position;

				// For local header both sizes appear in Zip64 Extended Information
				if (entry.LocalHeaderRequiresZip64 && patchEntryHeader)
				{
					stream.WriteLEInt(-1);
					stream.WriteLEInt(-1);
				}
				else
				{
					stream.WriteLEInt(0);  // Compressed size
					stream.WriteLEInt(0);  // Uncompressed size
				}
			}

			byte[] name = stringCodec.ZipOutputEncoding.GetBytes(entry.Name);

			if (name.Length > 0xFFFF)
			{
				throw new ZipException("Entry name too long.");
			}

			var ed = new ZipExtraData(entry.ExtraData);

			if (entry.LocalHeaderRequiresZip64)
			{
				ed.StartNewEntry();
				if (headerInfoAvailable)
				{
					ed.AddLeLong(entry.Size);
					ed.AddLeLong(entry.CompressedSize + entry.EncryptionOverheadSize);
				}
				else
				{
					ed.AddLeLong(-1);
					ed.AddLeLong(-1);
				}
				ed.AddNewEntry(1);

				if (!ed.Find(1))
				{
					throw new ZipException("Internal error cant find extra data");
				}

				patchData.SizePatchOffset = ed.CurrentReadIndex;
			}
			else
			{
				ed.Delete(1);
			}

			if (entry.AESKeySize > 0)
			{
				AddExtraDataAES(entry, ed);
			}
			byte[] extra = ed.GetEntryData();

			stream.WriteLEShort(name.Length);
			stream.WriteLEShort(extra.Length);

			if (name.Length > 0)
			{
				stream.Write(name, 0, name.Length);
			}

			if (entry.LocalHeaderRequiresZip64 && patchEntryHeader)
			{
				patchData.SizePatchOffset += streamOffset + stream.Position;
			}

			if (extra.Length > 0)
			{
				stream.Write(extra, 0, extra.Length);
			}

			return ZipConstants.LocalHeaderBaseSize + name.Length + extra.Length;
		}