// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. namespace WixToolset.Dtf.Compression { using System; using System.IO; using System.Diagnostics.CodeAnalysis; /// /// Stream context used to extract a single file from an archive into a memory stream. /// [SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable")] public class BasicUnpackStreamContext : IUnpackStreamContext { private Stream archiveStream; private Stream fileStream; /// /// Creates a new BasicExtractStreamContext that reads from the specified archive stream. /// /// Archive stream to read from. public BasicUnpackStreamContext(Stream archiveStream) { this.archiveStream = archiveStream; } /// /// Gets the stream for the extracted file, or null if no file was extracted. /// public Stream FileStream { get { return this.fileStream; } } /// /// Opens the archive stream for reading. Returns a DuplicateStream instance, /// so the stream may be virtually opened multiple times. /// /// The archive number to open (ignored; 0 is assumed). /// The name of the archive being opened. /// Instance of the compression engine doing the operations. /// A stream from which archive bytes are read. public Stream OpenArchiveReadStream(int archiveNumber, string archiveName, CompressionEngine compressionEngine) { return new DuplicateStream(this.archiveStream); } /// /// Does *not* close the stream. The archive stream should be managed by /// the code that invokes the archive extraction. /// /// The archive number of the stream to close. /// The name of the archive being closed. /// The stream being closed. public void CloseArchiveReadStream(int archiveNumber, string archiveName, Stream stream) { // Do nothing. } /// /// Opens a stream for writing extracted file bytes. The returned stream is a MemoryStream /// instance, so the file is extracted straight into memory. /// /// Path of the file within the archive. /// The uncompressed size of the file to be extracted. /// The last write time of the file. /// A stream where extracted file bytes are to be written. public Stream OpenFileWriteStream(string path, long fileSize, DateTime lastWriteTime) { this.fileStream = new MemoryStream(new byte[fileSize], 0, (int) fileSize, true, true); return this.fileStream; } /// /// Does *not* close the file stream. The file stream is saved in memory so it can /// be read later. /// /// Path of the file within the archive. /// The file stream to be closed. /// The attributes of the extracted file. /// The last write time of the file. public void CloseFileWriteStream(string path, Stream stream, FileAttributes attributes, DateTime lastWriteTime) { // Do nothing. } } }