|  | // ZipFile.x-IEnumerable.cs | 
|  | // ------------------------------------------------------------------ | 
|  | // | 
|  | // Copyright (c) 2006, 2007, 2008, 2009 Dino Chiesa and Microsoft Corporation. | 
|  | // All rights reserved. | 
|  | // | 
|  | // This code module is part of DotNetZip, a zipfile class library. | 
|  | // | 
|  | // ------------------------------------------------------------------ | 
|  | // | 
|  | // This code is licensed under the Microsoft Public License. | 
|  | // See the file License.txt for the license details. | 
|  | // More info on: http://dotnetzip.codeplex.com | 
|  | // | 
|  | // ------------------------------------------------------------------ | 
|  | // | 
|  | // last saved (in emacs): | 
|  | // Time-stamp: <2009-December-26 15:13:26> | 
|  | // | 
|  | // ------------------------------------------------------------------ | 
|  | // | 
|  | // This module defines smoe methods for IEnumerable support. It is | 
|  | // particularly important for COM to have these things in a separate module. | 
|  | // | 
|  | // ------------------------------------------------------------------ | 
|  |  | 
|  |  | 
|  | namespace OfficeOpenXml.Packaging.Ionic.Zip | 
|  | { | 
|  |  | 
|  | // For some weird reason, the method with the DispId(-4) attribute, which is used as | 
|  | // the _NewEnum() method, and which is required to get enumeration to work from COM | 
|  | // environments like VBScript and Javascript (etc) must be the LAST MEMBER in the | 
|  | // source.  In the event of Partial classes, it needs to be the last member defined | 
|  | // in the last source module.  The source modules are ordered alphabetically by | 
|  | // filename.  Not sure why this is true. In any case, we put the enumeration stuff | 
|  | // here in this oddly-named module, for this reason. | 
|  | // | 
|  |  | 
|  |  | 
|  |  | 
|  | internal partial class ZipFile | 
|  | { | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | /// <summary> | 
|  | /// Generic IEnumerator support, for use of a ZipFile in an enumeration. | 
|  | /// </summary> | 
|  | /// | 
|  | /// <remarks> | 
|  | /// You probably do not want to call <c>GetEnumerator</c> explicitly. Instead | 
|  | /// it is implicitly called when you use a <see langword="foreach"/> loop in C#, or a | 
|  | /// <c>For Each</c> loop in VB.NET. | 
|  | /// </remarks> | 
|  | /// | 
|  | /// <example> | 
|  | /// This example reads a zipfile of a given name, then enumerates the | 
|  | /// entries in that zip file, and displays the information about each | 
|  | /// entry on the Console. | 
|  | /// <code> | 
|  | /// using (ZipFile zip = ZipFile.Read(zipfile)) | 
|  | /// { | 
|  | ///   bool header = true; | 
|  | ///   foreach (ZipEntry e in zip) | 
|  | ///   { | 
|  | ///     if (header) | 
|  | ///     { | 
|  | ///        System.Console.WriteLine("Zipfile: {0}", zip.Name); | 
|  | ///        System.Console.WriteLine("Version Needed: 0x{0:X2}", e.VersionNeeded); | 
|  | ///        System.Console.WriteLine("BitField: 0x{0:X2}", e.BitField); | 
|  | ///        System.Console.WriteLine("Compression Method: 0x{0:X2}", e.CompressionMethod); | 
|  | ///        System.Console.WriteLine("\n{1,-22} {2,-6} {3,4}   {4,-8}  {0}", | 
|  | ///                     "Filename", "Modified", "Size", "Ratio", "Packed"); | 
|  | ///        System.Console.WriteLine(new System.String('-', 72)); | 
|  | ///        header = false; | 
|  | ///     } | 
|  | /// | 
|  | ///     System.Console.WriteLine("{1,-22} {2,-6} {3,4:F0}%   {4,-8}  {0}", | 
|  | ///                 e.FileName, | 
|  | ///                 e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"), | 
|  | ///                 e.UncompressedSize, | 
|  | ///                 e.CompressionRatio, | 
|  | ///                 e.CompressedSize); | 
|  | /// | 
|  | ///     e.Extract(); | 
|  | ///   } | 
|  | /// } | 
|  | /// </code> | 
|  | /// | 
|  | /// <code lang="VB"> | 
|  | ///   Dim ZipFileToExtract As String = "c:\foo.zip" | 
|  | ///   Using zip As ZipFile = ZipFile.Read(ZipFileToExtract) | 
|  | ///       Dim header As Boolean = True | 
|  | ///       Dim e As ZipEntry | 
|  | ///       For Each e In zip | 
|  | ///           If header Then | 
|  | ///               Console.WriteLine("Zipfile: {0}", zip.Name) | 
|  | ///               Console.WriteLine("Version Needed: 0x{0:X2}", e.VersionNeeded) | 
|  | ///               Console.WriteLine("BitField: 0x{0:X2}", e.BitField) | 
|  | ///               Console.WriteLine("Compression Method: 0x{0:X2}", e.CompressionMethod) | 
|  | ///               Console.WriteLine(ChrW(10) & "{1,-22} {2,-6} {3,4}   {4,-8}  {0}", _ | 
|  | ///                 "Filename", "Modified", "Size", "Ratio", "Packed" ) | 
|  | ///               Console.WriteLine(New String("-"c, 72)) | 
|  | ///               header = False | 
|  | ///           End If | 
|  | ///           Console.WriteLine("{1,-22} {2,-6} {3,4:F0}%   {4,-8}  {0}", _ | 
|  | ///             e.FileName, _ | 
|  | ///             e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"), _ | 
|  | ///             e.UncompressedSize, _ | 
|  | ///             e.CompressionRatio, _ | 
|  | ///             e.CompressedSize ) | 
|  | ///           e.Extract | 
|  | ///       Next | 
|  | ///   End Using | 
|  | /// </code> | 
|  | /// </example> | 
|  | /// | 
|  | /// <returns>A generic enumerator suitable for use  within a foreach loop.</returns> | 
|  | public System.Collections.Generic.IEnumerator<ZipEntry> GetEnumerator() | 
|  | { | 
|  | foreach (ZipEntry e in _entries.Values) | 
|  | yield return e; | 
|  | } | 
|  |  | 
|  | System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() | 
|  | { | 
|  | return GetEnumerator(); | 
|  | } | 
|  |  | 
|  |  | 
|  | /// <summary> | 
|  | /// An IEnumerator, for use of a ZipFile in a foreach construct. | 
|  | /// </summary> | 
|  | /// | 
|  | /// <remarks> | 
|  | /// This method is included for COM support.  An application generally does not call | 
|  | /// this method directly.  It is called implicitly by COM clients when enumerating | 
|  | /// the entries in the ZipFile instance.  In VBScript, this is done with a <c>For Each</c> | 
|  | /// statement.  In Javascript, this is done with <c>new Enumerator(zipfile)</c>. | 
|  | /// </remarks> | 
|  | /// | 
|  | /// <returns> | 
|  | /// The IEnumerator over the entries in the ZipFile. | 
|  | /// </returns> | 
|  | [System.Runtime.InteropServices.DispId(-4)] | 
|  | public System.Collections.IEnumerator GetNewEnum()          // the name of this method is not significant | 
|  | { | 
|  | return GetEnumerator(); | 
|  | } | 
|  |  | 
|  | } | 
|  | } |