From: Rob M. <ro...@us...> - 2009-04-24 10:12:41
|
Update of /cvsroot/wix/wix/src/DTF/Libraries/Compression In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv7367/src/DTF/Libraries/Compression Modified Files: ArchiveFileInfo.cs ArchiveInfo.cs Compression.csproj Added Files: CargoStream.cs Log Message: JasonGin: Add OpenRead and OpenText methods to ArchiveInfo to allow reading archived files without extracting to disk. jbae: pyro should not allow multiple files with the same file id but different source paths in the same cabinet BriaRo: SFBUG:2769262 - Harvest project with satellites misses culture specific part - reopened BriaRo: SFBUG:2776082 - -dr behaves strangely RobMen: light - enable support for small or fast smart cabbing. JasonGin: SFBUG:2603018 - Renaming project items under TFS source control Index: Compression.csproj =================================================================== RCS file: /cvsroot/wix/wix/src/DTF/Libraries/Compression/Compression.csproj,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Compression.csproj 30 May 2008 07:21:11 -0000 1.1 --- Compression.csproj 24 Apr 2009 10:12:21 -0000 1.2 *************** *** 3,7 **** <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> ! <ProductVersion>9.0.21022</ProductVersion> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>{2D62850C-9F81-4BE9-BDF3-9379389C8F7B}</ProjectGuid> --- 3,7 ---- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> ! <ProductVersion>9.0.30729</ProductVersion> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>{2D62850C-9F81-4BE9-BDF3-9379389C8F7B}</ProjectGuid> *************** *** 35,38 **** --- 35,39 ---- <Compile Include="CompressionEngine.cs" /> <Compile Include="CompressionLevel.cs" /> + <Compile Include="CargoStream.cs" /> <Compile Include="DuplicateStream.cs" /> <Compile Include="IPackStreamContext.cs" /> *************** *** 44,50 **** <None Include="Compression.cd" /> </ItemGroup> - <ItemGroup> - <Folder Include="Properties\" /> - </ItemGroup> <Import Project="..\..\..\..\WixBuild.Common.targets" /> </Project> \ No newline at end of file --- 45,48 ---- --- NEW FILE: CargoStream.cs --- //--------------------------------------------------------------------- // <copyright file="CargoStream.cs" company="Microsoft"> // Copyright (c) Microsoft Corporation. All rights reserved. // </copyright> // <summary> // Part of the Deployment Tools Foundation project. // </summary> //--------------------------------------------------------------------- namespace Microsoft.Deployment.Compression { using System; using System.Collections.Generic; using System.IO; /// <summary> /// Wraps a source stream and carries additional items that are disposed when the stream is closed. /// </summary> public class CargoStream : Stream { private Stream source; private List<IDisposable> cargo; /// <summary> /// Creates a new a cargo stream. /// </summary> /// <param name="source">source of the stream</param> /// <param name="cargo">List of additional items that are disposed when the stream is closed. /// The order of the list is the order in which the items are disposed.</param> public CargoStream(Stream source, params IDisposable[] cargo) { if (source == null) { throw new ArgumentNullException("source"); } this.source = source; this.cargo = new List<IDisposable>(cargo); } /// <summary> /// Gets the source stream of the cargo stream. /// </summary> public Stream Source { get { return this.source; } } /// <summary> /// Gets the list of additional items that are disposed when the stream is closed. /// The order of the list is the order in which the items are disposed. The contents can be modified any time. /// </summary> public IList<IDisposable> Cargo { get { return this.cargo; } } /// <summary> /// Gets a value indicating whether the source stream supports reading. /// </summary> /// <value>true if the stream supports reading; otherwise, false.</value> public override bool CanRead { get { return this.source.CanRead; } } /// <summary> /// Gets a value indicating whether the source stream supports writing. /// </summary> /// <value>true if the stream supports writing; otherwise, false.</value> public override bool CanWrite { get { return this.source.CanWrite; } } /// <summary> /// Gets a value indicating whether the source stream supports seeking. /// </summary> /// <value>true if the stream supports seeking; otherwise, false.</value> public override bool CanSeek { get { return this.source.CanSeek; } } /// <summary> /// Gets the length of the source stream. /// </summary> public override long Length { get { return this.source.Length; } } /// <summary> /// Gets or sets the position of the source stream. /// </summary> public override long Position { get { return this.source.Position; } set { this.source.Position = value; } } /// <summary> /// Flushes the source stream. /// </summary> public override void Flush() { this.source.Flush(); } /// <summary> /// Sets the length of the source stream. /// </summary> /// <param name="value">The desired length of the stream in bytes.</param> public override void SetLength(long value) { this.source.SetLength(value); } /// <summary> /// Closes the source stream and also closes the additional objects that are carried. /// </summary> public override void Close() { this.source.Close(); foreach (IDisposable cargoObject in this.cargo) { cargoObject.Dispose(); } } /// <summary> /// Reads from the source stream. /// </summary> /// <param name="buffer">An array of bytes. When this method returns, the buffer /// contains the specified byte array with the values between offset and /// (offset + count - 1) replaced by the bytes read from the source.</param> /// <param name="offset">The zero-based byte offset in buffer at which to begin /// storing the data read from the stream.</param> /// <param name="count">The maximum number of bytes to be read from the stream.</param> /// <returns>The total number of bytes read into the buffer. This can be less /// than the number of bytes requested if that many bytes are not currently available, /// or zero (0) if the end of the stream has been reached.</returns> public override int Read(byte[] buffer, int offset, int count) { return this.source.Read(buffer, offset, count); } /// <summary> /// Writes to the source stream. /// </summary> /// <param name="buffer">An array of bytes. This method copies count /// bytes from buffer to the stream.</param> /// <param name="offset">The zero-based byte offset in buffer at which /// to begin copying bytes to the stream.</param> /// <param name="count">The number of bytes to be written to the stream.</param> public override void Write(byte[] buffer, int offset, int count) { this.source.Write(buffer, offset, count); } /// <summary> /// Changes the position of the source stream. /// </summary> /// <param name="offset">A byte offset relative to the origin parameter.</param> /// <param name="origin">A value of type SeekOrigin indicating the reference /// point used to obtain the new position.</param> /// <returns>The new position within the stream.</returns> public override long Seek(long offset, SeekOrigin origin) { return this.source.Seek(offset, origin); } } } Index: ArchiveInfo.cs =================================================================== RCS file: /cvsroot/wix/wix/src/DTF/Libraries/Compression/ArchiveInfo.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ArchiveInfo.cs 30 May 2008 07:21:10 -0000 1.1 --- ArchiveInfo.cs 24 Apr 2009 10:12:21 -0000 1.2 *************** *** 22,25 **** --- 22,26 ---- using System.Collections.Generic; using System.Globalization; + using System.Text; using System.Text.RegularExpressions; using System.Security.Permissions; *************** *** 432,435 **** --- 433,479 ---- /// <summary> + /// Opens a file inside the archive for reading without actually + /// extracting the file to disk. + /// </summary> + /// <param name="fileName">The name of the file in the archive. Also + /// includes the internal path of the file, if any. File name matching + /// is case-insensitive.</param> + /// <returns> + /// A stream for reading directly from the packed file. Like any stream + /// this should be closed/disposed as soon as it is no longer needed. + /// </returns> + public Stream OpenRead(string fileName) + { + Stream archiveStream = File.OpenRead(this.FullName); + CompressionEngine compressionEngine = this.CreateCompressionEngine(); + Stream fileStream = compressionEngine.Unpack(archiveStream, fileName); + + // Attach the archiveStream and compressionEngine to the + // fileStream so they get disposed when the fileStream is disposed. + return new CargoStream(fileStream, archiveStream, compressionEngine); + } + + /// <summary> + /// Opens a file inside the archive for reading text with UTF-8 encoding + /// without actually extracting the file to disk. + /// </summary> + /// <param name="fileName">The name of the file in the archive. Also + /// includes the internal path of the file, if any. File name matching + /// is case-insensitive.</param> + /// <returns> + /// A reader for reading text directly from the packed file. Like any reader + /// this should be closed/disposed as soon as it is no longer needed. + /// </returns> + /// <remarks> + /// To open an archived text file with different encoding, use the + /// <see cref="OpenRead" /> method and pass the returned stream to one of + /// the <see cref="StreamReader" /> constructor overloads. + /// </remarks> + public StreamReader OpenText(string fileName) + { + return new StreamReader(this.OpenRead(fileName)); + } + + /// <summary> /// Compresses all files in a directory into the archive. /// Does not include subdirectories. Index: ArchiveFileInfo.cs =================================================================== RCS file: /cvsroot/wix/wix/src/DTF/Libraries/Compression/ArchiveFileInfo.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ArchiveFileInfo.cs 30 May 2008 07:21:10 -0000 1.1 --- ArchiveFileInfo.cs 24 Apr 2009 10:12:21 -0000 1.2 *************** *** 397,400 **** --- 397,431 ---- /// <summary> + /// Opens the archive file for reading without actually extracting the + /// file to disk. + /// </summary> + /// <returns> + /// A stream for reading directly from the packed file. Like any stream + /// this should be closed/disposed as soon as it is no longer needed. + /// </returns> + public Stream OpenRead() + { + return this.Archive.OpenRead(System.IO.Path.Combine(this.Path, this.Name)); + } + + /// <summary> + /// Opens the archive file reading text with UTF-8 encoding without + /// actually extracting the file to disk. + /// </summary> + /// <returns> + /// A reader for reading text directly from the packed file. Like any reader + /// this should be closed/disposed as soon as it is no longer needed. + /// </returns> + /// <remarks> + /// To open an archived text file with different encoding, use the + /// <see cref="OpenRead" /> method and pass the returned stream to one of + /// the <see cref="StreamReader" /> constructor overloads. + /// </remarks> + public StreamReader OpenText() + { + return this.Archive.OpenText(System.IO.Path.Combine(this.Path, this.Name)); + } + + /// <summary> /// Refreshes the information in this object with new data retrieved /// from an archive. |