|
|
- using IllusionInjector.Logging;
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace IllusionInjector.Utilities
- {
- class BlockingStream : Stream
- {
- public BlockingStream(Stream bstr)
- {
- BaseStream = bstr;
- }
-
- public Stream BaseStream { get; set; }
-
- private bool _open = true;
- public bool Open {
- get
- {
- return CanWrite;
- }
- set
- {
- if (!_open)
- throw new InvalidOperationException("Blocking stream has already been closed!");
- else
- _open = value;
- }
- }
-
- private bool canReadOverride = true;
- public override bool CanRead => BaseStream.CanRead && canReadOverride;
-
- public override bool CanSeek => BaseStream.CanSeek;
-
- public override bool CanWrite => BaseStream.CanWrite && _open;
-
- public override long Length => BaseStream.Length;
-
- public override long Position { get => BaseStream.Position; set => BaseStream.Position = value; }
-
- public override void Flush()
- {
- BaseStream.Flush();
- }
-
- public override int Read(byte[] buffer, int offset, int count)
- {
- var read = 0;
- while (read < count && Open)
- {
- read += BaseStream.Read(buffer, read, count-read);
- }
-
- if (read == 0)
- {
- canReadOverride = false;
- }
-
- return read;
- }
-
- public override long Seek(long offset, SeekOrigin origin)
- {
- return BaseStream.Seek(offset, origin);
- }
-
- public override void SetLength(long value)
- {
- BaseStream.SetLength(value);
- }
-
- public override void Write(byte[] buffer, int offset, int count)
- {
- BaseStream.Write(buffer, offset, count);
- }
-
- public override string ToString()
- {
- return $"{base.ToString()} ({BaseStream?.ToString()})";
- }
- }
- }
|