public override long Seek(long offset, SeekOrigin origin)
{
long new_offset = ostream.Position + offset; // SeekOrigin.Current
switch (origin) {
case SeekOrigin.Begin:
new_offset = os_offset + offset;
goto case SeekOrigin.Current;
case SeekOrigin.End:
new_offset = os_offset + os_length + offset;
goto case SeekOrigin.Current;
case SeekOrigin.Current:
if ((new_offset < os_offset) || (new_offset >= (os_offset + os_length))) {
throw new Exception(
"OffsetStream.Seek() outside offset stream limits" +
String.Format(", parms({0},{1})",offset,origin.ToString()) +
String.Format(", new_offset({0}) os_offset({1}) os_length({2})", new_offset, os_offset,os_length));
}
return ostream.Seek(new_offset, SeekOrigin.Begin) - os_offset;
default:
throw new Exception("unknown SeekOrigin value" + origin.ToString());
}
}