private static async Task SaveSync(MS2CryptoMode cryptoMode, MS2File[] files, Stream headerStream, Stream dataStream) { MS2SizeHeader header; MS2SizeHeader dataHeader; Stream encryptedHeaderStream; Stream encryptedDataHeaderStream; using (var archiveInfoHeaderStream = new MemoryStream()) using (var archiveHeaderStream = new MemoryStream()) { for (int i = 0; i < files.Length; i++) { MS2File file = files[i]; uint offset = (uint)dataStream.Position; (Stream Stream, bool ShouldDispose, MS2SizeHeader Header)data = await file.GetEncryptedStreamAsync().ConfigureAwait(false); try { var fileHeader = MS2FileHeader.Create(file.Id, offset, file.CompressionType, data.Header); await file.InfoHeader.Save(archiveInfoHeaderStream).ConfigureAwait(false); await fileHeader.Save(cryptoMode, archiveHeaderStream).ConfigureAwait(false); await data.Stream.CopyToAsync(dataStream).ConfigureAwait(false); } finally { if (data.ShouldDispose) { data.Stream.Dispose(); } } } archiveInfoHeaderStream.Position = 0; archiveHeaderStream.Position = 0; // TODO: are those always compressed? (encryptedHeaderStream, header) = await EncryptStreamToStreamAsync(cryptoMode, true, archiveInfoHeaderStream, (uint)archiveInfoHeaderStream.Length).ConfigureAwait(false); (encryptedDataHeaderStream, dataHeader) = await EncryptStreamToStreamAsync(cryptoMode, true, archiveHeaderStream, (uint)archiveHeaderStream.Length).ConfigureAwait(false); } using (var bwHeader = new BinaryWriter(headerStream, Encoding.ASCII, true)) { switch (cryptoMode) { case MS2CryptoMode.MS2F: await SaveMS2F(cryptoMode, (uint)files.Length, header, dataHeader, bwHeader).ConfigureAwait(false); break; case MS2CryptoMode.NS2F: await SaveNS2F(cryptoMode, (uint)files.Length, header, dataHeader, bwHeader).ConfigureAwait(false); break; default: case MS2CryptoMode.OS2F: case MS2CryptoMode.PS2F: throw new NotImplementedException(); } } using (encryptedHeaderStream) using (encryptedDataHeaderStream) { await encryptedHeaderStream.CopyToAsync(headerStream).ConfigureAwait(false); await encryptedDataHeaderStream.CopyToAsync(headerStream).ConfigureAwait(false); } }