public override int Read(byte[] b, int off, int len)
{
if (b == null) {
throw new ArgumentNullException();
} else if ((off < 0) || (off > b.Length) || (len < 0) ||
((off + len) > b.Length) || ((off + len) < 0)) {
throw new ArgumentOutOfRangeException();
} else if (len == 0) {
return 0;
}
if (rangePosition >= range[range.Length - 2] + range[range.Length - 1]) {
return 0;
}
for (int k = 0; k < range.Length; k += 2) {
long start = range[k];
long end = start + range[k + 1];
if (rangePosition < start)
rangePosition = start;
if (rangePosition >= start && rangePosition < end) {
int lenf = (int)Math.Min((long)len, end - rangePosition);
if (raf == null)
Array.Copy(bout, rangePosition, b, off, lenf);
else {
raf.Seek(rangePosition, SeekOrigin.Begin);
ReadFully(b, off, lenf);
}
rangePosition += lenf;
return lenf;
}
}
return 0;
}