using System.Collections.Generic; using System.IO; using System.Linq; using SharpCompress.Common; using SharpCompress.Common.Rar; using SharpCompress.Compressor.Rar; namespace SharpCompress.Reader.Rar { /// /// This class faciliates Reading a Rar Archive in a non-seekable forward-only manner /// public abstract class RarReader : AbstractReader { private RarVolume volume; private readonly Unpack pack = new Unpack(); internal RarReader(Options options) : base(options, ArchiveType.Rar) { } internal abstract void ValidateArchive(RarVolume archive); public override RarVolume Volume { get { return volume; } } #region Open /// /// Opens a RarReader for Non-seeking usage with a single volume /// /// /// /// public static RarReader Open(Stream stream, Options options = Options.KeepStreamsOpen) { stream.CheckNotNull("stream"); return new SingleVolumeRarReader(stream, options); } /// /// Opens a RarReader for Non-seeking usage with multiple volumes /// /// /// /// public static RarReader Open(IEnumerable streams, Options options = Options.KeepStreamsOpen) { streams.CheckNotNull("streams"); return new MultiVolumeRarReader(streams, options); } #endregion internal override IEnumerable GetEntries(Stream stream) { volume = new RarReaderVolume(stream, Options); foreach (RarFilePart fp in volume.ReadFileParts()) { ValidateArchive(volume); yield return new RarReaderEntry(volume.IsSolidArchive, fp); } } protected virtual IEnumerable CreateFilePartEnumerableForCurrentEntry() { return Entry.Parts; } protected override EntryStream GetEntryStream() { return new EntryStream(new RarStream(pack, Entry.FileHeader, new MultiVolumeReadOnlyStream(CreateFilePartEnumerableForCurrentEntry().Cast(), this))); } } }