| // 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; } |
| } |
| } |
| |
| |
| } |