diff --git a/sources/OpenMcdf.Extensions/StreamDecorator.cs b/sources/OpenMcdf.Extensions/StreamDecorator.cs
index ee3b04a..4335d7f 100644
--- a/sources/OpenMcdf.Extensions/StreamDecorator.cs
+++ b/sources/OpenMcdf.Extensions/StreamDecorator.cs
@@ -41,14 +41,8 @@ public override void Flush()
///
public override long Position
{
- get
- {
- return position;
- }
- set
- {
- position = value;
- }
+ get => position;
+ set => Seek(value, SeekOrigin.Begin);
}
///
@@ -77,18 +71,30 @@ public override long Seek(long offset, SeekOrigin origin)
switch (origin)
{
case SeekOrigin.Begin:
+ if (offset < 0)
+ throw new IOException("Seek before origin");
position = offset;
break;
+
case SeekOrigin.Current:
+ if (position + offset < 0)
+ throw new IOException("Seek before origin");
position += offset;
break;
+
case SeekOrigin.End:
- position -= offset;
+ if (Length - offset < 0)
+ throw new IOException("Seek before origin");
+ position = Length - offset;
break;
+
default:
- throw new Exception("Invalid origin selected");
+ throw new ArgumentException(nameof(origin), "Invalid seek origin");
}
+ if (position > Length)
+ SetLength(position);
+
return position;
}
diff --git a/sources/OpenMcdf/StreamView.cs b/sources/OpenMcdf/StreamView.cs
index f7f5f54..ca31b91 100644
--- a/sources/OpenMcdf/StreamView.cs
+++ b/sources/OpenMcdf/StreamView.cs
@@ -63,18 +63,8 @@ public override void Flush()
public override long Position
{
- get
- {
- return position;
- }
-
- set
- {
- if (position > length - 1)
- throw new ArgumentOutOfRangeException(nameof(value));
-
- position = value;
- }
+ get => position;
+ set => Seek(value, SeekOrigin.Begin);
}
public override int Read(byte[] buffer, int offset, int count)
@@ -185,9 +175,12 @@ public override long Seek(long offset, SeekOrigin origin)
throw new IOException("Seek before origin");
position = Length - offset;
break;
+
+ default:
+ throw new ArgumentException(nameof(origin), "Invalid seek origin");
}
- if (length <= position) // Don't adjust the length when position is inside the bounds of 0 and the current length.
+ if (position > length)
AdjustLength(position);
return position;