Example #1
0
        public void OnWritingCompleted(ArchiveEntry entry, MemoryStream ms, bool?compression)
        {
            ms.Position = 0;

            int compressedSize   = 0;
            int uncompressedSize = (int)ms.Length;

            byte[] copyBuff = new byte[Math.Min(uncompressedSize, 32 * 1024)];

            try
            {
                bool compress = uncompressedSize > 256 && (compression ?? entry.IsCompressed);
                if (compress)
                {
                    using (SafeUnmanagedArray buff = new SafeUnmanagedArray(uncompressedSize + 256))
                        using (UnmanagedMemoryStream buffStream = buff.OpenStream(FileAccess.ReadWrite))
                        {
                            compressedSize = ZLibHelper.Compress(ms, buffStream, uncompressedSize);
                            if (uncompressedSize - compressedSize > 256)
                            {
                                using (Stream output = OpenOrAppendBinary(entry, compressedSize))
                                {
                                    buffStream.Position = 0;
                                    buffStream.CopyToStream(output, compressedSize, copyBuff);
                                }
                                return;
                            }
                        }
                }

                ms.Position    = 0;
                compressedSize = uncompressedSize;
                using (Stream output = OpenOrAppendBinary(entry, uncompressedSize))
                    ms.CopyToStream(output, uncompressedSize, copyBuff);
            }
            finally
            {
                entry.Size             = compressedSize;
                entry.UncompressedSize = uncompressedSize;
            }
        }