diff --git a/SharpCompress/Common/EntryStream.cs b/SharpCompress/Common/EntryStream.cs index a14bbbbb..86e50978 100644 --- a/SharpCompress/Common/EntryStream.cs +++ b/SharpCompress/Common/EntryStream.cs @@ -1,16 +1,19 @@ using System; using System.IO; +using SharpCompress.Reader; namespace SharpCompress.Common { public class EntryStream : Stream { + public IReader Reader { get; private set; } private Stream stream; private bool completed; private bool isDisposed; - internal EntryStream(Stream stream) + internal EntryStream(IReader reader, Stream stream) { + this.Reader = reader; this.stream = stream; } @@ -26,25 +29,9 @@ namespace SharpCompress.Common completed = true; } - public bool Cancelled { get; private set; } - - /// - /// Indicates that the remainder of the stream is not required. - /// On dispose, the entry will not be skipped, so it helps with efficiency. - /// The downside is that subsequent entries are not usable, as the compressed stream is not positioned at an entry boundary. - /// - public void Cancel() - { - if (!completed) - { - Cancelled = true; - stream.Close(); - } - } - protected override void Dispose(bool disposing) { - if (!(completed || Cancelled)) + if (!(completed || Reader.Cancelled)) { SkipEntry(); } diff --git a/SharpCompress/Reader/AbstractReader.cs b/SharpCompress/Reader/AbstractReader.cs index bd940ce8..699770a3 100644 --- a/SharpCompress/Reader/AbstractReader.cs +++ b/SharpCompress/Reader/AbstractReader.cs @@ -67,22 +67,36 @@ namespace SharpCompress.Reader #endregion + + public bool Cancelled { get; private set; } + + /// + /// Indicates that the remaining entries are not required. + /// On dispose of an EntryStream, the stream will not skip to the end of the entry. + /// An attempt to move to the next entry will throw an exception, as the compressed stream is not positioned at an entry boundary. + /// + public void Cancel() + { + if (!completed) + { + Cancelled = true; + } + } + public bool MoveToNextEntry() { if (completed) { return false; } + if (Cancelled) + { + throw new InvalidOperationException("Reader has been cancelled."); + } if (entriesForCurrentReadStream == null) { return LoadStreamForReading(RequestInitialStream()); } - - if (currentEntryStream != null && currentEntryStream.Cancelled) - { - throw new InvalidOperationException("EntryStream has not been fully consumed. Read the entire stream or use SkipEntry."); - } - if (!wroteCurrentEntry) { SkipEntry(); @@ -203,14 +217,12 @@ namespace SharpCompress.Reader return stream; } - private EntryStream currentEntryStream; - /// /// Retains a reference to the entry stream, so we can check whether it completed later. /// protected EntryStream CreateEntryStream(Stream decompressed) { - return currentEntryStream = new EntryStream(decompressed); + return new EntryStream(this, decompressed); } protected virtual EntryStream GetEntryStream() diff --git a/SharpCompress/Reader/IReader.cs b/SharpCompress/Reader/IReader.cs index 769c1741..cf26ea16 100644 --- a/SharpCompress/Reader/IReader.cs +++ b/SharpCompress/Reader/IReader.cs @@ -22,6 +22,9 @@ namespace SharpCompress.Reader /// void WriteEntryTo(Stream writableStream); + bool Cancelled { get; } + void Cancel(); + /// /// Moves to the next entry by reading more data from the underlying stream. This skips if data has not been read. ///