internal static IEnumerable <RarArchiveVolume> GetParts(FileInfo fileInfo, RarOptions options)
        {
            var part = new FileInfoRarArchiveVolume(fileInfo, options);

            yield return(part);

            if (!part.ArchiveHeader.ArchiveHeaderFlags.HasFlag(ArchiveFlags.VOLUME))
            {
                yield break; //if file isn't volume then there is no reason to look
            }
            ArchiveHeader ah = part.ArchiveHeader;

            fileInfo = GetNextFileInfo(ah, part.FileParts.FirstOrDefault() as FileInfoRarFilePart);
            //we use fileinfo because rar is dumb and looks at file names rather than archive info for another volume
            while (fileInfo != null)
            {
                part     = new FileInfoRarArchiveVolume(fileInfo, options);
                fileInfo = GetNextFileInfo(ah, part.FileParts.FirstOrDefault() as FileInfoRarFilePart);
                if (!fileInfo.Exists)
                {
                    yield break;
                }
                yield return(part);
            }
        }
 private static RarOptions FixOptions(RarOptions options)
 {
     //make sure we're closing streams with fileinfo
     if (options.HasFlag(RarOptions.KeepStreamsOpen))
     {
         options = (RarOptions)FlagUtilities.SetFlag(options, RarOptions.KeepStreamsOpen, false);
     }
     return(options);
 }
Ejemplo n.º 3
0
 /// <summary>
 /// Constructor with a FileInfo object to an existing file.
 /// </summary>
 /// <param name="fileInfo"></param>
 /// <param name="options"></param>
 internal RarArchive(FileInfo fileInfo, RarOptions options)
 {
     if (!fileInfo.Exists)
     {
         throw new ArgumentException("File does not exist: " + fileInfo.FullName);
     }
     lazyVolumes = new LazyReadOnlyCollection <RarArchiveVolume>(RarArchiveVolumeFactory.GetParts(fileInfo, options));
     lazyEntries = new LazyReadOnlyCollection <RarArchiveEntry>(RarArchiveEntry.GetEntries(this, Volumes));
 }
Ejemplo n.º 4
0
 private IEnumerable <RarReaderEntry> GetEntries(Stream stream, RarOptions options)
 {
     Volume = new RarReaderVolume(stream, options);
     foreach (RarFilePart fp in Volume.ReadFileParts())
     {
         ValidateArchive(Volume);
         yield return(new RarReaderEntry(Volume.IsSolidArchive, fp));
     }
 }
 private static RarOptions FixOptions(RarOptions options)
 {
     //make sure we're closing streams with fileinfo
     if (options.HasFlag(RarOptions.KeepStreamsOpen))
     {
         options = (RarOptions)FlagUtilities.SetFlag(options, RarOptions.KeepStreamsOpen, false);
     }
     return options;
 }
