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