Statistics
| Branch: | Revision:

root / trunk / hammock / src / net35 / ICSharpCode.SharpZipLib.Silverlight / Zip / ZipEntry.cs @ 0eea575a

History | View | Annotate | Download (40.5 kB)

1 0eea575a Panagiotis Kanavos
// ZipEntry.cs
2 0eea575a Panagiotis Kanavos
//
3 0eea575a Panagiotis Kanavos
// Copyright (C) 2001 Mike Krueger
4 0eea575a Panagiotis Kanavos
// Copyright (C) 2004 John Reilly
5 0eea575a Panagiotis Kanavos
//
6 0eea575a Panagiotis Kanavos
// This file was translated from java, it was part of the GNU Classpath
7 0eea575a Panagiotis Kanavos
// Copyright (C) 2001 Free Software Foundation, Inc.
8 0eea575a Panagiotis Kanavos
//
9 0eea575a Panagiotis Kanavos
// This program is free software; you can redistribute it and/or
10 0eea575a Panagiotis Kanavos
// modify it under the terms of the GNU General Public License
11 0eea575a Panagiotis Kanavos
// as published by the Free Software Foundation; either version 2
12 0eea575a Panagiotis Kanavos
// of the License, or (at your option) any later version.
13 0eea575a Panagiotis Kanavos
//
14 0eea575a Panagiotis Kanavos
// This program is distributed in the hope that it will be useful,
15 0eea575a Panagiotis Kanavos
// but WITHOUT ANY WARRANTY; without even the implied warranty of
16 0eea575a Panagiotis Kanavos
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 0eea575a Panagiotis Kanavos
// GNU General Public License for more details.
18 0eea575a Panagiotis Kanavos
//
19 0eea575a Panagiotis Kanavos
// You should have received a copy of the GNU General Public License
20 0eea575a Panagiotis Kanavos
// along with this program; if not, write to the Free Software
21 0eea575a Panagiotis Kanavos
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 0eea575a Panagiotis Kanavos
//
23 0eea575a Panagiotis Kanavos
// Linking this library statically or dynamically with other modules is
24 0eea575a Panagiotis Kanavos
// making a combined work based on this library.  Thus, the terms and
25 0eea575a Panagiotis Kanavos
// conditions of the GNU General Public License cover the whole
26 0eea575a Panagiotis Kanavos
// combination.
27 0eea575a Panagiotis Kanavos
// 
28 0eea575a Panagiotis Kanavos
// As a special exception, the copyright holders of this library give you
29 0eea575a Panagiotis Kanavos
// permission to link this library with independent modules to produce an
30 0eea575a Panagiotis Kanavos
// executable, regardless of the license terms of these independent
31 0eea575a Panagiotis Kanavos
// modules, and to copy and distribute the resulting executable under
32 0eea575a Panagiotis Kanavos
// terms of your choice, provided that you also meet, for each linked
33 0eea575a Panagiotis Kanavos
// independent module, the terms and conditions of the license of that
34 0eea575a Panagiotis Kanavos
// module.  An independent module is a module which is not derived from
35 0eea575a Panagiotis Kanavos
// or based on this library.  If you modify this library, you may extend
36 0eea575a Panagiotis Kanavos
// this exception to your version of the library, but you are not
37 0eea575a Panagiotis Kanavos
// obligated to do so.  If you do not wish to do so, delete this
38 0eea575a Panagiotis Kanavos
// exception statement from your version.
39 0eea575a Panagiotis Kanavos
40 0eea575a Panagiotis Kanavos
using System;
41 0eea575a Panagiotis Kanavos
using System.IO;
42 0eea575a Panagiotis Kanavos
using ICSharpCode.SharpZipLib.Silverlight.Zip;
43 0eea575a Panagiotis Kanavos
using ICSharpCode.SharpZipLib.Zip;
44 0eea575a Panagiotis Kanavos
45 0eea575a Panagiotis Kanavos
namespace ICSharpCode.SharpZipLib.Silverlight.Zip
46 0eea575a Panagiotis Kanavos
{
47 0eea575a Panagiotis Kanavos
    /// <summary>
48 0eea575a Panagiotis Kanavos
    /// Defines known values for the <see cref="HostSystemID"/> property.
49 0eea575a Panagiotis Kanavos
    /// </summary>
50 0eea575a Panagiotis Kanavos
    public enum HostSystemID
51 0eea575a Panagiotis Kanavos
    {
52 0eea575a Panagiotis Kanavos
        /// <summary>
53 0eea575a Panagiotis Kanavos
        /// Host system = MSDOS
54 0eea575a Panagiotis Kanavos
        /// </summary>
55 0eea575a Panagiotis Kanavos
        Msdos = 0,
56 0eea575a Panagiotis Kanavos
        /// <summary>
57 0eea575a Panagiotis Kanavos
        /// Host system = Amiga
58 0eea575a Panagiotis Kanavos
        /// </summary>
59 0eea575a Panagiotis Kanavos
        Amiga = 1,
60 0eea575a Panagiotis Kanavos
        /// <summary>
61 0eea575a Panagiotis Kanavos
        /// Host system = Open VMS
62 0eea575a Panagiotis Kanavos
        /// </summary>
63 0eea575a Panagiotis Kanavos
        OpenVms = 2,
64 0eea575a Panagiotis Kanavos
        /// <summary>
65 0eea575a Panagiotis Kanavos
        /// Host system = Unix
66 0eea575a Panagiotis Kanavos
        /// </summary>
67 0eea575a Panagiotis Kanavos
        Unix = 3,
68 0eea575a Panagiotis Kanavos
        /// <summary>
69 0eea575a Panagiotis Kanavos
        /// Host system = VMCms
70 0eea575a Panagiotis Kanavos
        /// </summary>
71 0eea575a Panagiotis Kanavos
        VMCms = 4,
72 0eea575a Panagiotis Kanavos
        /// <summary>
73 0eea575a Panagiotis Kanavos
        /// Host system = Atari ST
74 0eea575a Panagiotis Kanavos
        /// </summary>
75 0eea575a Panagiotis Kanavos
        AtariST = 5,
76 0eea575a Panagiotis Kanavos
        /// <summary>
77 0eea575a Panagiotis Kanavos
        /// Host system = OS2
78 0eea575a Panagiotis Kanavos
        /// </summary>
79 0eea575a Panagiotis Kanavos
        OS2 = 6,
80 0eea575a Panagiotis Kanavos
        /// <summary>
81 0eea575a Panagiotis Kanavos
        /// Host system = Macintosh
82 0eea575a Panagiotis Kanavos
        /// </summary>
83 0eea575a Panagiotis Kanavos
        Macintosh = 7,
84 0eea575a Panagiotis Kanavos
        /// <summary>
85 0eea575a Panagiotis Kanavos
        /// Host system = ZSystem
86 0eea575a Panagiotis Kanavos
        /// </summary>
87 0eea575a Panagiotis Kanavos
        ZSystem = 8,
88 0eea575a Panagiotis Kanavos
        /// <summary>
89 0eea575a Panagiotis Kanavos
        /// Host system = Cpm
90 0eea575a Panagiotis Kanavos
        /// </summary>
91 0eea575a Panagiotis Kanavos
        Cpm = 9,
92 0eea575a Panagiotis Kanavos
        /// <summary>
93 0eea575a Panagiotis Kanavos
        /// Host system = Windows NT
94 0eea575a Panagiotis Kanavos
        /// </summary>
95 0eea575a Panagiotis Kanavos
        WindowsNT = 10,
96 0eea575a Panagiotis Kanavos
        /// <summary>
97 0eea575a Panagiotis Kanavos
        /// Host system = MVS
98 0eea575a Panagiotis Kanavos
        /// </summary>
99 0eea575a Panagiotis Kanavos
        MVS = 11,
100 0eea575a Panagiotis Kanavos
        /// <summary>
101 0eea575a Panagiotis Kanavos
        /// Host system = VSE
102 0eea575a Panagiotis Kanavos
        /// </summary>
103 0eea575a Panagiotis Kanavos
        Vse = 12,
104 0eea575a Panagiotis Kanavos
        /// <summary>
105 0eea575a Panagiotis Kanavos
        /// Host system = Acorn RISC
106 0eea575a Panagiotis Kanavos
        /// </summary>
107 0eea575a Panagiotis Kanavos
        AcornRisc = 13,
108 0eea575a Panagiotis Kanavos
        /// <summary>
109 0eea575a Panagiotis Kanavos
        /// Host system = VFAT
110 0eea575a Panagiotis Kanavos
        /// </summary>
111 0eea575a Panagiotis Kanavos
        Vfat = 14,
112 0eea575a Panagiotis Kanavos
        /// <summary>
113 0eea575a Panagiotis Kanavos
        /// Host system = Alternate MVS
114 0eea575a Panagiotis Kanavos
        /// </summary>
115 0eea575a Panagiotis Kanavos
        AlternateMvs = 15,
116 0eea575a Panagiotis Kanavos
        /// <summary>
117 0eea575a Panagiotis Kanavos
        /// Host system = BEOS
118 0eea575a Panagiotis Kanavos
        /// </summary>
119 0eea575a Panagiotis Kanavos
        BeOS = 16,
120 0eea575a Panagiotis Kanavos
        /// <summary>
121 0eea575a Panagiotis Kanavos
        /// Host system = Tandem
122 0eea575a Panagiotis Kanavos
        /// </summary>
123 0eea575a Panagiotis Kanavos
        Tandem = 17,
124 0eea575a Panagiotis Kanavos
        /// <summary>
125 0eea575a Panagiotis Kanavos
        /// Host system = OS400
126 0eea575a Panagiotis Kanavos
        /// </summary>
127 0eea575a Panagiotis Kanavos
        OS400 = 18,
128 0eea575a Panagiotis Kanavos
        /// <summary>
129 0eea575a Panagiotis Kanavos
        /// Host system = OSX
130 0eea575a Panagiotis Kanavos
        /// </summary>
131 0eea575a Panagiotis Kanavos
        OSX = 19,
132 0eea575a Panagiotis Kanavos
        /// <summary>
133 0eea575a Panagiotis Kanavos
        /// Host system = WinZIP AES
134 0eea575a Panagiotis Kanavos
        /// </summary>
135 0eea575a Panagiotis Kanavos
        WinZipAES = 99,
136 0eea575a Panagiotis Kanavos
    }
137 0eea575a Panagiotis Kanavos
138 0eea575a Panagiotis Kanavos
    /// <summary>
139 0eea575a Panagiotis Kanavos
    /// This class represents an entry in a zip archive.  This can be a file
140 0eea575a Panagiotis Kanavos
    /// or a directory
141 0eea575a Panagiotis Kanavos
    /// ZipFile and ZipInputStream will give you instances of this class as 
142 0eea575a Panagiotis Kanavos
    /// information about the members in an archive.  ZipOutputStream
143 0eea575a Panagiotis Kanavos
    /// uses an instance of this class when creating an entry in a Zip file.
144 0eea575a Panagiotis Kanavos
    /// <br/>
145 0eea575a Panagiotis Kanavos
    /// <br/>Author of the original java version : Jochen Hoenicke
146 0eea575a Panagiotis Kanavos
    /// </summary>
147 0eea575a Panagiotis Kanavos
    public class ZipEntry
148 0eea575a Panagiotis Kanavos
    {
149 0eea575a Panagiotis Kanavos
        [Flags]
150 0eea575a Panagiotis Kanavos
        enum Known : byte
151 0eea575a Panagiotis Kanavos
        {
152 0eea575a Panagiotis Kanavos
            None = 0,
153 0eea575a Panagiotis Kanavos
            Size = 0x01,
154 0eea575a Panagiotis Kanavos
            CompressedSize = 0x02,
155 0eea575a Panagiotis Kanavos
            Crc = 0x04,
156 0eea575a Panagiotis Kanavos
            Time = 0x08,
157 0eea575a Panagiotis Kanavos
            ExternalAttributes = 0x10,
158 0eea575a Panagiotis Kanavos
        }
159 0eea575a Panagiotis Kanavos
		
160 0eea575a Panagiotis Kanavos
        #region Constructors
161 0eea575a Panagiotis Kanavos
        /// <summary>
162 0eea575a Panagiotis Kanavos
        /// Creates a zip entry with the given name.
163 0eea575a Panagiotis Kanavos
        /// </summary>
164 0eea575a Panagiotis Kanavos
        /// <param name="name">
165 0eea575a Panagiotis Kanavos
        /// The name for this entry. Can include directory components.
166 0eea575a Panagiotis Kanavos
        /// The convention for names is 'unix' style paths with relative names only.
167 0eea575a Panagiotis Kanavos
        /// There are with no device names and path elements are separated by '/' characters.
168 0eea575a Panagiotis Kanavos
        /// </param>
169 0eea575a Panagiotis Kanavos
        /// <exception cref="ArgumentNullException">
170 0eea575a Panagiotis Kanavos
        /// The name passed is null
171 0eea575a Panagiotis Kanavos
        /// </exception>
172 0eea575a Panagiotis Kanavos
        public ZipEntry(string name)
173 0eea575a Panagiotis Kanavos
            : this(name, 0, ZipConstants.VersionMadeBy, CompressionMethod.Deflated)
174 0eea575a Panagiotis Kanavos
        {
175 0eea575a Panagiotis Kanavos
        }
176 0eea575a Panagiotis Kanavos
177 0eea575a Panagiotis Kanavos
        /// <summary>
178 0eea575a Panagiotis Kanavos
        /// Creates a zip entry with the given name and version required to extract
179 0eea575a Panagiotis Kanavos
        /// </summary>
180 0eea575a Panagiotis Kanavos
        /// <param name="name">
181 0eea575a Panagiotis Kanavos
        /// The name for this entry. Can include directory components.
182 0eea575a Panagiotis Kanavos
        /// The convention for names is 'unix'  style paths with no device names and 
183 0eea575a Panagiotis Kanavos
        /// path elements separated by '/' characters.  This is not enforced see <see cref="CleanName(string)">CleanName</see>
184 0eea575a Panagiotis Kanavos
        /// on how to ensure names are valid if this is desired.
185 0eea575a Panagiotis Kanavos
        /// </param>
186 0eea575a Panagiotis Kanavos
        /// <param name="versionRequiredToExtract">
187 0eea575a Panagiotis Kanavos
        /// The minimum 'feature version' required this entry
188 0eea575a Panagiotis Kanavos
        /// </param>
189 0eea575a Panagiotis Kanavos
        /// <exception cref="ArgumentNullException">
190 0eea575a Panagiotis Kanavos
        /// The name passed is null
191 0eea575a Panagiotis Kanavos
        /// </exception>
192 0eea575a Panagiotis Kanavos
        internal ZipEntry(string name, int versionRequiredToExtract)
193 0eea575a Panagiotis Kanavos
            : this(name, versionRequiredToExtract, ZipConstants.VersionMadeBy,
194 0eea575a Panagiotis Kanavos
                   CompressionMethod.Deflated)
195 0eea575a Panagiotis Kanavos
        {
196 0eea575a Panagiotis Kanavos
        }
197 0eea575a Panagiotis Kanavos
		
198 0eea575a Panagiotis Kanavos
        /// <summary>
199 0eea575a Panagiotis Kanavos
        /// Initializes an entry with the given name and made by information
200 0eea575a Panagiotis Kanavos
        /// </summary>
201 0eea575a Panagiotis Kanavos
        /// <param name="name">Name for this entry</param>
202 0eea575a Panagiotis Kanavos
        /// <param name="madeByInfo">Version and HostSystem Information</param>
203 0eea575a Panagiotis Kanavos
        /// <param name="versionRequiredToExtract">Minimum required zip feature version required to extract this entry</param>
204 0eea575a Panagiotis Kanavos
        /// <param name="method">Compression method for this entry.</param>
205 0eea575a Panagiotis Kanavos
        /// <exception cref="ArgumentNullException">
206 0eea575a Panagiotis Kanavos
        /// The name passed is null
207 0eea575a Panagiotis Kanavos
        /// </exception>
208 0eea575a Panagiotis Kanavos
        /// <exception cref="ArgumentOutOfRangeException">
209 0eea575a Panagiotis Kanavos
        /// versionRequiredToExtract should be 0 (auto-calculate) or > 10
210 0eea575a Panagiotis Kanavos
        /// </exception>
211 0eea575a Panagiotis Kanavos
        /// <remarks>
212 0eea575a Panagiotis Kanavos
        /// This constructor is used by the ZipFile class when reading from the central header
213 0eea575a Panagiotis Kanavos
        /// It is not generally useful, use the constructor specifying the name only.
214 0eea575a Panagiotis Kanavos
        /// </remarks>
215 0eea575a Panagiotis Kanavos
        internal ZipEntry(string name, int versionRequiredToExtract, int madeByInfo,
216 0eea575a Panagiotis Kanavos
                          CompressionMethod method)
217 0eea575a Panagiotis Kanavos
        {
218 0eea575a Panagiotis Kanavos
            if (name == null) {
219 0eea575a Panagiotis Kanavos
                throw new System.ArgumentNullException("ZipEntry name");
220 0eea575a Panagiotis Kanavos
            }
221 0eea575a Panagiotis Kanavos
222 0eea575a Panagiotis Kanavos
            if ( name.Length > 0xffff )	{
223 0eea575a Panagiotis Kanavos
                throw new ArgumentException("Name is too long", "name");
224 0eea575a Panagiotis Kanavos
            }
225 0eea575a Panagiotis Kanavos
226 0eea575a Panagiotis Kanavos
            if ( (versionRequiredToExtract != 0) && (versionRequiredToExtract < 10) ) {
227 0eea575a Panagiotis Kanavos
                throw new ArgumentOutOfRangeException("versionRequiredToExtract");
228 0eea575a Panagiotis Kanavos
            }
229 0eea575a Panagiotis Kanavos
			
230 0eea575a Panagiotis Kanavos
            this.DateTime = System.DateTime.Now;
231 0eea575a Panagiotis Kanavos
            this.name = name;
232 0eea575a Panagiotis Kanavos
            this.versionMadeBy = (ushort)madeByInfo;
233 0eea575a Panagiotis Kanavos
            this.versionToExtract = (ushort)versionRequiredToExtract;
234 0eea575a Panagiotis Kanavos
            this.method = method;
235 0eea575a Panagiotis Kanavos
        }
236 0eea575a Panagiotis Kanavos
		
237 0eea575a Panagiotis Kanavos
        /// <summary>
238 0eea575a Panagiotis Kanavos
        /// Creates a deep copy of the given zip entry.
239 0eea575a Panagiotis Kanavos
        /// </summary>
240 0eea575a Panagiotis Kanavos
        /// <param name="entry">
241 0eea575a Panagiotis Kanavos
        /// The entry to copy.
242 0eea575a Panagiotis Kanavos
        /// </param>
243 0eea575a Panagiotis Kanavos
        [Obsolete("Use Clone instead")]
244 0eea575a Panagiotis Kanavos
        public ZipEntry(ZipEntry entry)
245 0eea575a Panagiotis Kanavos
        {
246 0eea575a Panagiotis Kanavos
            if ( entry == null ) {
247 0eea575a Panagiotis Kanavos
                throw new ArgumentNullException("entry");
248 0eea575a Panagiotis Kanavos
            }
249 0eea575a Panagiotis Kanavos
250 0eea575a Panagiotis Kanavos
            known                  = entry.known;
251 0eea575a Panagiotis Kanavos
            name                   = entry.name;
252 0eea575a Panagiotis Kanavos
            size                   = entry.size;
253 0eea575a Panagiotis Kanavos
            compressedSize         = entry.compressedSize;
254 0eea575a Panagiotis Kanavos
            crc                    = entry.crc;
255 0eea575a Panagiotis Kanavos
            dosTime                = entry.dosTime;
256 0eea575a Panagiotis Kanavos
            method                 = entry.method;
257 0eea575a Panagiotis Kanavos
            comment                = entry.comment;
258 0eea575a Panagiotis Kanavos
            versionToExtract       = entry.versionToExtract;
259 0eea575a Panagiotis Kanavos
            versionMadeBy          = entry.versionMadeBy;
260 0eea575a Panagiotis Kanavos
            externalFileAttributes = entry.externalFileAttributes;
261 0eea575a Panagiotis Kanavos
            flags                  = entry.flags;
262 0eea575a Panagiotis Kanavos
263 0eea575a Panagiotis Kanavos
            zipFileIndex           = entry.zipFileIndex;
264 0eea575a Panagiotis Kanavos
            offset                 = entry.offset;
265 0eea575a Panagiotis Kanavos
266 0eea575a Panagiotis Kanavos
            forceZip64_			   = entry.forceZip64_;
267 0eea575a Panagiotis Kanavos
268 0eea575a Panagiotis Kanavos
            if ( entry.extra != null ) {
269 0eea575a Panagiotis Kanavos
                extra = new byte[entry.extra.Length];
270 0eea575a Panagiotis Kanavos
                Array.Copy(entry.extra, 0, extra, 0, entry.extra.Length);
271 0eea575a Panagiotis Kanavos
            }
272 0eea575a Panagiotis Kanavos
        }
273 0eea575a Panagiotis Kanavos
274 0eea575a Panagiotis Kanavos
        #endregion
275 0eea575a Panagiotis Kanavos
		
276 0eea575a Panagiotis Kanavos
        /// <summary>
277 0eea575a Panagiotis Kanavos
        /// Get a value indicating wether the entry has a CRC value available.
278 0eea575a Panagiotis Kanavos
        /// </summary>
279 0eea575a Panagiotis Kanavos
        public bool HasCrc 
280 0eea575a Panagiotis Kanavos
        {
281 0eea575a Panagiotis Kanavos
            get {
282 0eea575a Panagiotis Kanavos
                return (known & Known.Crc) != 0;
283 0eea575a Panagiotis Kanavos
            }
284 0eea575a Panagiotis Kanavos
        }
285 0eea575a Panagiotis Kanavos
286 0eea575a Panagiotis Kanavos
        /// <summary>
287 0eea575a Panagiotis Kanavos
        /// Get/Set flag indicating if entry is encrypted.
288 0eea575a Panagiotis Kanavos
        /// A simple helper routine to aid interpretation of <see cref="Flags">flags</see>
289 0eea575a Panagiotis Kanavos
        /// </summary>
290 0eea575a Panagiotis Kanavos
        /// <remarks>This is an assistant that interprets the <see cref="Flags">flags</see> property.</remarks>
291 0eea575a Panagiotis Kanavos
        public bool IsCrypted 
292 0eea575a Panagiotis Kanavos
        {
293 0eea575a Panagiotis Kanavos
            get {
294 0eea575a Panagiotis Kanavos
                return (flags & 1) != 0; 
295 0eea575a Panagiotis Kanavos
            }
296 0eea575a Panagiotis Kanavos
            set {
297 0eea575a Panagiotis Kanavos
                if (value) {
298 0eea575a Panagiotis Kanavos
                    flags |= 1;
299 0eea575a Panagiotis Kanavos
                } 
300 0eea575a Panagiotis Kanavos
                else {
301 0eea575a Panagiotis Kanavos
                    flags &= ~1;
302 0eea575a Panagiotis Kanavos
                }
303 0eea575a Panagiotis Kanavos
            }
304 0eea575a Panagiotis Kanavos
        }
305 0eea575a Panagiotis Kanavos
306 0eea575a Panagiotis Kanavos
        /// <summary>
307 0eea575a Panagiotis Kanavos
        /// Get / set a flag indicating wether entry name and comment text are
308 0eea575a Panagiotis Kanavos
        /// encoded in <a href="http://www.unicode.org">unicode UTF8</a>.
309 0eea575a Panagiotis Kanavos
        /// </summary>
310 0eea575a Panagiotis Kanavos
        /// <remarks>This is an assistant that interprets the <see cref="Flags">flags</see> property.</remarks>
311 0eea575a Panagiotis Kanavos
        public bool IsUnicodeText
312 0eea575a Panagiotis Kanavos
        {
313 0eea575a Panagiotis Kanavos
            get {
314 0eea575a Panagiotis Kanavos
                return ( flags & (int)GeneralBitFlags.UnicodeText ) != 0;
315 0eea575a Panagiotis Kanavos
            }
316 0eea575a Panagiotis Kanavos
            set {
317 0eea575a Panagiotis Kanavos
                if ( value ) {
318 0eea575a Panagiotis Kanavos
                    flags |= (int)GeneralBitFlags.UnicodeText;
319 0eea575a Panagiotis Kanavos
                }
320 0eea575a Panagiotis Kanavos
                else {
321 0eea575a Panagiotis Kanavos
                    flags &= ~(int)GeneralBitFlags.UnicodeText;
322 0eea575a Panagiotis Kanavos
                }
323 0eea575a Panagiotis Kanavos
            }
324 0eea575a Panagiotis Kanavos
        }
325 0eea575a Panagiotis Kanavos
		
326 0eea575a Panagiotis Kanavos
        /// <summary>
327 0eea575a Panagiotis Kanavos
        /// Value used during password checking for PKZIP 2.0 / 'classic' encryption.
328 0eea575a Panagiotis Kanavos
        /// </summary>
329 0eea575a Panagiotis Kanavos
        internal byte CryptoCheckValue
330 0eea575a Panagiotis Kanavos
        {
331 0eea575a Panagiotis Kanavos
            get {
332 0eea575a Panagiotis Kanavos
                return cryptoCheckValue_;
333 0eea575a Panagiotis Kanavos
            }
334 0eea575a Panagiotis Kanavos
335 0eea575a Panagiotis Kanavos
            set	{
336 0eea575a Panagiotis Kanavos
                cryptoCheckValue_ = value;
337 0eea575a Panagiotis Kanavos
            }
338 0eea575a Panagiotis Kanavos
        }
339 0eea575a Panagiotis Kanavos
340 0eea575a Panagiotis Kanavos
        /// <summary>
341 0eea575a Panagiotis Kanavos
        /// Get/Set general purpose bit flag for entry
342 0eea575a Panagiotis Kanavos
        /// </summary>
343 0eea575a Panagiotis Kanavos
        /// <remarks>
344 0eea575a Panagiotis Kanavos
        /// General purpose bit flag<br/>
345 0eea575a Panagiotis Kanavos
        /// <br/>
346 0eea575a Panagiotis Kanavos
        /// Bit 0: If set, indicates the file is encrypted<br/>
347 0eea575a Panagiotis Kanavos
        /// Bit 1-2 Only used for compression type 6 Imploding, and 8, 9 deflating<br/>
348 0eea575a Panagiotis Kanavos
        /// Imploding:<br/>
349 0eea575a Panagiotis Kanavos
        /// Bit 1 if set indicates an 8K sliding dictionary was used.  If clear a 4k dictionary was used<br/>
350 0eea575a Panagiotis Kanavos
        /// Bit 2 if set indicates 3 Shannon-Fanno trees were used to encode the sliding dictionary, 2 otherwise<br/>
351 0eea575a Panagiotis Kanavos
        /// <br/>
352 0eea575a Panagiotis Kanavos
        /// Deflating:<br/>
353 0eea575a Panagiotis Kanavos
        ///   Bit 2    Bit 1<br/>
354 0eea575a Panagiotis Kanavos
        ///     0        0       Normal compression was used<br/>
355 0eea575a Panagiotis Kanavos
        ///     0        1       Maximum compression was used<br/>
356 0eea575a Panagiotis Kanavos
        ///     1        0       Fast compression was used<br/>
357 0eea575a Panagiotis Kanavos
        ///     1        1       Super fast compression was used<br/>
358 0eea575a Panagiotis Kanavos
        /// <br/>
359 0eea575a Panagiotis Kanavos
        /// Bit 3: If set, the fields crc-32, compressed size
360 0eea575a Panagiotis Kanavos
        /// and uncompressed size are were not able to be written during zip file creation
361 0eea575a Panagiotis Kanavos
        /// The correct values are held in a data descriptor immediately following the compressed data. <br/>
362 0eea575a Panagiotis Kanavos
        /// Bit 4: Reserved for use by PKZIP for enhanced deflating<br/>
363 0eea575a Panagiotis Kanavos
        /// Bit 5: If set indicates the file contains compressed patch data<br/>
364 0eea575a Panagiotis Kanavos
        /// Bit 6: If set indicates strong encryption was used.<br/>
365 0eea575a Panagiotis Kanavos
        /// Bit 7-10: Unused or reserved<br/>
366 0eea575a Panagiotis Kanavos
        /// Bit 11: If set the name and comments for this entry are in <a href="http://www.unicode.org">unicode</a>.<br/>
367 0eea575a Panagiotis Kanavos
        /// Bit 12-15: Unused or reserved<br/>
368 0eea575a Panagiotis Kanavos
        /// </remarks>
369 0eea575a Panagiotis Kanavos
        /// <seealso cref="IsUnicodeText"></seealso>
370 0eea575a Panagiotis Kanavos
        /// <seealso cref="IsCrypted"></seealso>
371 0eea575a Panagiotis Kanavos
        public int Flags 
372 0eea575a Panagiotis Kanavos
        {
373 0eea575a Panagiotis Kanavos
            get { 
374 0eea575a Panagiotis Kanavos
                return flags; 
375 0eea575a Panagiotis Kanavos
            }
376 0eea575a Panagiotis Kanavos
            set {
377 0eea575a Panagiotis Kanavos
                flags = value; 
378 0eea575a Panagiotis Kanavos
            }
379 0eea575a Panagiotis Kanavos
        }
380 0eea575a Panagiotis Kanavos
381 0eea575a Panagiotis Kanavos
        /// <summary>
382 0eea575a Panagiotis Kanavos
        /// Get/Set index of this entry in Zip file
383 0eea575a Panagiotis Kanavos
        /// </summary>
384 0eea575a Panagiotis Kanavos
        /// <remarks>This is only valid when the entry is part of a <see cref="ZipFile"></see></remarks>
385 0eea575a Panagiotis Kanavos
        public long ZipFileIndex 
386 0eea575a Panagiotis Kanavos
        {
387 0eea575a Panagiotis Kanavos
            get {
388 0eea575a Panagiotis Kanavos
                return zipFileIndex;
389 0eea575a Panagiotis Kanavos
            }
390 0eea575a Panagiotis Kanavos
            set {
391 0eea575a Panagiotis Kanavos
                zipFileIndex = value;
392 0eea575a Panagiotis Kanavos
            }
393 0eea575a Panagiotis Kanavos
        }
394 0eea575a Panagiotis Kanavos
		
395 0eea575a Panagiotis Kanavos
        /// <summary>
396 0eea575a Panagiotis Kanavos
        /// Get/set offset for use in central header
397 0eea575a Panagiotis Kanavos
        /// </summary>
398 0eea575a Panagiotis Kanavos
        public long Offset 
399 0eea575a Panagiotis Kanavos
        {
400 0eea575a Panagiotis Kanavos
            get {
401 0eea575a Panagiotis Kanavos
                return offset;
402 0eea575a Panagiotis Kanavos
            }
403 0eea575a Panagiotis Kanavos
            set {
404 0eea575a Panagiotis Kanavos
                offset = value;
405 0eea575a Panagiotis Kanavos
            }
406 0eea575a Panagiotis Kanavos
        }
407 0eea575a Panagiotis Kanavos
408 0eea575a Panagiotis Kanavos
        /// <summary>
409 0eea575a Panagiotis Kanavos
        /// Get/Set external file attributes as an integer.
410 0eea575a Panagiotis Kanavos
        /// The values of this are operating system dependant see
411 0eea575a Panagiotis Kanavos
        /// <see cref="HostSystem">HostSystem</see> for details
412 0eea575a Panagiotis Kanavos
        /// </summary>
413 0eea575a Panagiotis Kanavos
        public int ExternalFileAttributes 
414 0eea575a Panagiotis Kanavos
        {
415 0eea575a Panagiotis Kanavos
            get {
416 0eea575a Panagiotis Kanavos
                if ((known & Known.ExternalAttributes) == 0) {
417 0eea575a Panagiotis Kanavos
                    return -1;
418 0eea575a Panagiotis Kanavos
                } 
419 0eea575a Panagiotis Kanavos
                else {
420 0eea575a Panagiotis Kanavos
                    return externalFileAttributes;
421 0eea575a Panagiotis Kanavos
                }
422 0eea575a Panagiotis Kanavos
            }
423 0eea575a Panagiotis Kanavos
			
424 0eea575a Panagiotis Kanavos
            set {
425 0eea575a Panagiotis Kanavos
                externalFileAttributes = value;
426 0eea575a Panagiotis Kanavos
                known |= Known.ExternalAttributes;
427 0eea575a Panagiotis Kanavos
            }
428 0eea575a Panagiotis Kanavos
        }
429 0eea575a Panagiotis Kanavos
430 0eea575a Panagiotis Kanavos
        /// <summary>
431 0eea575a Panagiotis Kanavos
        /// Get the version made by for this entry or zero if unknown.
432 0eea575a Panagiotis Kanavos
        /// The value / 10 indicates the major version number, and 
433 0eea575a Panagiotis Kanavos
        /// the value mod 10 is the minor version number
434 0eea575a Panagiotis Kanavos
        /// </summary>
435 0eea575a Panagiotis Kanavos
        public int VersionMadeBy 
436 0eea575a Panagiotis Kanavos
        {
437 0eea575a Panagiotis Kanavos
            get { 
438 0eea575a Panagiotis Kanavos
                return (versionMadeBy & 0xff);
439 0eea575a Panagiotis Kanavos
            }
440 0eea575a Panagiotis Kanavos
        }
441 0eea575a Panagiotis Kanavos
442 0eea575a Panagiotis Kanavos
        /// <summary>
443 0eea575a Panagiotis Kanavos
        /// Get a value indicating this entry is for a DOS/Windows system.
444 0eea575a Panagiotis Kanavos
        /// </summary>
445 0eea575a Panagiotis Kanavos
        public bool IsDOSEntry
446 0eea575a Panagiotis Kanavos
        {
447 0eea575a Panagiotis Kanavos
            get {
448 0eea575a Panagiotis Kanavos
                return ((HostSystem == ( int )HostSystemID.Msdos) ||
449 0eea575a Panagiotis Kanavos
                        (HostSystem == ( int )HostSystemID.WindowsNT));
450 0eea575a Panagiotis Kanavos
            }
451 0eea575a Panagiotis Kanavos
        }
452 0eea575a Panagiotis Kanavos
453 0eea575a Panagiotis Kanavos
        /// <summary>
454 0eea575a Panagiotis Kanavos
        /// Test the external attributes for this <see cref="ZipEntry"/> to
455 0eea575a Panagiotis Kanavos
        /// see if the external attributes are Dos based (including WINNT and variants)
456 0eea575a Panagiotis Kanavos
        /// and match the values
457 0eea575a Panagiotis Kanavos
        /// </summary>
458 0eea575a Panagiotis Kanavos
        /// <param name="attributes">The attributes to test.</param>
459 0eea575a Panagiotis Kanavos
        /// <returns>Returns true if the external attributes are known to be DOS/Windows 
460 0eea575a Panagiotis Kanavos
        /// based and have the same attributes set as the value passed.</returns>
461 0eea575a Panagiotis Kanavos
        bool HasDosAttributes(int attributes)
462 0eea575a Panagiotis Kanavos
        {
463 0eea575a Panagiotis Kanavos
            bool result = false;
464 0eea575a Panagiotis Kanavos
            if ( (known & Known.ExternalAttributes) != 0 ) {
465 0eea575a Panagiotis Kanavos
                if ( ((HostSystem == (int)HostSystemID.Msdos) || 
466 0eea575a Panagiotis Kanavos
                      (HostSystem == (int)HostSystemID.WindowsNT)) && 
467 0eea575a Panagiotis Kanavos
                     (ExternalFileAttributes & attributes) == attributes) {
468 0eea575a Panagiotis Kanavos
                         result = true;
469 0eea575a Panagiotis Kanavos
                     }
470 0eea575a Panagiotis Kanavos
            }
471 0eea575a Panagiotis Kanavos
            return result;
472 0eea575a Panagiotis Kanavos
        }
473 0eea575a Panagiotis Kanavos
474 0eea575a Panagiotis Kanavos
        /// <summary>
475 0eea575a Panagiotis Kanavos
        /// Gets the compatability information for the <see cref="ExternalFileAttributes">external file attribute</see>
476 0eea575a Panagiotis Kanavos
        /// If the external file attributes are compatible with MS-DOS and can be read
477 0eea575a Panagiotis Kanavos
        /// by PKZIP for DOS version 2.04g then this value will be zero.  Otherwise the value
478 0eea575a Panagiotis Kanavos
        /// will be non-zero and identify the host system on which the attributes are compatible.
479 0eea575a Panagiotis Kanavos
        /// </summary>
480 0eea575a Panagiotis Kanavos
        /// 		
481 0eea575a Panagiotis Kanavos
        /// <remarks>
482 0eea575a Panagiotis Kanavos
        /// The values for this as defined in the Zip File format and by others are shown below.  The values are somewhat
483 0eea575a Panagiotis Kanavos
        /// misleading in some cases as they are not all used as shown.  You should consult the relevant documentation
484 0eea575a Panagiotis Kanavos
        /// to obtain up to date and correct information.  The modified appnote by the infozip group is
485 0eea575a Panagiotis Kanavos
        /// particularly helpful as it documents a lot of peculiarities.  The document is however a little dated.
486 0eea575a Panagiotis Kanavos
        /// <list type="table">
487 0eea575a Panagiotis Kanavos
        /// <item>0 - MS-DOS and OS/2 (FAT / VFAT / FAT32 file systems)</item>
488 0eea575a Panagiotis Kanavos
        /// <item>1 - Amiga</item>
489 0eea575a Panagiotis Kanavos
        /// <item>2 - OpenVMS</item>
490 0eea575a Panagiotis Kanavos
        /// <item>3 - Unix</item>
491 0eea575a Panagiotis Kanavos
        /// <item>4 - VM/CMS</item>
492 0eea575a Panagiotis Kanavos
        /// <item>5 - Atari ST</item>
493 0eea575a Panagiotis Kanavos
        /// <item>6 - OS/2 HPFS</item>
494 0eea575a Panagiotis Kanavos
        /// <item>7 - Macintosh</item>
495 0eea575a Panagiotis Kanavos
        /// <item>8 - Z-System</item>
496 0eea575a Panagiotis Kanavos
        /// <item>9 - CP/M</item>
497 0eea575a Panagiotis Kanavos
        /// <item>10 - Windows NTFS</item>
498 0eea575a Panagiotis Kanavos
        /// <item>11 - MVS (OS/390 - Z/OS)</item>
499 0eea575a Panagiotis Kanavos
        /// <item>12 - VSE</item>
500 0eea575a Panagiotis Kanavos
        /// <item>13 - Acorn Risc</item>
501 0eea575a Panagiotis Kanavos
        /// <item>14 - VFAT</item>
502 0eea575a Panagiotis Kanavos
        /// <item>15 - Alternate MVS</item>
503 0eea575a Panagiotis Kanavos
        /// <item>16 - BeOS</item>
504 0eea575a Panagiotis Kanavos
        /// <item>17 - Tandem</item>
505 0eea575a Panagiotis Kanavos
        /// <item>18 - OS/400</item>
506 0eea575a Panagiotis Kanavos
        /// <item>19 - OS/X (Darwin)</item>
507 0eea575a Panagiotis Kanavos
        /// <item>99 - WinZip AES</item>
508 0eea575a Panagiotis Kanavos
        /// <item>remainder - unused</item>
509 0eea575a Panagiotis Kanavos
        /// </list>
510 0eea575a Panagiotis Kanavos
        /// </remarks>
511 0eea575a Panagiotis Kanavos
        public int HostSystem 
512 0eea575a Panagiotis Kanavos
        {
513 0eea575a Panagiotis Kanavos
            get {
514 0eea575a Panagiotis Kanavos
                return (versionMadeBy >> 8) & 0xff; 
515 0eea575a Panagiotis Kanavos
            }
516 0eea575a Panagiotis Kanavos
517 0eea575a Panagiotis Kanavos
            set {
518 0eea575a Panagiotis Kanavos
                versionMadeBy &= 0xff;
519 0eea575a Panagiotis Kanavos
                versionMadeBy |= (ushort)((value & 0xff) << 8);
520 0eea575a Panagiotis Kanavos
            }
521 0eea575a Panagiotis Kanavos
        }
522 0eea575a Panagiotis Kanavos
		
523 0eea575a Panagiotis Kanavos
        /// <summary>
524 0eea575a Panagiotis Kanavos
        /// Get minimum Zip feature version required to extract this entry
525 0eea575a Panagiotis Kanavos
        /// </summary>		
526 0eea575a Panagiotis Kanavos
        /// <remarks>
527 0eea575a Panagiotis Kanavos
        /// Minimum features are defined as:<br/>
528 0eea575a Panagiotis Kanavos
        /// 1.0 - Default value<br/>
529 0eea575a Panagiotis Kanavos
        /// 1.1 - File is a volume label<br/>
530 0eea575a Panagiotis Kanavos
        /// 2.0 - File is a folder/directory<br/>
531 0eea575a Panagiotis Kanavos
        /// 2.0 - File is compressed using Deflate compression<br/>
532 0eea575a Panagiotis Kanavos
        /// 2.0 - File is encrypted using traditional encryption<br/>
533 0eea575a Panagiotis Kanavos
        /// 2.1 - File is compressed using Deflate64<br/>
534 0eea575a Panagiotis Kanavos
        /// 2.5 - File is compressed using PKWARE DCL Implode<br/>
535 0eea575a Panagiotis Kanavos
        /// 2.7 - File is a patch data set<br/>
536 0eea575a Panagiotis Kanavos
        /// 4.5 - File uses Zip64 format extensions<br/>
537 0eea575a Panagiotis Kanavos
        /// 4.6 - File is compressed using BZIP2 compression<br/>
538 0eea575a Panagiotis Kanavos
        /// 5.0 - File is encrypted using DES<br/>
539 0eea575a Panagiotis Kanavos
        /// 5.0 - File is encrypted using 3DES<br/>
540 0eea575a Panagiotis Kanavos
        /// 5.0 - File is encrypted using original RC2 encryption<br/>
541 0eea575a Panagiotis Kanavos
        /// 5.0 - File is encrypted using RC4 encryption<br/>
542 0eea575a Panagiotis Kanavos
        /// 5.1 - File is encrypted using AES encryption<br/>
543 0eea575a Panagiotis Kanavos
        /// 5.1 - File is encrypted using corrected RC2 encryption<br/>
544 0eea575a Panagiotis Kanavos
        /// 5.1 - File is encrypted using corrected RC2-64 encryption<br/>
545 0eea575a Panagiotis Kanavos
        /// 6.1 - File is encrypted using non-OAEP key wrapping<br/>
546 0eea575a Panagiotis Kanavos
        /// 6.2 - Central directory encryption (not confirmed yet)<br/>
547 0eea575a Panagiotis Kanavos
        /// 6.3 - File is compressed using LZMA<br/>
548 0eea575a Panagiotis Kanavos
        /// 6.3 - File is compressed using PPMD+<br/>
549 0eea575a Panagiotis Kanavos
        /// 6.3 - File is encrypted using Blowfish<br/>
550 0eea575a Panagiotis Kanavos
        /// 6.3 - File is encrypted using Twofish<br/>
551 0eea575a Panagiotis Kanavos
        /// </remarks>
552 0eea575a Panagiotis Kanavos
        /// <seealso cref="CanDecompress"></seealso>
553 0eea575a Panagiotis Kanavos
        public int Version 
554 0eea575a Panagiotis Kanavos
        {
555 0eea575a Panagiotis Kanavos
            get {
556 0eea575a Panagiotis Kanavos
                // Return recorded version if known.
557 0eea575a Panagiotis Kanavos
                if (versionToExtract != 0) {
558 0eea575a Panagiotis Kanavos
                    return versionToExtract;
559 0eea575a Panagiotis Kanavos
                } 
560 0eea575a Panagiotis Kanavos
                else {
561 0eea575a Panagiotis Kanavos
                    int result = 10;
562 0eea575a Panagiotis Kanavos
                    if ( CentralHeaderRequiresZip64 ) {
563 0eea575a Panagiotis Kanavos
                        result = ZipConstants.VersionZip64;	
564 0eea575a Panagiotis Kanavos
                    }
565 0eea575a Panagiotis Kanavos
                    else if (CompressionMethod.Deflated == method) {
566 0eea575a Panagiotis Kanavos
                        result = 20;
567 0eea575a Panagiotis Kanavos
                    } 
568 0eea575a Panagiotis Kanavos
                    else if (IsDirectory == true) {
569 0eea575a Panagiotis Kanavos
                        result = 20;
570 0eea575a Panagiotis Kanavos
                    } 
571 0eea575a Panagiotis Kanavos
                    else if (IsCrypted == true) {
572 0eea575a Panagiotis Kanavos
                        result = 20;
573 0eea575a Panagiotis Kanavos
                    } 
574 0eea575a Panagiotis Kanavos
                    else if (HasDosAttributes(0x08) ) {
575 0eea575a Panagiotis Kanavos
                        result = 11;
576 0eea575a Panagiotis Kanavos
                    }
577 0eea575a Panagiotis Kanavos
                    return result;
578 0eea575a Panagiotis Kanavos
                }
579 0eea575a Panagiotis Kanavos
            }
580 0eea575a Panagiotis Kanavos
        }
581 0eea575a Panagiotis Kanavos
582 0eea575a Panagiotis Kanavos
        /// <summary>
583 0eea575a Panagiotis Kanavos
        /// Get a value indicating wether this entry can be decompressed by the library.
584 0eea575a Panagiotis Kanavos
        /// </summary>
585 0eea575a Panagiotis Kanavos
        /// <remarks>This is based on the <see cref="Version"></see> and 
586 0eea575a Panagiotis Kanavos
        /// wether the <see cref="IsCompressionMethodSupported()">compression method</see> is supported.</remarks>
587 0eea575a Panagiotis Kanavos
        public bool CanDecompress
588 0eea575a Panagiotis Kanavos
        {
589 0eea575a Panagiotis Kanavos
            get {
590 0eea575a Panagiotis Kanavos
                return (Version <= ZipConstants.VersionMadeBy) &&
591 0eea575a Panagiotis Kanavos
                       ((Version == 10) ||
592 0eea575a Panagiotis Kanavos
                        (Version == 11) ||
593 0eea575a Panagiotis Kanavos
                        (Version == 20) ||
594 0eea575a Panagiotis Kanavos
                        (Version == 45)) &&
595 0eea575a Panagiotis Kanavos
                       IsCompressionMethodSupported();
596 0eea575a Panagiotis Kanavos
            }
597 0eea575a Panagiotis Kanavos
        }
598 0eea575a Panagiotis Kanavos
599 0eea575a Panagiotis Kanavos
        /// <summary>
600 0eea575a Panagiotis Kanavos
        /// Force this entry to be recorded using Zip64 extensions.
601 0eea575a Panagiotis Kanavos
        /// </summary>
602 0eea575a Panagiotis Kanavos
        public void ForceZip64()
603 0eea575a Panagiotis Kanavos
        {
604 0eea575a Panagiotis Kanavos
            forceZip64_ = true;
605 0eea575a Panagiotis Kanavos
        }
606 0eea575a Panagiotis Kanavos
		
607 0eea575a Panagiotis Kanavos
        /// <summary>
608 0eea575a Panagiotis Kanavos
        /// Get a value indicating wether Zip64 extensions were forced.
609 0eea575a Panagiotis Kanavos
        /// </summary>
610 0eea575a Panagiotis Kanavos
        /// <returns>A <see cref="bool"/> value of true if Zip64 extensions have been forced on; false if not.</returns>
611 0eea575a Panagiotis Kanavos
        public bool IsZip64Forced()
612 0eea575a Panagiotis Kanavos
        {
613 0eea575a Panagiotis Kanavos
            return forceZip64_;
614 0eea575a Panagiotis Kanavos
        }
615 0eea575a Panagiotis Kanavos
616 0eea575a Panagiotis Kanavos
        /// <summary>
617 0eea575a Panagiotis Kanavos
        /// Gets a value indicating if the entry requires Zip64 extensions 
618 0eea575a Panagiotis Kanavos
        /// to store the full entry values.
619 0eea575a Panagiotis Kanavos
        /// </summary>
620 0eea575a Panagiotis Kanavos
        /// <value>A <see cref="bool"/> value of true if a local header requires Zip64 extensions; false if not.</value>
621 0eea575a Panagiotis Kanavos
        public bool LocalHeaderRequiresZip64 
622 0eea575a Panagiotis Kanavos
        {
623 0eea575a Panagiotis Kanavos
            get {
624 0eea575a Panagiotis Kanavos
                bool result = forceZip64_;
625 0eea575a Panagiotis Kanavos
626 0eea575a Panagiotis Kanavos
                if ( !result ) {
627 0eea575a Panagiotis Kanavos
                    ulong trueCompressedSize = compressedSize;
628 0eea575a Panagiotis Kanavos
629 0eea575a Panagiotis Kanavos
                    if ( (versionToExtract == 0) && IsCrypted ) {
630 0eea575a Panagiotis Kanavos
                        trueCompressedSize += ZipConstants.CryptoHeaderSize;
631 0eea575a Panagiotis Kanavos
                    }
632 0eea575a Panagiotis Kanavos
633 0eea575a Panagiotis Kanavos
                    // TODO: A better estimation of the true limit based on compression overhead should be used
634 0eea575a Panagiotis Kanavos
                    // to determine when an entry should use Zip64.
635 0eea575a Panagiotis Kanavos
                    result =
636 0eea575a Panagiotis Kanavos
                        ((this.size >= uint.MaxValue) || (trueCompressedSize >= uint.MaxValue)) &&
637 0eea575a Panagiotis Kanavos
                        ((versionToExtract == 0) || (versionToExtract >= ZipConstants.VersionZip64));
638 0eea575a Panagiotis Kanavos
                }
639 0eea575a Panagiotis Kanavos
640 0eea575a Panagiotis Kanavos
                return result;
641 0eea575a Panagiotis Kanavos
            }
642 0eea575a Panagiotis Kanavos
        }
643 0eea575a Panagiotis Kanavos
		
644 0eea575a Panagiotis Kanavos
        /// <summary>
645 0eea575a Panagiotis Kanavos
        /// Get a value indicating wether the central directory entry requires Zip64 extensions to be stored.
646 0eea575a Panagiotis Kanavos
        /// </summary>
647 0eea575a Panagiotis Kanavos
        public bool CentralHeaderRequiresZip64
648 0eea575a Panagiotis Kanavos
        {
649 0eea575a Panagiotis Kanavos
            get {
650 0eea575a Panagiotis Kanavos
                return LocalHeaderRequiresZip64 || (offset >= uint.MaxValue);
651 0eea575a Panagiotis Kanavos
            }
652 0eea575a Panagiotis Kanavos
        }
653 0eea575a Panagiotis Kanavos
		
654 0eea575a Panagiotis Kanavos
        /// <summary>
655 0eea575a Panagiotis Kanavos
        /// Get/Set DosTime value.
656 0eea575a Panagiotis Kanavos
        /// </summary>
657 0eea575a Panagiotis Kanavos
        /// <remarks>
658 0eea575a Panagiotis Kanavos
        /// The MS-DOS date format can only represent dates between 1/1/1980 and 12/31/2107.
659 0eea575a Panagiotis Kanavos
        /// </remarks>
660 0eea575a Panagiotis Kanavos
        public long DosTime 
661 0eea575a Panagiotis Kanavos
        {
662 0eea575a Panagiotis Kanavos
            get {
663 0eea575a Panagiotis Kanavos
                if ((known & Known.Time) == 0) {
664 0eea575a Panagiotis Kanavos
                    return 0;
665 0eea575a Panagiotis Kanavos
                } 
666 0eea575a Panagiotis Kanavos
                else {
667 0eea575a Panagiotis Kanavos
                    return dosTime;
668 0eea575a Panagiotis Kanavos
                }
669 0eea575a Panagiotis Kanavos
            }
670 0eea575a Panagiotis Kanavos
			
671 0eea575a Panagiotis Kanavos
            set {
672 0eea575a Panagiotis Kanavos
                unchecked {
673 0eea575a Panagiotis Kanavos
                    dosTime = (uint)value;
674 0eea575a Panagiotis Kanavos
                }
675 0eea575a Panagiotis Kanavos
676 0eea575a Panagiotis Kanavos
                known |= Known.Time;
677 0eea575a Panagiotis Kanavos
            }
678 0eea575a Panagiotis Kanavos
        }
679 0eea575a Panagiotis Kanavos
			
680 0eea575a Panagiotis Kanavos
        /// <summary>
681 0eea575a Panagiotis Kanavos
        /// Gets/Sets the time of last modification of the entry.
682 0eea575a Panagiotis Kanavos
        /// </summary>
683 0eea575a Panagiotis Kanavos
        /// <remarks>
684 0eea575a Panagiotis Kanavos
        /// The <see cref="DosTime"></see> property is updated to match this as far as possible.
685 0eea575a Panagiotis Kanavos
        /// </remarks>
686 0eea575a Panagiotis Kanavos
        public DateTime DateTime 
687 0eea575a Panagiotis Kanavos
        {
688 0eea575a Panagiotis Kanavos
            get {
689 0eea575a Panagiotis Kanavos
                var sec  = Math.Min(59, (int) (2 * (dosTime & 0x1f)));
690 0eea575a Panagiotis Kanavos
                var min  = Math.Min(59, (int) ((dosTime >> 5) & 0x3f));
691 0eea575a Panagiotis Kanavos
                var hrs  = Math.Min(23, (int) ((dosTime >> 11) & 0x1f));
692 0eea575a Panagiotis Kanavos
                var mon  = Math.Max(1, Math.Min(12, (int) ((dosTime >> 21) & 0xf)));
693 0eea575a Panagiotis Kanavos
                var year = ((dosTime >> 25) & 0x7f) + 1980;
694 0eea575a Panagiotis Kanavos
                var day = Math.Max(1, Math.Min(DateTime.DaysInMonth((int)year, (int)mon), (int)((dosTime >> 16) & 0x1f)));
695 0eea575a Panagiotis Kanavos
                return new DateTime((int)year, (int)mon, day, (int)hrs, (int)min, (int)sec);
696 0eea575a Panagiotis Kanavos
            }
697 0eea575a Panagiotis Kanavos
            set {
698 0eea575a Panagiotis Kanavos
                var year = (uint) value.Year;
699 0eea575a Panagiotis Kanavos
                var month = (uint) value.Month;
700 0eea575a Panagiotis Kanavos
                var day = (uint) value.Day;
701 0eea575a Panagiotis Kanavos
                var hour = (uint) value.Hour;
702 0eea575a Panagiotis Kanavos
                var minute = (uint) value.Minute;
703 0eea575a Panagiotis Kanavos
                var second = (uint) value.Second;
704 0eea575a Panagiotis Kanavos
				
705 0eea575a Panagiotis Kanavos
                if ( year < 1980 ) {
706 0eea575a Panagiotis Kanavos
                    year = 1980;
707 0eea575a Panagiotis Kanavos
                    month = 1;
708 0eea575a Panagiotis Kanavos
                    day = 1;
709 0eea575a Panagiotis Kanavos
                    hour = 0;
710 0eea575a Panagiotis Kanavos
                    minute = 0;
711 0eea575a Panagiotis Kanavos
                    second = 0;
712 0eea575a Panagiotis Kanavos
                }
713 0eea575a Panagiotis Kanavos
                else if ( year > 2107 ) {
714 0eea575a Panagiotis Kanavos
                    year = 2107;
715 0eea575a Panagiotis Kanavos
                    month = 12;
716 0eea575a Panagiotis Kanavos
                    day = 31;
717 0eea575a Panagiotis Kanavos
                    hour = 23;
718 0eea575a Panagiotis Kanavos
                    minute = 59;
719 0eea575a Panagiotis Kanavos
                    second = 59;
720 0eea575a Panagiotis Kanavos
                }
721 0eea575a Panagiotis Kanavos
				
722 0eea575a Panagiotis Kanavos
                DosTime = ((year - 1980) & 0x7f) << 25 | 
723 0eea575a Panagiotis Kanavos
                          (month << 21) |
724 0eea575a Panagiotis Kanavos
                          (day << 16) |
725 0eea575a Panagiotis Kanavos
                          (hour << 11) |
726 0eea575a Panagiotis Kanavos
                          (minute << 5) |
727 0eea575a Panagiotis Kanavos
                          (second >> 1);
728 0eea575a Panagiotis Kanavos
            }
729 0eea575a Panagiotis Kanavos
        }
730 0eea575a Panagiotis Kanavos
		
731 0eea575a Panagiotis Kanavos
        /// <summary>
732 0eea575a Panagiotis Kanavos
        /// Returns the entry name.
733 0eea575a Panagiotis Kanavos
        /// </summary>
734 0eea575a Panagiotis Kanavos
        /// <remarks>
735 0eea575a Panagiotis Kanavos
        /// The unix naming convention is followed.
736 0eea575a Panagiotis Kanavos
        /// Path components in the entry should always separated by forward slashes ('/').
737 0eea575a Panagiotis Kanavos
        /// Dos device names like C: should also be removed.
738 0eea575a Panagiotis Kanavos
        /// See the <see cref="ZipNameTransform"/> class, or <see cref="CleanName(string)"/>
739 0eea575a Panagiotis Kanavos
        ///</remarks>
740 0eea575a Panagiotis Kanavos
        public string Name 
741 0eea575a Panagiotis Kanavos
        {
742 0eea575a Panagiotis Kanavos
            get {
743 0eea575a Panagiotis Kanavos
                return name;
744 0eea575a Panagiotis Kanavos
            }
745 0eea575a Panagiotis Kanavos
        }
746 0eea575a Panagiotis Kanavos
		
747 0eea575a Panagiotis Kanavos
        /// <summary>
748 0eea575a Panagiotis Kanavos
        /// Gets/Sets the size of the uncompressed data.
749 0eea575a Panagiotis Kanavos
        /// </summary>
750 0eea575a Panagiotis Kanavos
        /// <returns>
751 0eea575a Panagiotis Kanavos
        /// The size or -1 if unknown.
752 0eea575a Panagiotis Kanavos
        /// </returns>
753 0eea575a Panagiotis Kanavos
        /// <remarks>Setting the size before adding an entry to an archive can help
754 0eea575a Panagiotis Kanavos
        /// avoid compatability problems with some archivers which dont understand Zip64 extensions.</remarks>
755 0eea575a Panagiotis Kanavos
        public long Size 
756 0eea575a Panagiotis Kanavos
        {
757 0eea575a Panagiotis Kanavos
            get {
758 0eea575a Panagiotis Kanavos
                return (known & Known.Size) != 0 ? (long)size : -1L;
759 0eea575a Panagiotis Kanavos
            }
760 0eea575a Panagiotis Kanavos
            set {
761 0eea575a Panagiotis Kanavos
                this.size  = (ulong)value;
762 0eea575a Panagiotis Kanavos
                this.known |= Known.Size;
763 0eea575a Panagiotis Kanavos
            }
764 0eea575a Panagiotis Kanavos
        }
765 0eea575a Panagiotis Kanavos
		
766 0eea575a Panagiotis Kanavos
        /// <summary>
767 0eea575a Panagiotis Kanavos
        /// Gets/Sets the size of the compressed data.
768 0eea575a Panagiotis Kanavos
        /// </summary>
769 0eea575a Panagiotis Kanavos
        /// <returns>
770 0eea575a Panagiotis Kanavos
        /// The compressed entry size or -1 if unknown.
771 0eea575a Panagiotis Kanavos
        /// </returns>
772 0eea575a Panagiotis Kanavos
        public long CompressedSize 
773 0eea575a Panagiotis Kanavos
        {
774 0eea575a Panagiotis Kanavos
            get {
775 0eea575a Panagiotis Kanavos
                return (known & Known.CompressedSize) != 0 ? (long)compressedSize : -1L;
776 0eea575a Panagiotis Kanavos
            }
777 0eea575a Panagiotis Kanavos
            set {
778 0eea575a Panagiotis Kanavos
                this.compressedSize = (ulong)value;
779 0eea575a Panagiotis Kanavos
                this.known |= Known.CompressedSize;
780 0eea575a Panagiotis Kanavos
            }
781 0eea575a Panagiotis Kanavos
        }
782 0eea575a Panagiotis Kanavos
783 0eea575a Panagiotis Kanavos
        /// <summary>
784 0eea575a Panagiotis Kanavos
        /// Gets/Sets the crc of the uncompressed data.
785 0eea575a Panagiotis Kanavos
        /// </summary>
786 0eea575a Panagiotis Kanavos
        /// <exception cref="System.ArgumentOutOfRangeException">
787 0eea575a Panagiotis Kanavos
        /// Crc is not in the range 0..0xffffffffL
788 0eea575a Panagiotis Kanavos
        /// </exception>
789 0eea575a Panagiotis Kanavos
        /// <returns>
790 0eea575a Panagiotis Kanavos
        /// The crc value or -1 if unknown.
791 0eea575a Panagiotis Kanavos
        /// </returns>
792 0eea575a Panagiotis Kanavos
        public long Crc 
793 0eea575a Panagiotis Kanavos
        {
794 0eea575a Panagiotis Kanavos
            get {
795 0eea575a Panagiotis Kanavos
                return (known & Known.Crc) != 0 ? crc & 0xffffffffL : -1L;
796 0eea575a Panagiotis Kanavos
            }
797 0eea575a Panagiotis Kanavos
            set {
798 0eea575a Panagiotis Kanavos
                if (((ulong)crc & 0xffffffff00000000L) != 0) {
799 0eea575a Panagiotis Kanavos
                    throw new ArgumentOutOfRangeException("value");
800 0eea575a Panagiotis Kanavos
                }
801 0eea575a Panagiotis Kanavos
                this.crc = (uint)value;
802 0eea575a Panagiotis Kanavos
                this.known |= Known.Crc;
803 0eea575a Panagiotis Kanavos
            }
804 0eea575a Panagiotis Kanavos
        }
805 0eea575a Panagiotis Kanavos
		
806 0eea575a Panagiotis Kanavos
        /// <summary>
807 0eea575a Panagiotis Kanavos
        /// Gets/Sets the compression method. Only Deflated and Stored are supported.
808 0eea575a Panagiotis Kanavos
        /// </summary>
809 0eea575a Panagiotis Kanavos
        /// <returns>
810 0eea575a Panagiotis Kanavos
        /// The compression method for this entry
811 0eea575a Panagiotis Kanavos
        /// </returns>
812 0eea575a Panagiotis Kanavos
        /// <see cref="Zip.CompressionMethod.Deflated"/>
813 0eea575a Panagiotis Kanavos
        /// <see cref="Zip.CompressionMethod.Stored"/>
814 0eea575a Panagiotis Kanavos
        public CompressionMethod CompressionMethod {
815 0eea575a Panagiotis Kanavos
            get {
816 0eea575a Panagiotis Kanavos
                return method;
817 0eea575a Panagiotis Kanavos
            }
818 0eea575a Panagiotis Kanavos
819 0eea575a Panagiotis Kanavos
            set {
820 0eea575a Panagiotis Kanavos
                if ( !IsCompressionMethodSupported(value) ) {
821 0eea575a Panagiotis Kanavos
                    throw new NotSupportedException("Compression method not supported");
822 0eea575a Panagiotis Kanavos
                }
823 0eea575a Panagiotis Kanavos
                this.method = value;
824 0eea575a Panagiotis Kanavos
            }
825 0eea575a Panagiotis Kanavos
        }
826 0eea575a Panagiotis Kanavos
		
827 0eea575a Panagiotis Kanavos
        /// <summary>
828 0eea575a Panagiotis Kanavos
        /// Gets/Sets the extra data.
829 0eea575a Panagiotis Kanavos
        /// </summary>
830 0eea575a Panagiotis Kanavos
        /// <exception cref="System.ArgumentOutOfRangeException">
831 0eea575a Panagiotis Kanavos
        /// Extra data is longer than 64KB (0xffff) bytes.
832 0eea575a Panagiotis Kanavos
        /// </exception>
833 0eea575a Panagiotis Kanavos
        /// <returns>
834 0eea575a Panagiotis Kanavos
        /// Extra data or null if not set.
835 0eea575a Panagiotis Kanavos
        /// </returns>
836 0eea575a Panagiotis Kanavos
        public byte[] ExtraData {
837 0eea575a Panagiotis Kanavos
			
838 0eea575a Panagiotis Kanavos
            get {
839 0eea575a Panagiotis Kanavos
// TODO: This is slightly safer but less efficient.  Think about wether it should change.
840 0eea575a Panagiotis Kanavos
//				return (byte[]) extra.Clone();
841 0eea575a Panagiotis Kanavos
                return extra;
842 0eea575a Panagiotis Kanavos
            }
843 0eea575a Panagiotis Kanavos
844 0eea575a Panagiotis Kanavos
            set {
845 0eea575a Panagiotis Kanavos
                if (value == null) {
846 0eea575a Panagiotis Kanavos
                    extra = null;
847 0eea575a Panagiotis Kanavos
                }
848 0eea575a Panagiotis Kanavos
                else {
849 0eea575a Panagiotis Kanavos
                    if (value.Length > 0xffff) {
850 0eea575a Panagiotis Kanavos
                        throw new System.ArgumentOutOfRangeException("value");
851 0eea575a Panagiotis Kanavos
                    }
852 0eea575a Panagiotis Kanavos
				
853 0eea575a Panagiotis Kanavos
                    extra = new byte[value.Length];
854 0eea575a Panagiotis Kanavos
                    Array.Copy(value, 0, extra, 0, value.Length);
855 0eea575a Panagiotis Kanavos
                }
856 0eea575a Panagiotis Kanavos
            }
857 0eea575a Panagiotis Kanavos
        }
858 0eea575a Panagiotis Kanavos
		
859 0eea575a Panagiotis Kanavos
        /// <summary>
860 0eea575a Panagiotis Kanavos
        /// Process extra data fields updating the entry based on the contents.
861 0eea575a Panagiotis Kanavos
        /// </summary>
862 0eea575a Panagiotis Kanavos
        /// <param name="localHeader">True if the extra data fields should be handled
863 0eea575a Panagiotis Kanavos
        /// for a local header, rather than for a central header.
864 0eea575a Panagiotis Kanavos
        /// </param>
865 0eea575a Panagiotis Kanavos
        internal void ProcessExtraData(bool localHeader)
866 0eea575a Panagiotis Kanavos
        {
867 0eea575a Panagiotis Kanavos
            ZipExtraData extraData = new ZipExtraData(this.extra);
868 0eea575a Panagiotis Kanavos
869 0eea575a Panagiotis Kanavos
            if ( extraData.Find(0x0001) ) {
870 0eea575a Panagiotis Kanavos
                if ( (versionToExtract & 0xff) < ZipConstants.VersionZip64 ) {
871 0eea575a Panagiotis Kanavos
                    throw new ZipException("Zip64 Extended information found but version is not valid");
872 0eea575a Panagiotis Kanavos
                }
873 0eea575a Panagiotis Kanavos
874 0eea575a Panagiotis Kanavos
                // The recorded size will change but remember that this is zip64.
875 0eea575a Panagiotis Kanavos
                forceZip64_ = true;
876 0eea575a Panagiotis Kanavos
877 0eea575a Panagiotis Kanavos
                if ( extraData.ValueLength < 4 ) {
878 0eea575a Panagiotis Kanavos
                    throw new ZipException("Extra data extended Zip64 information length is invalid");
879 0eea575a Panagiotis Kanavos
                }
880 0eea575a Panagiotis Kanavos
881 0eea575a Panagiotis Kanavos
                if ( localHeader || (size == uint.MaxValue) ) {
882 0eea575a Panagiotis Kanavos
                    size = (ulong)extraData.ReadLong();
883 0eea575a Panagiotis Kanavos
                }
884 0eea575a Panagiotis Kanavos
885 0eea575a Panagiotis Kanavos
                if ( localHeader || (compressedSize == uint.MaxValue) ) {
886 0eea575a Panagiotis Kanavos
                    compressedSize = (ulong)extraData.ReadLong();
887 0eea575a Panagiotis Kanavos
                }
888 0eea575a Panagiotis Kanavos
889 0eea575a Panagiotis Kanavos
                if ( !localHeader && (offset == uint.MaxValue) ) {
890 0eea575a Panagiotis Kanavos
                    offset = extraData.ReadLong();
891 0eea575a Panagiotis Kanavos
                }
892 0eea575a Panagiotis Kanavos
            }
893 0eea575a Panagiotis Kanavos
            else {
894 0eea575a Panagiotis Kanavos
                if ( 
895 0eea575a Panagiotis Kanavos
                    ((versionToExtract & 0xff) >= ZipConstants.VersionZip64) &&
896 0eea575a Panagiotis Kanavos
                    ((size == uint.MaxValue) || (compressedSize == uint.MaxValue))
897 0eea575a Panagiotis Kanavos
                    ) {
898 0eea575a Panagiotis Kanavos
                        throw new ZipException("Zip64 Extended information required but is missing.");
899 0eea575a Panagiotis Kanavos
                    }
900 0eea575a Panagiotis Kanavos
            }
901 0eea575a Panagiotis Kanavos
902 0eea575a Panagiotis Kanavos
            if ( extraData.Find(10) ) {
903 0eea575a Panagiotis Kanavos
                // No room for any tags.
904 0eea575a Panagiotis Kanavos
                if ( extraData.ValueLength < 8 ) {
905 0eea575a Panagiotis Kanavos
                    throw new ZipException("NTFS Extra data invalid");
906 0eea575a Panagiotis Kanavos
                }
907 0eea575a Panagiotis Kanavos
908 0eea575a Panagiotis Kanavos
                extraData.ReadInt(); // Reserved
909 0eea575a Panagiotis Kanavos
910 0eea575a Panagiotis Kanavos
                while ( extraData.UnreadCount >= 4 ) {
911 0eea575a Panagiotis Kanavos
                    int ntfsTag = extraData.ReadShort();
912 0eea575a Panagiotis Kanavos
                    int ntfsLength = extraData.ReadShort();
913 0eea575a Panagiotis Kanavos
                    if ( ntfsTag == 1 ) {
914 0eea575a Panagiotis Kanavos
                        if ( ntfsLength >= 24 ) {
915 0eea575a Panagiotis Kanavos
                            long lastModification = extraData.ReadLong();
916 0eea575a Panagiotis Kanavos
                            long lastAccess = extraData.ReadLong();
917 0eea575a Panagiotis Kanavos
                            long createTime = extraData.ReadLong();
918 0eea575a Panagiotis Kanavos
919 0eea575a Panagiotis Kanavos
                            DateTime = System.DateTime.FromFileTime(lastModification);
920 0eea575a Panagiotis Kanavos
                        }
921 0eea575a Panagiotis Kanavos
                        break;
922 0eea575a Panagiotis Kanavos
                    }
923 0eea575a Panagiotis Kanavos
                    else {
924 0eea575a Panagiotis Kanavos
                        // An unknown NTFS tag so simply skip it.
925 0eea575a Panagiotis Kanavos
                        extraData.Skip(ntfsLength);
926 0eea575a Panagiotis Kanavos
                    }
927 0eea575a Panagiotis Kanavos
                }
928 0eea575a Panagiotis Kanavos
            }
929 0eea575a Panagiotis Kanavos
            else if ( extraData.Find(0x5455) ) {
930 0eea575a Panagiotis Kanavos
                int length = extraData.ValueLength;	
931 0eea575a Panagiotis Kanavos
                int flags = extraData.ReadByte();
932 0eea575a Panagiotis Kanavos
					
933 0eea575a Panagiotis Kanavos
                // Can include other times but these are ignored.  Length of data should
934 0eea575a Panagiotis Kanavos
                // actually be 1 + 4 * no of bits in flags.
935 0eea575a Panagiotis Kanavos
                if ( ((flags & 1) != 0) && (length >= 5) ) {
936 0eea575a Panagiotis Kanavos
                    int iTime = extraData.ReadInt();
937 0eea575a Panagiotis Kanavos
938 0eea575a Panagiotis Kanavos
                    DateTime = (new System.DateTime ( 1970, 1, 1, 0, 0, 0 ).ToUniversalTime() +
939 0eea575a Panagiotis Kanavos
                                new TimeSpan ( 0, 0, 0, iTime, 0 )).ToLocalTime();
940 0eea575a Panagiotis Kanavos
                }
941 0eea575a Panagiotis Kanavos
            }
942 0eea575a Panagiotis Kanavos
        }
943 0eea575a Panagiotis Kanavos
944 0eea575a Panagiotis Kanavos
        /// <summary>
945 0eea575a Panagiotis Kanavos
        /// Gets/Sets the entry comment.
946 0eea575a Panagiotis Kanavos
        /// </summary>
947 0eea575a Panagiotis Kanavos
        /// <exception cref="System.ArgumentOutOfRangeException">
948 0eea575a Panagiotis Kanavos
        /// If comment is longer than 0xffff.
949 0eea575a Panagiotis Kanavos
        /// </exception>
950 0eea575a Panagiotis Kanavos
        /// <returns>
951 0eea575a Panagiotis Kanavos
        /// The comment or null if not set.
952 0eea575a Panagiotis Kanavos
        /// </returns>
953 0eea575a Panagiotis Kanavos
        /// <remarks>
954 0eea575a Panagiotis Kanavos
        /// A comment is only available for entries when read via the <see cref="ZipFile"/> class.
955 0eea575a Panagiotis Kanavos
        /// The <see cref="ZipInputStream"/> class doesnt have the comment data available.
956 0eea575a Panagiotis Kanavos
        /// </remarks>
957 0eea575a Panagiotis Kanavos
        public string Comment {
958 0eea575a Panagiotis Kanavos
            get {
959 0eea575a Panagiotis Kanavos
                return comment;
960 0eea575a Panagiotis Kanavos
            }
961 0eea575a Panagiotis Kanavos
            set {
962 0eea575a Panagiotis Kanavos
                // This test is strictly incorrect as the length is in characters
963 0eea575a Panagiotis Kanavos
                // while the storage limit is in bytes.
964 0eea575a Panagiotis Kanavos
                // While the test is partially correct in that a comment of this length or greater 
965 0eea575a Panagiotis Kanavos
                // is definitely invalid, shorter comments may also have an invalid length
966 0eea575a Panagiotis Kanavos
                // where there are multi-byte characters
967 0eea575a Panagiotis Kanavos
                // The full test is not possible here however as the code page to apply conversions with
968 0eea575a Panagiotis Kanavos
                // isnt available.
969 0eea575a Panagiotis Kanavos
                if ( (value != null) && (value.Length > 0xffff) ) {
970 0eea575a Panagiotis Kanavos
                    throw new ArgumentOutOfRangeException("value", "cannot exceed 65535");
971 0eea575a Panagiotis Kanavos
                }
972 0eea575a Panagiotis Kanavos
				
973 0eea575a Panagiotis Kanavos
                comment = value;
974 0eea575a Panagiotis Kanavos
            }
975 0eea575a Panagiotis Kanavos
        }
976 0eea575a Panagiotis Kanavos
		
977 0eea575a Panagiotis Kanavos
        /// <summary>
978 0eea575a Panagiotis Kanavos
        /// Gets a value indicating if the entry is a directory.
979 0eea575a Panagiotis Kanavos
        /// however.
980 0eea575a Panagiotis Kanavos
        /// </summary>
981 0eea575a Panagiotis Kanavos
        /// <remarks>
982 0eea575a Panagiotis Kanavos
        /// A directory is determined by an entry name with a trailing slash '/'.
983 0eea575a Panagiotis Kanavos
        /// The external file attributes can also indicate an entry is for a directory.
984 0eea575a Panagiotis Kanavos
        /// Currently only dos/windows attributes are tested in this manner.
985 0eea575a Panagiotis Kanavos
        /// The trailing slash convention should always be followed.
986 0eea575a Panagiotis Kanavos
        /// </remarks>
987 0eea575a Panagiotis Kanavos
        public bool IsDirectory 
988 0eea575a Panagiotis Kanavos
        {
989 0eea575a Panagiotis Kanavos
            get {
990 0eea575a Panagiotis Kanavos
                int nameLength = name.Length;
991 0eea575a Panagiotis Kanavos
                bool result = 
992 0eea575a Panagiotis Kanavos
                    ((nameLength > 0) && 
993 0eea575a Panagiotis Kanavos
                     ((name[nameLength - 1] == '/') || (name[nameLength - 1] == '\\'))) ||
994 0eea575a Panagiotis Kanavos
                    HasDosAttributes(16)
995 0eea575a Panagiotis Kanavos
                    ;
996 0eea575a Panagiotis Kanavos
                return result;
997 0eea575a Panagiotis Kanavos
            }
998 0eea575a Panagiotis Kanavos
        }
999 0eea575a Panagiotis Kanavos
		
1000 0eea575a Panagiotis Kanavos
        /// <summary>
1001 0eea575a Panagiotis Kanavos
        /// Get a value of true if the entry appears to be a file; false otherwise
1002 0eea575a Panagiotis Kanavos
        /// </summary>
1003 0eea575a Panagiotis Kanavos
        /// <remarks>
1004 0eea575a Panagiotis Kanavos
        /// This only takes account of DOS/Windows attributes.  Other operating systems are ignored.
1005 0eea575a Panagiotis Kanavos
        /// For linux and others the result may be incorrect.
1006 0eea575a Panagiotis Kanavos
        /// </remarks>
1007 0eea575a Panagiotis Kanavos
        public bool IsFile
1008 0eea575a Panagiotis Kanavos
        {
1009 0eea575a Panagiotis Kanavos
            get {
1010 0eea575a Panagiotis Kanavos
                return !IsDirectory && !HasDosAttributes(8);
1011 0eea575a Panagiotis Kanavos
            }
1012 0eea575a Panagiotis Kanavos
        }
1013 0eea575a Panagiotis Kanavos
		
1014 0eea575a Panagiotis Kanavos
        /// <summary>
1015 0eea575a Panagiotis Kanavos
        /// Test entry to see if data can be extracted.
1016 0eea575a Panagiotis Kanavos
        /// </summary>
1017 0eea575a Panagiotis Kanavos
        /// <returns>Returns true if data can be extracted for this entry; false otherwise.</returns>
1018 0eea575a Panagiotis Kanavos
        public bool IsCompressionMethodSupported()
1019 0eea575a Panagiotis Kanavos
        {
1020 0eea575a Panagiotis Kanavos
            return IsCompressionMethodSupported(CompressionMethod);
1021 0eea575a Panagiotis Kanavos
        }
1022 0eea575a Panagiotis Kanavos
		
1023 0eea575a Panagiotis Kanavos
        #region ICloneable Members
1024 0eea575a Panagiotis Kanavos
        /// <summary>
1025 0eea575a Panagiotis Kanavos
        /// Creates a copy of this zip entry.
1026 0eea575a Panagiotis Kanavos
        /// </summary>
1027 0eea575a Panagiotis Kanavos
        /// <returns>An <see cref="Object"/> that is a copy of the current instance.</returns>
1028 0eea575a Panagiotis Kanavos
        public object Clone()
1029 0eea575a Panagiotis Kanavos
        {
1030 0eea575a Panagiotis Kanavos
            ZipEntry result = (ZipEntry)this.MemberwiseClone();
1031 0eea575a Panagiotis Kanavos
1032 0eea575a Panagiotis Kanavos
            // Ensure extra data is unique if it exists.
1033 0eea575a Panagiotis Kanavos
            if ( extra != null ) {
1034 0eea575a Panagiotis Kanavos
                result.extra = new byte[extra.Length];
1035 0eea575a Panagiotis Kanavos
                Array.Copy(extra, 0, result.extra, 0, extra.Length);
1036 0eea575a Panagiotis Kanavos
            }
1037 0eea575a Panagiotis Kanavos
1038 0eea575a Panagiotis Kanavos
            return result;
1039 0eea575a Panagiotis Kanavos
        }
1040 0eea575a Panagiotis Kanavos
		
1041 0eea575a Panagiotis Kanavos
        #endregion
1042 0eea575a Panagiotis Kanavos
1043 0eea575a Panagiotis Kanavos
        /// <summary>
1044 0eea575a Panagiotis Kanavos
        /// Gets a string representation of this ZipEntry.
1045 0eea575a Panagiotis Kanavos
        /// </summary>
1046 0eea575a Panagiotis Kanavos
        /// <returns>A readable textual representation of this <see cref="ZipEntry"/></returns>
1047 0eea575a Panagiotis Kanavos
        public override string ToString()
1048 0eea575a Panagiotis Kanavos
        {
1049 0eea575a Panagiotis Kanavos
            return name;
1050 0eea575a Panagiotis Kanavos
        }
1051 0eea575a Panagiotis Kanavos
1052 0eea575a Panagiotis Kanavos
        /// <summary>
1053 0eea575a Panagiotis Kanavos
        /// Test a <see cref="CompressionMethod">compression method</see> to see if this library
1054 0eea575a Panagiotis Kanavos
        /// supports extracting data compressed with that method
1055 0eea575a Panagiotis Kanavos
        /// </summary>
1056 0eea575a Panagiotis Kanavos
        /// <param name="method">The compression method to test.</param>
1057 0eea575a Panagiotis Kanavos
        /// <returns>Returns true if the compression method is supported; false otherwise</returns>
1058 0eea575a Panagiotis Kanavos
        public static bool IsCompressionMethodSupported(CompressionMethod method)
1059 0eea575a Panagiotis Kanavos
        {
1060 0eea575a Panagiotis Kanavos
            return
1061 0eea575a Panagiotis Kanavos
                ( method == CompressionMethod.Deflated ) ||
1062 0eea575a Panagiotis Kanavos
                ( method == CompressionMethod.Stored );
1063 0eea575a Panagiotis Kanavos
        }
1064 0eea575a Panagiotis Kanavos
		
1065 0eea575a Panagiotis Kanavos
        /// <summary>
1066 0eea575a Panagiotis Kanavos
        /// Cleans a name making it conform to Zip file conventions.
1067 0eea575a Panagiotis Kanavos
        /// Devices names ('c:\') and UNC share names ('\\server\share') are removed
1068 0eea575a Panagiotis Kanavos
        /// and forward slashes ('\') are converted to back slashes ('/').
1069 0eea575a Panagiotis Kanavos
        /// Names are made relative by trimming leading slashes which is compatible
1070 0eea575a Panagiotis Kanavos
        /// with the ZIP naming convention.
1071 0eea575a Panagiotis Kanavos
        /// </summary>
1072 0eea575a Panagiotis Kanavos
        /// <param name="name">The name to clean</param>
1073 0eea575a Panagiotis Kanavos
        /// <returns>The 'cleaned' name.</returns>
1074 0eea575a Panagiotis Kanavos
        /// <remarks>
1075 0eea575a Panagiotis Kanavos
        /// The <seealso cref="ZipNameTransform">Zip name transform</seealso> class is more flexible.
1076 0eea575a Panagiotis Kanavos
        /// </remarks>
1077 0eea575a Panagiotis Kanavos
        public static string CleanName(string name)
1078 0eea575a Panagiotis Kanavos
        {
1079 0eea575a Panagiotis Kanavos
            if (name == null) {
1080 0eea575a Panagiotis Kanavos
                return string.Empty;
1081 0eea575a Panagiotis Kanavos
            }
1082 0eea575a Panagiotis Kanavos
			
1083 0eea575a Panagiotis Kanavos
            if (Path.IsPathRooted(name) == true) {
1084 0eea575a Panagiotis Kanavos
                // NOTE:
1085 0eea575a Panagiotis Kanavos
                // for UNC names...  \\machine\share\zoom\beet.txt gives \zoom\beet.txt
1086 0eea575a Panagiotis Kanavos
                name = name.Substring(Path.GetPathRoot(name).Length);
1087 0eea575a Panagiotis Kanavos
            }
1088 0eea575a Panagiotis Kanavos
1089 0eea575a Panagiotis Kanavos
            name = name.Replace(@"\", "/");
1090 0eea575a Panagiotis Kanavos
			
1091 0eea575a Panagiotis Kanavos
            while ( (name.Length > 0) && (name[0] == '/')) {
1092 0eea575a Panagiotis Kanavos
                name = name.Remove(0, 1);
1093 0eea575a Panagiotis Kanavos
            }
1094 0eea575a Panagiotis Kanavos
            return name;
1095 0eea575a Panagiotis Kanavos
        }
1096 0eea575a Panagiotis Kanavos
1097 0eea575a Panagiotis Kanavos
        #region Instance Fields
1098 0eea575a Panagiotis Kanavos
        Known known;
1099 0eea575a Panagiotis Kanavos
        int    externalFileAttributes = -1;     // contains external attributes (O/S dependant)
1100 0eea575a Panagiotis Kanavos
		
1101 0eea575a Panagiotis Kanavos
        ushort versionMadeBy;					// Contains host system and version information
1102 0eea575a Panagiotis Kanavos
        // only relevant for central header entries
1103 0eea575a Panagiotis Kanavos
		
1104 0eea575a Panagiotis Kanavos
        string name;
1105 0eea575a Panagiotis Kanavos
        ulong  size;
1106 0eea575a Panagiotis Kanavos
        ulong  compressedSize;
1107 0eea575a Panagiotis Kanavos
        ushort versionToExtract;                // Version required to extract (library handles <= 2.0)
1108 0eea575a Panagiotis Kanavos
        uint   crc;
1109 0eea575a Panagiotis Kanavos
        uint   dosTime;
1110 0eea575a Panagiotis Kanavos
		
1111 0eea575a Panagiotis Kanavos
        CompressionMethod  method = CompressionMethod.Deflated;
1112 0eea575a Panagiotis Kanavos
        byte[] extra;
1113 0eea575a Panagiotis Kanavos
        string comment;
1114 0eea575a Panagiotis Kanavos
		
1115 0eea575a Panagiotis Kanavos
        int flags;                             // general purpose bit flags
1116 0eea575a Panagiotis Kanavos
1117 0eea575a Panagiotis Kanavos
        long zipFileIndex = -1;                // used by ZipFile
1118 0eea575a Panagiotis Kanavos
        long offset;                           // used by ZipFile and ZipOutputStream
1119 0eea575a Panagiotis Kanavos
		
1120 0eea575a Panagiotis Kanavos
        bool forceZip64_;
1121 0eea575a Panagiotis Kanavos
        byte cryptoCheckValue_;
1122 0eea575a Panagiotis Kanavos
        #endregion
1123 0eea575a Panagiotis Kanavos
    }
1124 0eea575a Panagiotis Kanavos
}