Ejemplo n.º 6
0
 /// <summary>
 /// Constructor with a FileInfo object to an existing file.
 /// </summary>
 /// <param name="fileInfo"></param>
 /// <param name="options"></param>
 internal RarArchive(FileInfo fileInfo, RarOptions options)
 {
     if (!fileInfo.Exists)
     {
         throw new ArgumentException("File does not exist: " + fileInfo.FullName);
     }
     lazyVolumes = new LazyReadOnlyCollection<RarArchiveVolume>(RarArchiveVolumeFactory.GetParts(fileInfo, options));
     lazyEntries = new LazyReadOnlyCollection<RarArchiveEntry>(RarArchiveEntry.GetEntries(this, Volumes));
 }
 internal static IEnumerable<RarArchiveVolume> GetParts(IEnumerable<Stream> streams, RarOptions options)
 {
     foreach (Stream s in streams)
     {
         if (!s.CanRead || !s.CanSeek)
         {
             throw new ArgumentException("Stream is not readable and seekable");
         }
         var part = new StreamRarArchiveVolume(s, options);
         yield return part;
     }
 }
        internal static IEnumerable<RarArchiveVolume> GetParts(FileInfo fileInfo, RarOptions options)
        {
            var part = new FileInfoRarArchiveVolume(fileInfo, options);
            yield return part;

            if (!part.ArchiveHeader.ArchiveHeaderFlags.HasFlag(ArchiveFlags.VOLUME))
            {
                yield break; //if file isn't volume then there is no reason to look
            }
            ArchiveHeader ah = part.ArchiveHeader;
            fileInfo = GetNextFileInfo(ah, part.FileParts.FirstOrDefault() as FileInfoRarFilePart);
            //we use fileinfo because rar is dumb and looks at file names rather than archive info for another volume
            while (fileInfo != null)
            {
                part = new FileInfoRarArchiveVolume(fileInfo, options);
                fileInfo = GetNextFileInfo(ah, part.FileParts.FirstOrDefault() as FileInfoRarFilePart);
                if (!fileInfo.Exists)
                    yield break;
                yield return part;
            }
        }
 internal FileInfoRarArchiveVolume(FileInfo fileInfo, RarOptions options)
     : base(StreamingMode.Seekable, FixOptions(options))
 {
     FileInfo = fileInfo;
     FileParts = base.GetVolumeFileParts().ToReadOnly();
 }
Ejemplo n.º 10
0
 internal RarReader(RarOptions options, IRarExtractionListener listener)
 {
     this.listener = listener;
     this.options  = options;
     listener.CheckNotNull("listener");
 }
Ejemplo n.º 11
0
 /// <summary>
 /// Opens a RarReader for Non-seeking usage with a single volume
 /// </summary>
 /// <param name="stream"></param>
 /// <param name="options"></param>
 /// <returns></returns>
 public static RarReader Open(Stream stream, RarOptions options = RarOptions.KeepStreamsOpen)
 {
     stream.CheckNotNull("stream");
     return(new SingleVolumeRarReader(stream, options, new NullRarExtractionListener()));
 }
Ejemplo n.º 12
0
        private int MAX_SFX_SIZE = 0x80000 - 16; //archive.cpp line 136

        internal RarHeaderFactory(StreamingMode mode, RarOptions options)
        {
            StreamingMode = mode;
            Options       = options;
        }
Ejemplo n.º 13
0
 /// <summary>
 /// Opens a RarReader for Non-seeking usage with a single volume
 /// </summary>
 /// <param name="stream"></param>
 /// <param name="options"></param>
 /// <returns></returns>
 public static RarReader Open(Stream stream, RarOptions options = RarOptions.KeepStreamsOpen)
 {
     stream.CheckNotNull("stream");
     return new SingleVolumeRarReader(stream, options, new NullRarExtractionListener());
 }
Ejemplo n.º 14
0
 /// <summary>
 /// Takes a seekable Stream as a sources
 /// </summary>
 /// <param name="stream"></param>
 /// <param name="options"></param>
 public static RarArchive Open(Stream stream, RarOptions options)
 {
     stream.CheckNotNull("stream");
     return(Open(stream.AsEnumerable(), options));
 }
Ejemplo n.º 15
0
 /// <summary>
 /// Constructor expects a filepath to an existing file.
 /// </summary>
 /// <param name="filePath"></param>
 /// <param name="options"></param>
 public static RarArchive Open(string filePath, RarOptions options)
 {
     filePath.CheckNotNullOrEmpty("filePath");
     return(Open(new FileInfo(filePath), options));
 }
Ejemplo n.º 16
0
 /// <summary>
 /// Constructor with a FileInfo object to an existing file.
 /// </summary>
 /// <param name="fileInfo"></param>
 /// <param name="options"></param>
 public static RarArchive Open(FileInfo fileInfo, RarOptions options)
 {
     fileInfo.CheckNotNull("fileInfo");
     return new RarArchive(fileInfo, options);
 }
