/src/Manos.IO/Manos.IO.Managed/FileStream.cs

http://github.com/jacksonh/manos · C# · 114 lines · 94 code · 20 blank · 0 comment · 12 complexity · c8bade1e7f28857812644ed7b56b408f MD5 · raw file

  1. using System;
  2. using Manos.IO;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using Mono.Unix.Native;
  6. namespace Manos.IO.Managed
  7. {
  8. class FileStream : ManagedByteStream
  9. {
  10. System.IO.FileStream stream;
  11. public FileStream (Context loop, System.IO.FileStream stream, int blockSize)
  12. : base (loop, blockSize)
  13. {
  14. if (loop == null)
  15. throw new ArgumentNullException ("loop");
  16. if (stream == null)
  17. throw new ArgumentNullException ("stream");
  18. this.stream = stream;
  19. }
  20. public override long Position {
  21. get { return stream.Position; }
  22. set { SeekTo (value); }
  23. }
  24. public override bool CanRead {
  25. get { return stream.CanRead; }
  26. }
  27. public override bool CanSeek {
  28. get { return stream.CanSeek; }
  29. }
  30. public override bool CanWrite {
  31. get { return stream.CanWrite; }
  32. }
  33. public override void SeekBy (long delta)
  34. {
  35. CheckDisposed ();
  36. stream.Seek (delta, SeekOrigin.Current);
  37. }
  38. public override void SeekTo (long position)
  39. {
  40. CheckDisposed ();
  41. stream.Seek (position, SeekOrigin.Begin);
  42. }
  43. protected override void Dispose (bool disposing)
  44. {
  45. if (stream != null) {
  46. stream.Dispose ();
  47. stream = null;
  48. }
  49. base.Dispose (disposing);
  50. }
  51. public override void Write (IEnumerable<ByteBuffer> data)
  52. {
  53. base.Write (data);
  54. ResumeWriting ();
  55. }
  56. protected override void DoRead ()
  57. {
  58. stream.BeginRead (buffer, 0, buffer.Length, OnReadDone, null);
  59. }
  60. void OnReadDone (IAsyncResult ar)
  61. {
  62. Context.Enqueue (delegate {
  63. if (stream != null) {
  64. ResetReadTimeout ();
  65. int result = stream.EndRead (ar);
  66. if (result > 0) {
  67. byte [] newBuffer = new byte [result];
  68. Buffer.BlockCopy (buffer, 0, newBuffer, 0, result);
  69. RaiseData (new ByteBuffer (newBuffer));
  70. DispatchRead ();
  71. } else {
  72. PauseReading ();
  73. RaiseEndOfStream ();
  74. }
  75. }
  76. });
  77. }
  78. protected override WriteResult WriteSingleFragment (ByteBuffer fragment)
  79. {
  80. stream.BeginWrite (fragment.Bytes, fragment.Position, fragment.Length, OnWriteDone, null);
  81. return WriteResult.Consume;
  82. }
  83. void OnWriteDone (IAsyncResult ar)
  84. {
  85. Context.Enqueue (delegate {
  86. if (stream != null) {
  87. ResetWriteTimeout ();
  88. stream.EndWrite (ar);
  89. HandleWrite ();
  90. }
  91. });
  92. }
  93. }
  94. }