// dnlib: See LICENSE.txt for more info using System; using System.Diagnostics; namespace dnlib.IO { /// /// Creates s that can read its data. /// /// This factory class is thread safe and its data can be read by on any thread. /// public abstract class DataReaderFactory : IDisposable { /// /// The filename or null if the data is not from a file /// public abstract string Filename { get; } /// /// Gets the total length of the data /// public abstract uint Length { get; } /// /// Creates a data reader that can read all data /// /// public DataReader CreateReader() => CreateReader(0U, Length); /// /// Creates a data reader /// /// Offset of data /// Length of data /// public abstract DataReader CreateReader(uint offset, uint length); static void ThrowArgumentOutOfRangeException(string paramName) => throw new ArgumentOutOfRangeException(paramName); static void Throw_CreateReader_2(int offset, int length) { if (offset < 0) throw new ArgumentOutOfRangeException(nameof(offset)); Debug.Assert(length < 0); throw new ArgumentOutOfRangeException(nameof(length)); } /// /// Creates a data reader /// /// Offset of data /// Length of data /// public DataReader CreateReader(uint offset, int length) { if (length < 0) ThrowArgumentOutOfRangeException(nameof(length)); return CreateReader(offset, (uint)length); } /// /// Creates a data reader /// /// Offset of data /// Length of data /// public DataReader CreateReader(int offset, uint length) { if (offset < 0) ThrowArgumentOutOfRangeException(nameof(offset)); return CreateReader((uint)offset, length); } /// /// Creates a data reader /// /// Offset of data /// Length of data /// public DataReader CreateReader(int offset, int length) { if (offset < 0 || length < 0) Throw_CreateReader_2(offset, length); return CreateReader((uint)offset, (uint)length); } /// /// Creates a data reader /// /// Stream /// Offset of data /// Length of data /// protected DataReader CreateReader(DataStream stream, uint offset, uint length) { uint maxOffset = Length; if (offset > maxOffset) offset = maxOffset; if ((ulong)offset + length > maxOffset) length = maxOffset - offset; return new DataReader(stream, offset, length); } /// /// Raised when all cached s created by this instance must be recreated /// public virtual event EventHandler DataReaderInvalidated { add { } remove { } } /// /// Disposes of this instance /// public abstract void Dispose(); } }