Ejemplo n.º 17
0
 /// <summary>
 /// Constructor expects a filepath to an existing file.
 /// </summary>
 /// <param name="filePath"></param>
 /// <param name="options"></param>
 public static RarArchive Open(string filePath, RarOptions options)
 {
     filePath.CheckNotNullOrEmpty("filePath");
     return Open(new FileInfo(filePath), options);
 }
Ejemplo n.º 18
0
 internal RarArchiveVolume(StreamingMode mode, RarOptions options)
     : base(mode, options)
 {
 }
Ejemplo n.º 19
0
 internal RarReaderVolume(Stream stream, RarOptions options)
     : base(StreamingMode.Streaming, options)
 {
     Stream = stream;
     this.streamOwner = !options.HasFlag(RarOptions.KeepStreamsOpen);
 }
Ejemplo n.º 20
0
 internal SingleVolumeRarReader(Stream stream, RarOptions options, IRarExtractionListener listener)
     : base(options, listener)
 {
     this.stream = stream;
 }
Ejemplo n.º 21
0
 internal RarArchiveVolume(StreamingMode mode, RarOptions options)
     : base(mode, options)
 {
 }
 internal SingleVolumeRarReader(Stream stream, RarOptions options, IRarExtractionListener listener)
     : base(options, listener)
 {
     this.stream = stream;
 }
Ejemplo n.º 23
0
 internal RarVolume(StreamingMode mode, RarOptions options)
 {
     this.options = options;
     headerFactory = new RarHeaderFactory(mode, options);
 }
Ejemplo n.º 24
0
 internal RarVolume(StreamingMode mode, RarOptions options)
 {
     this.options  = options;
     headerFactory = new RarHeaderFactory(mode, options);
 }
Ejemplo n.º 25
0
 /// <summary>
 /// Takes a seekable Stream as a sources
 /// </summary>
 /// <param name="stream"></param>
 /// <param name="options"></param>
 public static RarArchive Open(Stream stream, RarOptions options)
 {
     stream.CheckNotNull("stream");
     return Open(stream.AsEnumerable(), options);
 }
Ejemplo n.º 26
0
 /// <summary>
 /// Constructor with a FileInfo object to an existing file.
 /// </summary>
 /// <param name="fileInfo"></param>
 /// <param name="options"></param>
 public static RarArchive Open(FileInfo fileInfo, RarOptions options)
 {
     fileInfo.CheckNotNull("fileInfo");
     return(new RarArchive(fileInfo, options));
 }
Ejemplo n.º 27
0
 /// <summary>
 /// Takes multiple seekable Streams for a multi-part archive
 /// </summary>
 /// <param name="streams"></param>
 /// <param name="options"></param>
 public static RarArchive Open(IEnumerable<Stream> streams, RarOptions options)
 {
     streams.CheckNotNull("streams");
     return new RarArchive(streams, options);
 }
Ejemplo n.º 28
0
 /// <summary>
 /// Takes multiple seekable Streams for a multi-part archive
 /// </summary>
 /// <param name="streams"></param>
 /// <param name="options"></param>
 public static RarArchive Open(IEnumerable <Stream> streams, RarOptions options)
 {
     streams.CheckNotNull("streams");
     return(new RarArchive(streams, options));
 }
Ejemplo n.º 29
0
 internal RarReader(RarOptions options, IRarExtractionListener listener)
 {
     this.listener = listener;
     this.options = options;
     listener.CheckNotNull("listener");
 }
Ejemplo n.º 30
0
 /// <summary>
 /// Takes multiple seekable Streams for a multi-part archive
 /// </summary>
 /// <param name="streams"></param>
 /// <param name="options"></param>
 internal RarArchive(IEnumerable <Stream> streams, RarOptions options)
 {
     lazyVolumes = new LazyReadOnlyCollection <RarArchiveVolume>(RarArchiveVolumeFactory.GetParts(streams, options));
     lazyEntries = new LazyReadOnlyCollection <RarArchiveEntry>(RarArchiveEntry.GetEntries(this, Volumes));
 }
 internal StreamRarArchiveVolume(Stream stream, RarOptions options)
     : base(StreamingMode.Seekable, options)
 {
     Stream = stream;
     this.streamOwner = !options.HasFlag(RarOptions.KeepStreamsOpen);
 }
