diff --git a/SharpCompress/Common/ReaderExtractionEventArgs.cs b/SharpCompress/Common/ReaderExtractionEventArgs.cs new file mode 100644 index 00000000..1820c49b --- /dev/null +++ b/SharpCompress/Common/ReaderExtractionEventArgs.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; + +namespace SharpCompress.Common +{ + public class ReaderExtractionEventArgs:EventArgs + { + internal ReaderExtractionEventArgs(T entry) + { + Item = entry; + } + public T Item { get; private set; } + } +} diff --git a/SharpCompress/Reader/AbstractReader.cs b/SharpCompress/Reader/AbstractReader.cs index 1340cdfa..0c98e032 100644 --- a/SharpCompress/Reader/AbstractReader.cs +++ b/SharpCompress/Reader/AbstractReader.cs @@ -2,18 +2,20 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using SharpCompress.Archive; +using SharpCompress.Archive.Rar; using SharpCompress.Common; - #if PORTABLE using SharpCompress.Common.Rar.Headers; #endif +using SharpCompress.Reader.Rar; namespace SharpCompress.Reader { /// /// A generic push reader that reads unseekable comrpessed streams. /// - public abstract class AbstractReader : IReader, IExtractionListener + public abstract class AbstractReader : IReader, IReaderExtractionListener where TEntry : Entry where TVolume : Volume { @@ -21,9 +23,14 @@ namespace SharpCompress.Reader private IEnumerator entriesForCurrentReadStream; private bool wroteCurrentEntry; + public event EventHandler> EntryExtractionBegin; + public event EventHandler> EntryExtractionEnd; + public event EventHandler CompressedBytesRead; public event EventHandler FilePartExtractionBegin; + + internal AbstractReader(Options options, ArchiveType archiveType) { ArchiveType = archiveType; @@ -163,7 +170,11 @@ namespace SharpCompress.Reader throw new ArgumentNullException( "A writable Stream was required. Use Cancel if that was intended."); } + + var streamListener = this as IReaderExtractionListener; + streamListener.FireEntryExtractionBegin(this.Entry); Write(writableStream); + streamListener.FireEntryExtractionEnd(this.Entry); wroteCurrentEntry = true; } @@ -222,5 +233,21 @@ namespace SharpCompress.Reader }); } } + + void IReaderExtractionListener.FireEntryExtractionBegin(Entry entry) + { + if (EntryExtractionBegin!=null) + { + EntryExtractionBegin(this, new ReaderExtractionEventArgs(entry)); + } + } + + void IReaderExtractionListener.FireEntryExtractionEnd(Entry entry) + { + if (EntryExtractionEnd!=null) + { + EntryExtractionEnd(this, new ReaderExtractionEventArgs(entry)); + } + } } } \ No newline at end of file diff --git a/SharpCompress/Reader/IReader.cs b/SharpCompress/Reader/IReader.cs index 6fc2f5c5..769c1741 100644 --- a/SharpCompress/Reader/IReader.cs +++ b/SharpCompress/Reader/IReader.cs @@ -6,6 +6,9 @@ namespace SharpCompress.Reader { public interface IReader : IDisposable { + event EventHandler> EntryExtractionBegin; + event EventHandler> EntryExtractionEnd; + event EventHandler CompressedBytesRead; event EventHandler FilePartExtractionBegin; diff --git a/SharpCompress/Reader/IReaderExtractionListener.cs b/SharpCompress/Reader/IReaderExtractionListener.cs new file mode 100644 index 00000000..33ae423c --- /dev/null +++ b/SharpCompress/Reader/IReaderExtractionListener.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using SharpCompress.Archive; +using SharpCompress.Common; + +namespace SharpCompress.Reader +{ + internal interface IReaderExtractionListener:IExtractionListener + { +// void EnsureEntriesLoaded(); + void FireEntryExtractionBegin(Entry entry); + void FireEntryExtractionEnd(Entry entry); + } +} diff --git a/SharpCompress/SharpCompress.csproj b/SharpCompress/SharpCompress.csproj index b20ff3da..d69a0aac 100644 --- a/SharpCompress/SharpCompress.csproj +++ b/SharpCompress/SharpCompress.csproj @@ -76,7 +76,7 @@ true - true + false SharpCompress.pfx @@ -133,6 +133,7 @@ + @@ -249,6 +250,7 @@ +