public virtual void Assemble(FlashWriter output, CompressionKind compression, Action <TagItem> callback) { output.Write(((char)compression) + "WS", true); output.Write(Version); output.Write(uint.MinValue); int fileLength = 8; FlashWriter compressor = null; switch (compression) { case CompressionKind.LZMA: { compressor = new FlashWriter((int)FileLength); break; } case CompressionKind.ZLIB: { compressor = ZLIB.WrapCompressor(output.BaseStream, true); break; } } /* Body Start */ Frame.WriteTo(compressor ?? output); fileLength += (Frame.Area.GetByteSize() + 4); for (int i = 0; i < Tags.Count; i++) { TagItem tag = Tags[i]; callback?.Invoke(tag); WriteTag(tag, compressor ?? output); fileLength += tag.Header.Length; fileLength += (tag.Header.IsLongTag ? 6 : 2); } if (compression == CompressionKind.LZMA) { byte[] uncompressedBody = ((MemoryStream)compressor.BaseStream).ToArray(); byte[] compressedBody = LZMA.Compress(uncompressedBody); output.Write(compressedBody); } compressor?.Dispose(); /* Body End */ output.Position = 4; output.Write((uint)fileLength); output.Position = output.Length; }