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