public unsafe Reference Finish(string filename)
{
// Release memory
workerThread.WaitUntilDoneAndExit();
StreamPool.Release(ref WriteBuffer);
hashesLookup = new Dictionary<Hash, int>();
stringsLookup = new Dictionary<string, int>();
stats.Status = "Writing metadata";
stats.Progress = 0;
// Write info
{
Info info = new Info() {
Version = new Version { Major = Settings.VersionMajor, Minor = Settings.VersionMinor },
CreatedBy = "DeltaZip",
CreatedOn = DateTime.Now,
Comment = null
};
ZipEntry entry = zipStream.PutNextEntry(Path.Combine(Settings.MetaDataDir, Settings.MetaDataInfo));
entry.CompressionLevel = (CompressionLevel)Settings.CompressionLevel;
new XmlSerializer(typeof(Info)).Serialize(new StreamWriter(zipStream, Encoding.UTF8), info);
}
// Write file list
{
ZipEntry entry = zipStream.PutNextEntry(Path.Combine(Settings.MetaDataDir, Settings.MetaDataFiles));
entry.CompressionLevel = (CompressionLevel)Settings.CompressionLevel;
Util.FileSerializer.Serialize(new StreamWriter(zipStream, Encoding.UTF8), files);
// Release memory
files = new List<File>();
}
// Write hashes
HashSource[] hashesCopy;
{
// Sort
hashesCopy = hashes.ToArray();
hashes = null;
MemoryStream memStream = new MemoryStream();
Util.WriteArray(memStream, hashesCopy);
ZipEntry entry = zipStream.PutNextEntry(Path.Combine(Settings.MetaDataDir, Settings.MetaDataHashes));
entry.CompressionLevel = Settings.CompressHashes ? (CompressionLevel)Settings.CompressionLevel : CompressionLevel.None;
memStream.WriteTo(zipStream);
}
// Write strings
{
MemoryStream memStream = new MemoryStream();
Util.WriteStream(memStream, strings);
ZipEntry entry = zipStream.PutNextEntry(Path.Combine(Settings.MetaDataDir, Settings.MetaDataStrings));
entry.CompressionLevel = (CompressionLevel)Settings.CompressionLevel;
memStream.WriteTo(zipStream);
}
zipStream.Close();
stats.Status = stats.Canceled ? "Canceled" : "Finished";
stats.EndTime = DateTime.Now;
Array.Sort(hashesCopy);
return new Reference(filename, hashesCopy, strings);
}