From a3fba29ef97eb77ac33f4f1f52f927513a6aee92 Mon Sep 17 00:00:00 2001 From: alcexhim Date: Thu, 23 Jul 2015 10:03:48 -0400 Subject: [PATCH] Added ability to arbitrarily get data from a File by offset and length (without having to read the ENTIRE file from the source data); this must be supported by your DataFormat's implementation of DataRequest though --- .../FileSystem/DataRequestEvent.cs | 22 ++++++++---- .../ObjectModels/FileSystem/File.cs | 36 ++++++++++++++++++- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/CSharp/Plugins/UniversalEditor.Essential/ObjectModels/FileSystem/DataRequestEvent.cs b/CSharp/Plugins/UniversalEditor.Essential/ObjectModels/FileSystem/DataRequestEvent.cs index 3335c2e8..afd736cf 100644 --- a/CSharp/Plugins/UniversalEditor.Essential/ObjectModels/FileSystem/DataRequestEvent.cs +++ b/CSharp/Plugins/UniversalEditor.Essential/ObjectModels/FileSystem/DataRequestEvent.cs @@ -2,13 +2,23 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using UniversalEditor.IO; namespace UniversalEditor.ObjectModels.FileSystem { - public delegate void DataRequestEventHandler(object sender, DataRequestEventArgs e); - public class DataRequestEventArgs : EventArgs - { - private byte[] mvarData = null; - public byte[] Data { get { return mvarData; } set { mvarData = value; } } - } + public delegate void DataRequestEventHandler(object sender, DataRequestEventArgs e); + public class DataRequestEventArgs : EventArgs + { + private byte[] mvarData = null; + public byte[] Data { get { return mvarData; } set { mvarData = value; } } + + private Reader mvarReader = null; + public Reader Reader { get { return mvarReader; } set { mvarReader = value; } } + + private long mvarOffset = 0; + public long Offset { get { return mvarOffset; } set { mvarOffset = value; } } + + private long mvarLength = 0; + public long Length { get { return mvarLength; } set { mvarLength = value; } } + } } diff --git a/CSharp/Plugins/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs b/CSharp/Plugins/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs index f5616fa8..3b942479 100644 --- a/CSharp/Plugins/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs +++ b/CSharp/Plugins/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs @@ -99,7 +99,18 @@ namespace UniversalEditor.ObjectModels.FileSystem { DataRequestEventArgs e = new DataRequestEventArgs(); DataRequest(this, e); - mvarData = e.Data; + if (e.Data == null && e.Reader == null) + { + Console.WriteLine("DataRequest: " + mvarName + ": Data is not represented as a byte array or Reader"); + } + else if (e.Data != null) + { + mvarData = e.Data; + } + else + { + Console.WriteLine("DataRequest: " + mvarName + ": Data is not represented as a byte array; please use GetData() method"); + } } return mvarData; } @@ -109,6 +120,29 @@ namespace UniversalEditor.ObjectModels.FileSystem mvarData = data; } + public byte[] GetData(long offset, long length) + { + DataRequestEventArgs e = new DataRequestEventArgs(); + DataRequest(this, e); + if (e.Data != null) + { + long realLength = Math.Min(length, e.Data.Length); + byte[] data = new byte[realLength]; + Array.Copy(e.Data, 0, data, 0, realLength); + return data; + } + else if (e.Reader != null) + { + long realLength = Math.Min(length, e.Length); + e.Reader.Seek(e.Offset + offset, IO.SeekOrigin.Begin); + byte[] data = e.Reader.ReadBytes(length); + return data; + } + + Console.WriteLine("DataRequest: " + mvarName + ": Data is not represented as a byte array or Reader"); + return null; + } + private System.IO.Stream mvarStream = null; public System.IO.Stream GetDataAsStream() {