BizHawk/BizHawk.Client.Common/miniz/MinizZipWriter.cs

71 lines
1.7 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace BizHawk.Client.Common.Miniz
{
public class MinizZipWriter : IZipWriter
{
private IntPtr _zip;
private uint _flags;
private static readonly byte[] _shitcock = new byte[32 * 1024 * 1024];
/// <exception cref="InvalidOperationException">unmanaged call failed</exception>
public MinizZipWriter(string path, int compressionlevel)
{
_zip = Marshal.AllocHGlobal(128);
unsafe
{
var p = (int*)_zip;
for (int i = 0; i < 32; i++)
p[i] = 0;
}
if (!LibMiniz.mz_zip_writer_init_file(_zip, path, 0))
{
Marshal.FreeHGlobal(_zip);
_zip = IntPtr.Zero;
throw new InvalidOperationException("mz_zip_writer_init_file returned FALSE");
}
_flags = (uint)compressionlevel;
}
void IDisposable.Dispose()
{
Dispose();
GC.SuppressFinalize(this);
}
~MinizZipWriter()
{
Dispose();
}
private void Dispose()
{
if (_zip != IntPtr.Zero)
{
if (LibMiniz.mz_zip_writer_finalize_archive(_zip))
LibMiniz.mz_zip_writer_end(_zip);
Marshal.FreeHGlobal(_zip);
_zip = IntPtr.Zero;
}
}
/// <exception cref="InvalidOperationException">unmanaged call failed</exception>
public void WriteItem(string name, Action<Stream> callback)
{
lock (_shitcock)
{
var ms = new MemoryStream(_shitcock);
callback(ms);
if (!LibMiniz.mz_zip_writer_add_mem(_zip, name, _shitcock /*ms.GetBuffer()*/, (ulong)ms.Position, _flags))
throw new InvalidOperationException("mz_zip_writer_add_mem returned FALSE");
}
}
}
}