Ejemplo n.º 32
0
 private IEnumerable<RarReaderEntry> GetEntries(Stream stream, RarOptions options)
 {
     Volume = new RarReaderVolume(stream, options);
     foreach (RarFilePart fp in Volume.ReadFileParts())
     {
         ValidateArchive(Volume);
         yield return new RarReaderEntry(Volume.IsSolidArchive, fp);
     }
 }
 internal FileInfoRarArchiveVolume(FileInfo fileInfo, RarOptions options)
     : base(StreamingMode.Seekable, FixOptions(options))
 {
     FileInfo  = fileInfo;
     FileParts = base.GetVolumeFileParts().ToReadOnly();
 }
Ejemplo n.º 34
0
 /// <summary>
 /// Opens a RarReader for Non-seeking usage with multiple volumes
 /// </summary>
 /// <param name="streams"></param>
 /// <param name="options"></param>
 /// <returns></returns>
 public static RarReader Open(IEnumerable <Stream> streams, RarOptions options = RarOptions.KeepStreamsOpen)
 {
     streams.CheckNotNull("streams");
     return(new MultiVolumeRarReader(streams, options, new NullRarExtractionListener()));
 }
Ejemplo n.º 35
0
 /// <summary>
 /// Opens a RarReader for Non-seeking usage with multiple volumes
 /// </summary>
 /// <param name="streams"></param>
 /// <param name="options"></param>
 /// <returns></returns>
 public static RarReader Open(IEnumerable<Stream> streams, RarOptions options = RarOptions.KeepStreamsOpen)
 {
     streams.CheckNotNull("streams");
     return new MultiVolumeRarReader(streams, options, new NullRarExtractionListener());
 }
 internal static IEnumerable <RarArchiveVolume> GetParts(IEnumerable <Stream> streams, RarOptions options)
 {
     foreach (Stream s in streams)
     {
         if (!s.CanRead || !s.CanSeek)
         {
             throw new ArgumentException("Stream is not readable and seekable");
         }
         var part = new StreamRarArchiveVolume(s, options);
         yield return(part);
     }
 }
Ejemplo n.º 37
0
        private int MAX_SFX_SIZE = 0x80000 - 16; //archive.cpp line 136

        internal RarHeaderFactory(StreamingMode mode, RarOptions options)
        {
            StreamingMode = mode;
            Options = options;
        }
Ejemplo n.º 38
0
 internal RarReaderVolume(Stream stream, RarOptions options)
     : base(StreamingMode.Streaming, options)
 {
     Stream           = stream;
     this.streamOwner = !options.HasFlag(RarOptions.KeepStreamsOpen);
 }
Ejemplo n.º 39
0
 /// <summary>
 /// Takes multiple seekable Streams for a multi-part archive
 /// </summary>
 /// <param name="streams"></param>
 /// <param name="options"></param>
 internal RarArchive(IEnumerable<Stream> streams, RarOptions options)
 {
     lazyVolumes = new LazyReadOnlyCollection<RarArchiveVolume>(RarArchiveVolumeFactory.GetParts(streams, options));
     lazyEntries = new LazyReadOnlyCollection<RarArchiveEntry>(RarArchiveEntry.GetEntries(this, Volumes));
 }
Ejemplo n.º 40
0
 internal MultiVolumeRarReader(IEnumerable <Stream> streams, RarOptions options, IRarExtractionListener listener)
     : base(options, listener)
 {
     this.streams = streams.GetEnumerator();
 }
Ejemplo n.º 41
0
 internal StreamRarArchiveVolume(Stream stream, RarOptions options)
     : base(StreamingMode.Seekable, options)
 {
     Stream           = stream;
     this.streamOwner = !options.HasFlag(RarOptions.KeepStreamsOpen);
 }