You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
2.2 KiB

  1. using IllusionInjector.Logging;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace IllusionInjector.Utilities
  10. {
  11. class BlockingStream : Stream
  12. {
  13. public BlockingStream(Stream bstr)
  14. {
  15. BaseStream = bstr;
  16. }
  17. public Stream BaseStream { get; set; }
  18. private bool _open = true;
  19. public bool Open {
  20. get
  21. {
  22. return CanWrite;
  23. }
  24. set
  25. {
  26. if (!_open)
  27. throw new InvalidOperationException("Blocking stream has already been closed!");
  28. else
  29. _open = value;
  30. }
  31. }
  32. private bool canReadOverride = true;
  33. public override bool CanRead => BaseStream.CanRead && canReadOverride;
  34. public override bool CanSeek => BaseStream.CanSeek;
  35. public override bool CanWrite => BaseStream.CanWrite && _open;
  36. public override long Length => BaseStream.Length;
  37. public override long Position { get => BaseStream.Position; set => BaseStream.Position = value; }
  38. public override void Flush()
  39. {
  40. BaseStream.Flush();
  41. }
  42. public override int Read(byte[] buffer, int offset, int count)
  43. {
  44. var read = 0;
  45. while (read < count && Open)
  46. {
  47. read += BaseStream.Read(buffer, read, count-read);
  48. }
  49. if (read == 0)
  50. {
  51. canReadOverride = false;
  52. }
  53. return read;
  54. }
  55. public override long Seek(long offset, SeekOrigin origin)
  56. {
  57. return BaseStream.Seek(offset, origin);
  58. }
  59. public override void SetLength(long value)
  60. {
  61. BaseStream.SetLength(value);
  62. }
  63. public override void Write(byte[] buffer, int offset, int count)
  64. {
  65. BaseStream.Write(buffer, offset, count);
  66. }
  67. public override string ToString()
  68. {
  69. return $"{base.ToString()} ({BaseStream?.ToString()})";
  70. }
  71. }
  72. }