diff --git a/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs b/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs index 70729214..81f04263 100644 --- a/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs +++ b/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs @@ -359,11 +359,27 @@ namespace UniversalEditor.ObjectModels.FileSystem /// The number of bytes written to the . public long WriteTo(Writer bw, FileSourceTransformation[] transformations = null) { + FileSource source = null; + if (Source != null) + { + source = Source; + } + else if (DataRequest != null) + { + DataRequestEventArgs dre = new DataRequestEventArgs(); + DataRequest.Invoke(this, dre); + source = new MemoryFileSource(dre.Data); + } + else + { + throw new InvalidOperationException("neither Source nor DataRequest for file data"); + } + long count = 0; long blockSize = (System.Environment.SystemPageSize / BLOCK_FRACTION); long offset = 0; - double dbl = ((double)Source.GetLength() / (double)blockSize); + double dbl = ((double)source.GetLength() / (double)blockSize); long blockCount = (long)Math.Ceiling(dbl); if (transformations != null) @@ -373,8 +389,8 @@ namespace UniversalEditor.ObjectModels.FileSystem for (long i = 0; i < blockCount; i++) { - byte[] data = Source.GetDataInternal(offset, blockSize); - offset += blockSize; + byte[] data = source.GetDataInternal(offset, blockSize); + offset += data.Length; bw.WriteBytes(data); count += data.Length; diff --git a/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/MemoryFileSource.cs b/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/MemoryFileSource.cs index 93101ea7..e7d1452d 100644 --- a/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/MemoryFileSource.cs +++ b/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/MemoryFileSource.cs @@ -44,6 +44,9 @@ namespace UniversalEditor.ObjectModels.FileSystem.FileSources { long realLength = Math.Min(length, Data.Length); byte[] realData = Data.ToArray(); + long remaining = realData.Length - offset; + realLength = Math.Min(realLength, remaining); + byte[] data = new byte[realLength]; Array.Copy(realData, offset, data, 0, realLength); return data;