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