StreamFileUserDataBase.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. namespace MoonSharp.Interpreter.CoreLib.IO
  7. {
  8. public abstract class StreamFileUserDataBase : FileUserDataBase
  9. {
  10. protected Stream m_Stream;
  11. protected StreamReader m_Reader;
  12. protected StreamWriter m_Writer;
  13. protected bool m_Closed = false;
  14. protected void Initialize(Stream stream, StreamReader reader, StreamWriter writer)
  15. {
  16. m_Stream = stream;
  17. m_Reader = reader;
  18. m_Writer = writer;
  19. }
  20. private void CheckFileIsNotClosed()
  21. {
  22. if (m_Closed)
  23. throw new ScriptRuntimeException("attempt to use a closed file");
  24. }
  25. protected override bool Eof()
  26. {
  27. CheckFileIsNotClosed();
  28. if (m_Reader != null)
  29. return m_Reader.EndOfStream;
  30. else
  31. return false;
  32. }
  33. protected override string ReadLine()
  34. {
  35. CheckFileIsNotClosed();
  36. return m_Reader.ReadLine();
  37. }
  38. protected override string ReadToEnd()
  39. {
  40. CheckFileIsNotClosed();
  41. return m_Reader.ReadToEnd();
  42. }
  43. protected override string ReadBuffer(int p)
  44. {
  45. CheckFileIsNotClosed();
  46. char[] buffer = new char[p];
  47. int length = m_Reader.ReadBlock(buffer, 0, p);
  48. return new string(buffer, 0, length);
  49. }
  50. protected override char Peek()
  51. {
  52. CheckFileIsNotClosed();
  53. return (char)m_Reader.Peek();
  54. }
  55. protected override void Write(string value)
  56. {
  57. CheckFileIsNotClosed();
  58. m_Writer.Write(value);
  59. }
  60. protected override string Close()
  61. {
  62. CheckFileIsNotClosed();
  63. if (m_Writer != null)
  64. m_Writer.Dispose();
  65. if (m_Reader != null)
  66. m_Reader.Dispose();
  67. m_Stream.Dispose();
  68. m_Closed = true;
  69. return null;
  70. }
  71. public override bool flush()
  72. {
  73. CheckFileIsNotClosed();
  74. if (m_Writer != null)
  75. m_Writer.Flush();
  76. return true;
  77. }
  78. public override long seek(string whence, long offset)
  79. {
  80. CheckFileIsNotClosed();
  81. if (whence != null)
  82. {
  83. if (whence == "set")
  84. {
  85. m_Stream.Seek(offset, SeekOrigin.Begin);
  86. }
  87. else if (whence == "cur")
  88. {
  89. m_Stream.Seek(offset, SeekOrigin.Current);
  90. }
  91. else if (whence == "end")
  92. {
  93. m_Stream.Seek(offset, SeekOrigin.End);
  94. }
  95. else
  96. {
  97. throw ScriptRuntimeException.BadArgument(0, "seek", "invalid option '" + whence + "'");
  98. }
  99. }
  100. return m_Stream.Position;
  101. }
  102. public override bool setvbuf(string mode)
  103. {
  104. CheckFileIsNotClosed();
  105. if (m_Writer != null)
  106. m_Writer.AutoFlush = (mode == "no" || mode == "line");
  107. return true;
  108. }
  109. protected internal override bool isopen()
  110. {
  111. return !m_Closed;
  112. }
  113. }
  114. }