Example #1
0
        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;
        }