| 1 | // 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. |
| 2 | |
| 3 | namespace WixToolset.Dtf.Compression.Cab |
| 4 | { |
| 5 | using System; |
| 6 | using System.IO; |
| 7 | using System.Runtime.Serialization; |
| 8 | |
| 9 | /// <summary> |
| 10 | /// Object representing a compressed file within a cabinet package; provides operations for getting |
| 11 | /// the file properties and extracting the file. |
| 12 | /// </summary> |
| 13 | [Serializable] |
| 14 | public class CabFileInfo : ArchiveFileInfo |
| 15 | { |
| 16 | private int cabFolder; |
| 17 | |
| 18 | /// <summary> |
| 19 | /// Creates a new CabinetFileInfo object representing a file within a cabinet in a specified path. |
| 20 | /// </summary> |
| 21 | /// <param name="cabinetInfo">An object representing the cabinet containing the file.</param> |
| 22 | /// <param name="filePath">The path to the file within the cabinet. Usually, this is a simple file |
| 23 | /// name, but if the cabinet contains a directory structure this may include the directory.</param> |
| 24 | public CabFileInfo(CabInfo cabinetInfo, string filePath) |
| 25 | : base(cabinetInfo, filePath) |
| 26 | { |
| 27 | if (cabinetInfo == null) |
| 28 | { |
| 29 | throw new ArgumentNullException("cabinetInfo"); |
| 30 | } |
| 31 | |
| 32 | this.cabFolder = -1; |
| 33 | } |
| 34 | |
| 35 | /// <summary> |
| 36 | /// Creates a new CabinetFileInfo object with all parameters specified, |
| 37 | /// used internally when reading the metadata out of a cab. |
| 38 | /// </summary> |
| 39 | /// <param name="filePath">The internal path and name of the file in the cab.</param> |
| 40 | /// <param name="cabFolder">The folder number containing the file.</param> |
| 41 | /// <param name="cabNumber">The cabinet number where the file starts.</param> |
| 42 | /// <param name="attributes">The stored attributes of the file.</param> |
| 43 | /// <param name="lastWriteTime">The stored last write time of the file.</param> |
| 44 | /// <param name="length">The uncompressed size of the file.</param> |
| 45 | internal CabFileInfo( |
| 46 | string filePath, |
| 47 | int cabFolder, |
| 48 | int cabNumber, |
| 49 | FileAttributes attributes, |
| 50 | DateTime lastWriteTime, |
| 51 | long length) |
| 52 | : base(filePath, cabNumber, attributes, lastWriteTime, length) |
| 53 | { |
| 54 | this.cabFolder = cabFolder; |
| 55 | } |
| 56 | |
| 57 | /// <summary> |
| 58 | /// Initializes a new instance of the CabinetFileInfo class with serialized data. |
| 59 | /// </summary> |
| 60 | /// <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param> |
| 61 | /// <param name="context">The StreamingContext that contains contextual information about the source or destination.</param> |
| 62 | protected CabFileInfo(SerializationInfo info, StreamingContext context) |
| 63 | : base(info, context) |
| 64 | { |
| 65 | this.cabFolder = info.GetInt32("cabFolder"); |
| 66 | } |
| 67 | |
| 68 | /// <summary> |
| 69 | /// Sets the SerializationInfo with information about the archive. |
| 70 | /// </summary> |
| 71 | /// <param name="info">The SerializationInfo that holds the serialized object data.</param> |
| 72 | /// <param name="context">The StreamingContext that contains contextual information |
| 73 | /// about the source or destination.</param> |
| 74 | public override void GetObjectData(SerializationInfo info, StreamingContext context) |
| 75 | { |
| 76 | base.GetObjectData(info, context); |
| 77 | info.AddValue("cabFolder", this.cabFolder); |
| 78 | } |
| 79 | |
| 80 | /// <summary> |
| 81 | /// Gets or sets the cabinet that contains this file. |
| 82 | /// </summary> |
| 83 | /// <value> |
| 84 | /// The CabinetInfo instance that retrieved this file information -- this |
| 85 | /// may be null if the CabinetFileInfo object was returned directly from a |
| 86 | /// stream. |
| 87 | /// </value> |
| 88 | public CabInfo Cabinet |
| 89 | { |
| 90 | get |
| 91 | { |
| 92 | return (CabInfo) this.Archive; |
| 93 | } |
| 94 | } |
| 95 | |
| 96 | /// <summary> |
| 97 | /// Gets the full path of the cabinet that contains this file. |
| 98 | /// </summary> |
| 99 | /// <value>The full path of the cabinet that contains this file.</value> |
| 100 | public string CabinetName |
| 101 | { |
| 102 | get |
| 103 | { |
| 104 | return this.ArchiveName; |
| 105 | } |
| 106 | } |
| 107 | |
| 108 | /// <summary> |
| 109 | /// Gets the number of the folder containing this file. |
| 110 | /// </summary> |
| 111 | /// <value>The number of the cabinet folder containing this file.</value> |
| 112 | /// <remarks>A single folder or the first folder of a cabinet |
| 113 | /// (or chain of cabinets) is numbered 0.</remarks> |
| 114 | public int CabinetFolderNumber |
| 115 | { |
| 116 | get |
| 117 | { |
| 118 | if (this.cabFolder < 0) |
| 119 | { |
| 120 | this.Refresh(); |
| 121 | } |
| 122 | return this.cabFolder; |
| 123 | } |
| 124 | } |
| 125 | |
| 126 | /// <summary> |
| 127 | /// Refreshes the information in this object with new data retrieved |
| 128 | /// from an archive. |
| 129 | /// </summary> |
| 130 | /// <param name="newFileInfo">Fresh instance for the same file just |
| 131 | /// read from the archive.</param> |
| 132 | /// <remarks> |
| 133 | /// This implementation refreshes the <see cref="CabinetFolderNumber"/>. |
| 134 | /// </remarks> |
| 135 | protected override void Refresh(ArchiveFileInfo newFileInfo) |
| 136 | { |
| 137 | base.Refresh(newFileInfo); |
| 138 | this.cabFolder = ((CabFileInfo) newFileInfo).cabFolder; |
| 139 | } |
| 140 | } |
| 141 | } |