|
|
@@ -1,12 +1,123 @@
|
|
|
-
|
|
|
using System;
|
|
|
+using System.IO;
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
|
namespace AtomicEngine
|
|
|
{
|
|
|
public partial class File : AObject, Deserializer, Serializer
|
|
|
{
|
|
|
+ private class Stream : System.IO.Stream
|
|
|
+ {
|
|
|
+ private File file;
|
|
|
+
|
|
|
+ public override bool CanRead
|
|
|
+ {
|
|
|
+ get
|
|
|
+ {
|
|
|
+ return file.Mode == FileMode.FILE_READ || file.Mode == FileMode.FILE_READWRITE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public override bool CanSeek
|
|
|
+ {
|
|
|
+ get
|
|
|
+ {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public override bool CanWrite
|
|
|
+ {
|
|
|
+ get
|
|
|
+ {
|
|
|
+ return file.Mode == FileMode.FILE_WRITE ||
|
|
|
+ file.Mode == FileMode.FILE_READWRITE ||
|
|
|
+ file.Mode == FileMode.FILE_APPEND;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public override long Length
|
|
|
+ {
|
|
|
+ get
|
|
|
+ {
|
|
|
+ return file.GetSize();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public override long Position
|
|
|
+ {
|
|
|
+ get
|
|
|
+ {
|
|
|
+ return file.GetPosition();
|
|
|
+ }
|
|
|
+
|
|
|
+ set
|
|
|
+ {
|
|
|
+ file.Seek((uint)value);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ public Stream(File file)
|
|
|
+ {
|
|
|
+ if (file == null)
|
|
|
+ throw new ArgumentNullException(nameof(file));
|
|
|
+
|
|
|
+ this.file = file;
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void Flush()
|
|
|
+ {
|
|
|
+ file.Flush();
|
|
|
+ }
|
|
|
+
|
|
|
+ public override int Read(byte[] buffer, int offset, int count)
|
|
|
+ {
|
|
|
+ if (buffer == null)
|
|
|
+ throw new ArgumentNullException(nameof(buffer));
|
|
|
+ if (offset + count > buffer.Length)
|
|
|
+ throw new IndexOutOfRangeException("buffer.Length");
|
|
|
+
|
|
|
+ byte[] readData = file.Read(count);
|
|
|
+ int limit = Math.Min(count, readData.Length);
|
|
|
+ Array.Copy(readData, 0, buffer, offset, limit);
|
|
|
+
|
|
|
+ return limit;
|
|
|
+ }
|
|
|
+
|
|
|
+ public override long Seek(long offset, SeekOrigin origin)
|
|
|
+ {
|
|
|
+ if (origin == SeekOrigin.Current)
|
|
|
+ {
|
|
|
+ offset += Position;
|
|
|
+ }
|
|
|
+ else if (origin == SeekOrigin.End)
|
|
|
+ {
|
|
|
+ offset += Length;
|
|
|
+ }
|
|
|
+
|
|
|
+ return file.Seek((uint)offset);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void SetLength(long value)
|
|
|
+ {
|
|
|
+ throw new InvalidOperationException();
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void Write(byte[] buffer, int offset, int count)
|
|
|
+ {
|
|
|
+ if (buffer == null)
|
|
|
+ throw new ArgumentNullException(nameof(buffer));
|
|
|
+ if (offset + count >= buffer.Length)
|
|
|
+ throw new IndexOutOfRangeException("buffer.Length");
|
|
|
+
|
|
|
+ file.Write(buffer, offset, count);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public System.IO.Stream ToStream()
|
|
|
+ {
|
|
|
+ return new Stream(this);
|
|
|
+ }
|
|
|
|
|
|
/// <summary>
|
|
|
/// Read bytes from the file. Return array of bytes of the length actually read (can be 0 length)
|