| // Events.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: <2011-August-06 12:26:24> | 
 | // | 
 | // ------------------------------------------------------------------ | 
 | // | 
 | // This module defines events used by the ZipFile class. | 
 | // | 
 | // | 
 |  | 
 | using System; | 
 | using System.Collections.Generic; | 
 | using System.Text; | 
 |  | 
 | namespace OfficeOpenXml.Packaging.Ionic.Zip | 
 | { | 
 |     /// <summary> | 
 |     ///   Delegate in which the application writes the <c>ZipEntry</c> content for the named entry. | 
 |     /// </summary> | 
 |     /// | 
 |     /// <param name="entryName">The name of the entry that must be written.</param> | 
 |     /// <param name="stream">The stream to which the entry data should be written.</param> | 
 |     /// | 
 |     /// <remarks> | 
 |     ///   When you add an entry and specify a <c>WriteDelegate</c>, via <see | 
 |     ///   cref="Ionic.Zip.ZipFile.AddEntry(string, WriteDelegate)"/>, the application | 
 |     ///   code provides the logic that writes the entry data directly into the zip file. | 
 |     /// </remarks> | 
 |     /// | 
 |     /// <example> | 
 |     /// | 
 |     /// This example shows how to define a WriteDelegate that obtains a DataSet, and then | 
 |     /// writes the XML for the DataSet into the zip archive.  There's no need to | 
 |     /// save the XML to a disk file first. | 
 |     /// | 
 |     /// <code lang="C#"> | 
 |     /// private void WriteEntry (String filename, Stream output) | 
 |     /// { | 
 |     ///     DataSet ds1 = ObtainDataSet(); | 
 |     ///     ds1.WriteXml(output); | 
 |     /// } | 
 |     /// | 
 |     /// private void Run() | 
 |     /// { | 
 |     ///     using (var zip = new ZipFile()) | 
 |     ///     { | 
 |     ///         zip.AddEntry(zipEntryName, WriteEntry); | 
 |     ///         zip.Save(zipFileName); | 
 |     ///     } | 
 |     /// } | 
 |     /// </code> | 
 |     /// | 
 |     /// <code lang="vb"> | 
 |     /// Private Sub WriteEntry (ByVal filename As String, ByVal output As Stream) | 
 |     ///     DataSet ds1 = ObtainDataSet() | 
 |     ///     ds1.WriteXml(stream) | 
 |     /// End Sub | 
 |     /// | 
 |     /// Public Sub Run() | 
 |     ///     Using zip = New ZipFile | 
 |     ///         zip.AddEntry(zipEntryName, New WriteDelegate(AddressOf WriteEntry)) | 
 |     ///         zip.Save(zipFileName) | 
 |     ///     End Using | 
 |     /// End Sub | 
 |     /// </code> | 
 |     /// </example> | 
 |     /// <seealso cref="Ionic.Zip.ZipFile.AddEntry(string, WriteDelegate)"/> | 
 |     public delegate void WriteDelegate(string entryName, System.IO.Stream stream); | 
 |  | 
 |  | 
 |     /// <summary> | 
 |     ///   Delegate in which the application opens the stream, just-in-time, for the named entry. | 
 |     /// </summary> | 
 |     /// | 
 |     /// <param name="entryName"> | 
 |     /// The name of the ZipEntry that the application should open the stream for. | 
 |     /// </param> | 
 |     /// | 
 |     /// <remarks> | 
 |     ///   When you add an entry via <see cref="Ionic.Zip.ZipFile.AddEntry(string, | 
 |     ///   OpenDelegate, CloseDelegate)"/>, the application code provides the logic that | 
 |     ///   opens and closes the stream for the given ZipEntry. | 
 |     /// </remarks> | 
 |     /// | 
 |     /// <seealso cref="Ionic.Zip.ZipFile.AddEntry(string, OpenDelegate, CloseDelegate)"/> | 
 |     public delegate System.IO.Stream OpenDelegate(string entryName); | 
 |  | 
 |     /// <summary> | 
 |     ///   Delegate in which the application closes the stream, just-in-time, for the named entry. | 
 |     /// </summary> | 
 |     /// | 
 |     /// <param name="entryName"> | 
 |     /// The name of the ZipEntry that the application should close the stream for. | 
 |     /// </param> | 
 |     /// | 
 |     /// <param name="stream">The stream to be closed.</param> | 
 |     /// | 
 |     /// <remarks> | 
 |     ///   When you add an entry via <see cref="Ionic.Zip.ZipFile.AddEntry(string, | 
 |     ///   OpenDelegate, CloseDelegate)"/>, the application code provides the logic that | 
 |     ///   opens and closes the stream for the given ZipEntry. | 
 |     /// </remarks> | 
 |     /// | 
 |     /// <seealso cref="Ionic.Zip.ZipFile.AddEntry(string, OpenDelegate, CloseDelegate)"/> | 
 |     public delegate void CloseDelegate(string entryName, System.IO.Stream stream); | 
 |  | 
 |     /// <summary> | 
 |     ///   Delegate for the callback by which the application tells the | 
 |     ///   library the CompressionLevel to use for a file. | 
 |     /// </summary> | 
 |     /// | 
 |     /// <remarks> | 
 |     /// <para> | 
 |     ///   Using this callback, the application can, for example, specify that | 
 |     ///   previously-compressed files (.mp3, .png, .docx, etc) should use a | 
 |     ///   <c>CompressionLevel</c> of <c>None</c>, or can set the compression level based | 
 |     ///   on any other factor. | 
 |     /// </para> | 
 |     /// </remarks> | 
 |     /// <seealso cref="Ionic.Zip.ZipFile.SetCompression"/> | 
 |     public delegate OfficeOpenXml.Packaging.Ionic.Zlib.CompressionLevel SetCompressionCallback(string localFileName, string fileNameInArchive); | 
 |  | 
 |     /// <summary> | 
 |     ///   In an EventArgs type, indicates which sort of progress event is being | 
 |     ///   reported. | 
 |     /// </summary> | 
 |     /// <remarks> | 
 |     ///   There are events for reading, events for saving, and events for | 
 |     ///   extracting. This enumeration allows a single EventArgs type to be sued to | 
 |     ///   describe one of multiple subevents. For example, a SaveProgress event is | 
 |     ///   invoked before, after, and during the saving of a single entry.  The value | 
 |     ///   of an enum with this type, specifies which event is being triggered.  The | 
 |     ///   same applies to Extraction, Reading and Adding events. | 
 |     /// </remarks> | 
 |     internal enum ZipProgressEventType | 
 |     { | 
 |         /// <summary> | 
 |         /// Indicates that a Add() operation has started. | 
 |         /// </summary> | 
 |         Adding_Started, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that an individual entry in the archive has been added. | 
 |         /// </summary> | 
 |         Adding_AfterAddEntry, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that a Add() operation has completed. | 
 |         /// </summary> | 
 |         Adding_Completed, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that a Read() operation has started. | 
 |         /// </summary> | 
 |         Reading_Started, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that an individual entry in the archive is about to be read. | 
 |         /// </summary> | 
 |         Reading_BeforeReadEntry, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that an individual entry in the archive has just been read. | 
 |         /// </summary> | 
 |         Reading_AfterReadEntry, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that a Read() operation has completed. | 
 |         /// </summary> | 
 |         Reading_Completed, | 
 |  | 
 |         /// <summary> | 
 |         /// The given event reports the number of bytes read so far | 
 |         /// during a Read() operation. | 
 |         /// </summary> | 
 |         Reading_ArchiveBytesRead, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that a Save() operation has started. | 
 |         /// </summary> | 
 |         Saving_Started, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that an individual entry in the archive is about to be written. | 
 |         /// </summary> | 
 |         Saving_BeforeWriteEntry, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that an individual entry in the archive has just been saved. | 
 |         /// </summary> | 
 |         Saving_AfterWriteEntry, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that a Save() operation has completed. | 
 |         /// </summary> | 
 |         Saving_Completed, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that the zip archive has been created in a | 
 |         /// temporary location during a Save() operation. | 
 |         /// </summary> | 
 |         Saving_AfterSaveTempArchive, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that the temporary file is about to be renamed to the final archive | 
 |         /// name during a Save() operation. | 
 |         /// </summary> | 
 |         Saving_BeforeRenameTempArchive, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that the temporary file is has just been renamed to the final archive | 
 |         /// name during a Save() operation. | 
 |         /// </summary> | 
 |         Saving_AfterRenameTempArchive, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that the self-extracting archive has been compiled | 
 |         /// during a Save() operation. | 
 |         /// </summary> | 
 |         Saving_AfterCompileSelfExtractor, | 
 |  | 
 |         /// <summary> | 
 |         /// The given event is reporting the number of source bytes that have run through the compressor so far | 
 |         /// during a Save() operation. | 
 |         /// </summary> | 
 |         Saving_EntryBytesRead, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that an entry is about to be extracted. | 
 |         /// </summary> | 
 |         Extracting_BeforeExtractEntry, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that an entry has just been extracted. | 
 |         /// </summary> | 
 |         Extracting_AfterExtractEntry, | 
 |  | 
 |         /// <summary> | 
 |         ///   Indicates that extraction of an entry would overwrite an existing | 
 |         ///   filesystem file. You must use | 
 |         ///   <see cref="ExtractExistingFileAction.InvokeExtractProgressEvent"> | 
 |         ///   ExtractExistingFileAction.InvokeExtractProgressEvent</see> in the call | 
 |         ///   to <c>ZipEntry.Extract()</c> in order to receive this event. | 
 |         /// </summary> | 
 |         Extracting_ExtractEntryWouldOverwrite, | 
 |  | 
 |         /// <summary> | 
 |         ///   The given event is reporting the number of bytes written so far for | 
 |         ///   the current entry during an Extract() operation. | 
 |         /// </summary> | 
 |         Extracting_EntryBytesWritten, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that an ExtractAll operation is about to begin. | 
 |         /// </summary> | 
 |         Extracting_BeforeExtractAll, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that an ExtractAll operation has completed. | 
 |         /// </summary> | 
 |         Extracting_AfterExtractAll, | 
 |  | 
 |         /// <summary> | 
 |         /// Indicates that an error has occurred while saving a zip file. | 
 |         /// This generally means the file cannot be opened, because it has been | 
 |         /// removed, or because it is locked by another process.  It can also | 
 |         /// mean that the file cannot be Read, because of a range lock conflict. | 
 |         /// </summary> | 
 |         Error_Saving, | 
 |     } | 
 |  | 
 |  | 
 |     /// <summary> | 
 |     /// Provides information about the progress of a save, read, or extract operation. | 
 |     /// This is a base class; you will probably use one of the classes derived from this one. | 
 |     /// </summary> | 
 |     internal class ZipProgressEventArgs : EventArgs | 
 |     { | 
 |         private int _entriesTotal; | 
 |         private bool _cancel; | 
 |         private ZipEntry _latestEntry; | 
 |         private ZipProgressEventType _flavor; | 
 |         private String _archiveName; | 
 |         private Int64 _bytesTransferred; | 
 |         private Int64 _totalBytesToTransfer; | 
 |  | 
 |  | 
 |         internal ZipProgressEventArgs() { } | 
 |  | 
 |         internal ZipProgressEventArgs(string archiveName, ZipProgressEventType flavor) | 
 |         { | 
 |             this._archiveName = archiveName; | 
 |             this._flavor = flavor; | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// The total number of entries to be saved or extracted. | 
 |         /// </summary> | 
 |         public int EntriesTotal | 
 |         { | 
 |             get { return _entriesTotal; } | 
 |             set { _entriesTotal = value; } | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// The name of the last entry saved or extracted. | 
 |         /// </summary> | 
 |         public ZipEntry CurrentEntry | 
 |         { | 
 |             get { return _latestEntry; } | 
 |             set { _latestEntry = value; } | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// In an event handler, set this to cancel the save or extract | 
 |         /// operation that is in progress. | 
 |         /// </summary> | 
 |         public bool Cancel | 
 |         { | 
 |             get { return _cancel; } | 
 |             set { _cancel = _cancel || value; } | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// The type of event being reported. | 
 |         /// </summary> | 
 |         public ZipProgressEventType EventType | 
 |         { | 
 |             get { return _flavor; } | 
 |             set { _flavor = value; } | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// Returns the archive name associated to this event. | 
 |         /// </summary> | 
 |         public String ArchiveName | 
 |         { | 
 |             get { return _archiveName; } | 
 |             set { _archiveName = value; } | 
 |         } | 
 |  | 
 |  | 
 |         /// <summary> | 
 |         /// The number of bytes read or written so far for this entry. | 
 |         /// </summary> | 
 |         public Int64 BytesTransferred | 
 |         { | 
 |             get { return _bytesTransferred; } | 
 |             set { _bytesTransferred = value; } | 
 |         } | 
 |  | 
 |  | 
 |  | 
 |         /// <summary> | 
 |         /// Total number of bytes that will be read or written for this entry. | 
 |         /// This number will be -1 if the value cannot be determined. | 
 |         /// </summary> | 
 |         public Int64 TotalBytesToTransfer | 
 |         { | 
 |             get { return _totalBytesToTransfer; } | 
 |             set { _totalBytesToTransfer = value; } | 
 |         } | 
 |     } | 
 |  | 
 |  | 
 |  | 
 |     /// <summary> | 
 |     /// Provides information about the progress of a Read operation. | 
 |     /// </summary> | 
 |     internal class ReadProgressEventArgs : ZipProgressEventArgs | 
 |     { | 
 |  | 
 |         internal ReadProgressEventArgs() { } | 
 |  | 
 |         private ReadProgressEventArgs(string archiveName, ZipProgressEventType flavor) | 
 |             : base(archiveName, flavor) | 
 |         { } | 
 |  | 
 |         internal static ReadProgressEventArgs Before(string archiveName, int entriesTotal) | 
 |         { | 
 |             var x = new ReadProgressEventArgs(archiveName, ZipProgressEventType.Reading_BeforeReadEntry); | 
 |             x.EntriesTotal = entriesTotal; | 
 |             return x; | 
 |         } | 
 |  | 
 |         internal static ReadProgressEventArgs After(string archiveName, ZipEntry entry, int entriesTotal) | 
 |         { | 
 |             var x = new ReadProgressEventArgs(archiveName, ZipProgressEventType.Reading_AfterReadEntry); | 
 |             x.EntriesTotal = entriesTotal; | 
 |             x.CurrentEntry = entry; | 
 |             return x; | 
 |         } | 
 |  | 
 |         internal static ReadProgressEventArgs Started(string archiveName) | 
 |         { | 
 |             var x = new ReadProgressEventArgs(archiveName, ZipProgressEventType.Reading_Started); | 
 |             return x; | 
 |         } | 
 |  | 
 |         internal static ReadProgressEventArgs ByteUpdate(string archiveName, ZipEntry entry, Int64 bytesXferred, Int64 totalBytes) | 
 |         { | 
 |             var x = new ReadProgressEventArgs(archiveName, ZipProgressEventType.Reading_ArchiveBytesRead); | 
 |             x.CurrentEntry = entry; | 
 |             x.BytesTransferred = bytesXferred; | 
 |             x.TotalBytesToTransfer = totalBytes; | 
 |             return x; | 
 |         } | 
 |  | 
 |         internal static ReadProgressEventArgs Completed(string archiveName) | 
 |         { | 
 |             var x = new ReadProgressEventArgs(archiveName, ZipProgressEventType.Reading_Completed); | 
 |             return x; | 
 |         } | 
 |  | 
 |     } | 
 |  | 
 |  | 
 |     /// <summary> | 
 |     /// Provides information about the progress of a Add operation. | 
 |     /// </summary> | 
 |     internal class AddProgressEventArgs : ZipProgressEventArgs | 
 |     { | 
 |         internal AddProgressEventArgs() { } | 
 |  | 
 |         private AddProgressEventArgs(string archiveName, ZipProgressEventType flavor) | 
 |             : base(archiveName, flavor) | 
 |         { } | 
 |  | 
 |         internal static AddProgressEventArgs AfterEntry(string archiveName, ZipEntry entry, int entriesTotal) | 
 |         { | 
 |             var x = new AddProgressEventArgs(archiveName, ZipProgressEventType.Adding_AfterAddEntry); | 
 |             x.EntriesTotal = entriesTotal; | 
 |             x.CurrentEntry = entry; | 
 |             return x; | 
 |         } | 
 |  | 
 |         internal static AddProgressEventArgs Started(string archiveName) | 
 |         { | 
 |             var x = new AddProgressEventArgs(archiveName, ZipProgressEventType.Adding_Started); | 
 |             return x; | 
 |         } | 
 |  | 
 |         internal static AddProgressEventArgs Completed(string archiveName) | 
 |         { | 
 |             var x = new AddProgressEventArgs(archiveName, ZipProgressEventType.Adding_Completed); | 
 |             return x; | 
 |         } | 
 |  | 
 |     } | 
 |  | 
 |     /// <summary> | 
 |     /// Provides information about the progress of a save operation. | 
 |     /// </summary> | 
 |     internal class SaveProgressEventArgs : ZipProgressEventArgs | 
 |     { | 
 |         private int _entriesSaved; | 
 |  | 
 |         /// <summary> | 
 |         /// Constructor for the SaveProgressEventArgs. | 
 |         /// </summary> | 
 |         /// <param name="archiveName">the name of the zip archive.</param> | 
 |         /// <param name="before">whether this is before saving the entry, or after</param> | 
 |         /// <param name="entriesTotal">The total number of entries in the zip archive.</param> | 
 |         /// <param name="entriesSaved">Number of entries that have been saved.</param> | 
 |         /// <param name="entry">The entry involved in the event.</param> | 
 |         internal SaveProgressEventArgs(string archiveName, bool before, int entriesTotal, int entriesSaved, ZipEntry entry) | 
 |             : base(archiveName, (before) ? ZipProgressEventType.Saving_BeforeWriteEntry : ZipProgressEventType.Saving_AfterWriteEntry) | 
 |         { | 
 |             this.EntriesTotal = entriesTotal; | 
 |             this.CurrentEntry = entry; | 
 |             this._entriesSaved = entriesSaved; | 
 |         } | 
 |  | 
 |         internal SaveProgressEventArgs() { } | 
 |  | 
 |         internal SaveProgressEventArgs(string archiveName, ZipProgressEventType flavor) | 
 |             : base(archiveName, flavor) | 
 |         { } | 
 |  | 
 |  | 
 |         internal static SaveProgressEventArgs ByteUpdate(string archiveName, ZipEntry entry, Int64 bytesXferred, Int64 totalBytes) | 
 |         { | 
 |             var x = new SaveProgressEventArgs(archiveName, ZipProgressEventType.Saving_EntryBytesRead); | 
 |             x.ArchiveName = archiveName; | 
 |             x.CurrentEntry = entry; | 
 |             x.BytesTransferred = bytesXferred; | 
 |             x.TotalBytesToTransfer = totalBytes; | 
 |             return x; | 
 |         } | 
 |  | 
 |         internal static SaveProgressEventArgs Started(string archiveName) | 
 |         { | 
 |             var x = new SaveProgressEventArgs(archiveName, ZipProgressEventType.Saving_Started); | 
 |             return x; | 
 |         } | 
 |  | 
 |         internal static SaveProgressEventArgs Completed(string archiveName) | 
 |         { | 
 |             var x = new SaveProgressEventArgs(archiveName, ZipProgressEventType.Saving_Completed); | 
 |             return x; | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// Number of entries saved so far. | 
 |         /// </summary> | 
 |         public int EntriesSaved | 
 |         { | 
 |             get { return _entriesSaved; } | 
 |         } | 
 |     } | 
 |  | 
 |  | 
 |     /// <summary> | 
 |     /// Provides information about the progress of the extract operation. | 
 |     /// </summary> | 
 |     internal class ExtractProgressEventArgs : ZipProgressEventArgs | 
 |     { | 
 |         private int _entriesExtracted; | 
 |         private string _target; | 
 |  | 
 |         /// <summary> | 
 |         /// Constructor for the ExtractProgressEventArgs. | 
 |         /// </summary> | 
 |         /// <param name="archiveName">the name of the zip archive.</param> | 
 |         /// <param name="before">whether this is before saving the entry, or after</param> | 
 |         /// <param name="entriesTotal">The total number of entries in the zip archive.</param> | 
 |         /// <param name="entriesExtracted">Number of entries that have been extracted.</param> | 
 |         /// <param name="entry">The entry involved in the event.</param> | 
 |         /// <param name="extractLocation">The location to which entries are extracted.</param> | 
 |         internal ExtractProgressEventArgs(string archiveName, bool before, int entriesTotal, int entriesExtracted, ZipEntry entry, string extractLocation) | 
 |             : base(archiveName, (before) ? ZipProgressEventType.Extracting_BeforeExtractEntry : ZipProgressEventType.Extracting_AfterExtractEntry) | 
 |         { | 
 |             this.EntriesTotal = entriesTotal; | 
 |             this.CurrentEntry = entry; | 
 |             this._entriesExtracted = entriesExtracted; | 
 |             this._target = extractLocation; | 
 |         } | 
 |  | 
 |         internal ExtractProgressEventArgs(string archiveName, ZipProgressEventType flavor) | 
 |             : base(archiveName, flavor) | 
 |         { } | 
 |  | 
 |         internal ExtractProgressEventArgs() | 
 |         { } | 
 |  | 
 |  | 
 |         internal static ExtractProgressEventArgs BeforeExtractEntry(string archiveName, ZipEntry entry, string extractLocation) | 
 |         { | 
 |             var x = new ExtractProgressEventArgs | 
 |                 { | 
 |                     ArchiveName = archiveName, | 
 |                     EventType = ZipProgressEventType.Extracting_BeforeExtractEntry, | 
 |                     CurrentEntry = entry, | 
 |                     _target = extractLocation, | 
 |                 }; | 
 |             return x; | 
 |         } | 
 |  | 
 |         internal static ExtractProgressEventArgs ExtractExisting(string archiveName, ZipEntry entry, string extractLocation) | 
 |         { | 
 |             var x = new ExtractProgressEventArgs | 
 |                 { | 
 |                     ArchiveName = archiveName, | 
 |                     EventType = ZipProgressEventType.Extracting_ExtractEntryWouldOverwrite, | 
 |                     CurrentEntry = entry, | 
 |                     _target = extractLocation, | 
 |                 }; | 
 |             return x; | 
 |         } | 
 |  | 
 |         internal static ExtractProgressEventArgs AfterExtractEntry(string archiveName, ZipEntry entry, string extractLocation) | 
 |         { | 
 |             var x = new ExtractProgressEventArgs | 
 |                 { | 
 |                     ArchiveName = archiveName, | 
 |                     EventType = ZipProgressEventType.Extracting_AfterExtractEntry, | 
 |                     CurrentEntry = entry, | 
 |                     _target = extractLocation, | 
 |                 }; | 
 |             return x; | 
 |         } | 
 |  | 
 |         internal static ExtractProgressEventArgs ExtractAllStarted(string archiveName, string extractLocation) | 
 |         { | 
 |             var x = new ExtractProgressEventArgs(archiveName, ZipProgressEventType.Extracting_BeforeExtractAll); | 
 |             x._target = extractLocation; | 
 |             return x; | 
 |         } | 
 |  | 
 |         internal static ExtractProgressEventArgs ExtractAllCompleted(string archiveName, string extractLocation) | 
 |         { | 
 |             var x = new ExtractProgressEventArgs(archiveName, ZipProgressEventType.Extracting_AfterExtractAll); | 
 |             x._target = extractLocation; | 
 |             return x; | 
 |         } | 
 |  | 
 |  | 
 |         internal static ExtractProgressEventArgs ByteUpdate(string archiveName, ZipEntry entry, Int64 bytesWritten, Int64 totalBytes) | 
 |         { | 
 |             var x = new ExtractProgressEventArgs(archiveName, ZipProgressEventType.Extracting_EntryBytesWritten); | 
 |             x.ArchiveName = archiveName; | 
 |             x.CurrentEntry = entry; | 
 |             x.BytesTransferred = bytesWritten; | 
 |             x.TotalBytesToTransfer = totalBytes; | 
 |             return x; | 
 |         } | 
 |  | 
 |  | 
 |  | 
 |         /// <summary> | 
 |         /// Number of entries extracted so far.  This is set only if the | 
 |         /// EventType is Extracting_BeforeExtractEntry or Extracting_AfterExtractEntry, and | 
 |         /// the Extract() is occurring witin the scope of a call to ExtractAll(). | 
 |         /// </summary> | 
 |         public int EntriesExtracted | 
 |         { | 
 |             get { return _entriesExtracted; } | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// Returns the extraction target location, a filesystem path. | 
 |         /// </summary> | 
 |         public String ExtractLocation | 
 |         { | 
 |             get { return _target; } | 
 |         } | 
 |  | 
 |     } | 
 |  | 
 |  | 
 |  | 
 |     /// <summary> | 
 |     /// Provides information about the an error that occurred while zipping. | 
 |     /// </summary> | 
 |     internal class ZipErrorEventArgs : ZipProgressEventArgs | 
 |     { | 
 |         private Exception _exc; | 
 |         private ZipErrorEventArgs() { } | 
 |         internal static ZipErrorEventArgs Saving(string archiveName, ZipEntry entry, Exception exception) | 
 |         { | 
 |             var x = new ZipErrorEventArgs | 
 |                 { | 
 |                     EventType = ZipProgressEventType.Error_Saving, | 
 |                     ArchiveName = archiveName, | 
 |                     CurrentEntry = entry, | 
 |                     _exc = exception | 
 |                 }; | 
 |             return x; | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// Returns the exception that occurred, if any. | 
 |         /// </summary> | 
 |         public Exception @Exception | 
 |         { | 
 |             get { return _exc; } | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// Returns the name of the file that caused the exception, if any. | 
 |         /// </summary> | 
 |         public String FileName | 
 |         { | 
 |             get { return CurrentEntry.LocalFileName; } | 
 |         } | 
 |     } | 
 |  | 
 |  | 
 | } |