From 48e04882ff390429a514b3217c8b5372030acf4f Mon Sep 17 00:00:00 2001 From: Michael Becker Date: Thu, 20 Apr 2023 23:06:21 -0400 Subject: [PATCH] fix BGA filesystem DataFormat and implement ISupportsExtraData on FileSource --- .../ObjectModels/FileSystem/FileSource.cs | 37 +++++++++++- .../FileSystem/BGA/BGACompressionMethod.cs | 1 - .../FileSystem/BGA/BGADataFormat.cs | 57 ++++++++++--------- 3 files changed, 67 insertions(+), 28 deletions(-) diff --git a/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSource.cs b/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSource.cs index c8a7b0dd..ecf12088 100644 --- a/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSource.cs +++ b/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSource.cs @@ -19,12 +19,16 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using System.Collections.Generic; + +using MBS.Framework; + namespace UniversalEditor.ObjectModels.FileSystem { /// /// The abstract base class for defining how a deferred retrieves its data. /// - public abstract class FileSource + public abstract class FileSource : ISupportsExtraData { private FileSourceTransformation.FileSourceTransformationCollection mvarTransformations = new FileSourceTransformation.FileSourceTransformationCollection(); @@ -46,5 +50,36 @@ namespace UniversalEditor.ObjectModels.FileSystem public abstract byte[] GetDataInternal(long offset, long length); public abstract long GetLength(); + + // ISupportsExtraData + + private Dictionary extraDataDictionary = new Dictionary(); + public T GetExtraData(string key, T defaultValue = default(T)) + { + if (extraDataDictionary.ContainsKey(key) && extraDataDictionary[key] is T) + { + return (T)extraDataDictionary[key]; + } + return defaultValue; + } + + public void SetExtraData(string key, T value) + { + extraDataDictionary[key] = value; + } + + public object GetExtraData(string key, object defaultValue = null) + { + if (extraDataDictionary.ContainsKey(key)) + { + return extraDataDictionary[key]; + } + return defaultValue; + } + + public void SetExtraData(string key, object value) + { + extraDataDictionary[key] = value; + } } } diff --git a/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/BGA/BGACompressionMethod.cs b/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/BGA/BGACompressionMethod.cs index e54d5801..2a93be57 100644 --- a/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/BGA/BGACompressionMethod.cs +++ b/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/BGA/BGACompressionMethod.cs @@ -26,7 +26,6 @@ namespace UniversalEditor.DataFormats.FileSystem.BGA /// public enum BGACompressionMethod { - None = 0, Bzip2 = 1, Gzip = 2 } diff --git a/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/BGA/BGADataFormat.cs b/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/BGA/BGADataFormat.cs index 0432036c..6979d467 100644 --- a/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/BGA/BGADataFormat.cs +++ b/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/BGA/BGADataFormat.cs @@ -24,6 +24,7 @@ using System; using UniversalEditor.Compression; using UniversalEditor.IO; using UniversalEditor.ObjectModels.FileSystem; +using UniversalEditor.ObjectModels.FileSystem.FileSources; namespace UniversalEditor.DataFormats.FileSystem.BGA { @@ -43,6 +44,8 @@ namespace UniversalEditor.DataFormats.FileSystem.BGA return _dfr; } + public BGACompressionMethod CompressionMethod { get; set; } = BGACompressionMethod.Bzip2; + protected override void LoadInternal(ref ObjectModel objectModel) { FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); @@ -54,7 +57,7 @@ namespace UniversalEditor.DataFormats.FileSystem.BGA uint unknown1 = reader.ReadUInt32(); string compressionType = reader.ReadFixedLengthString(4); - BGACompressionMethod compressionMethod = BGACompressionMethod.Bzip2; + BGACompressionMethod compressionMethod = CompressionMethod; if (compressionType == "BZ2\0") { compressionMethod = BGACompressionMethod.Bzip2; @@ -83,44 +86,46 @@ namespace UniversalEditor.DataFormats.FileSystem.BGA File file = fsom.AddFile(fileName); file.Size = decompressedSize; - file.Properties.Add("offset", offset); - file.Properties.Add("CompressedSize", compressedSize); - file.Properties.Add("DecompressedSize", decompressedSize); - file.Properties.Add("CompressionMethod", compressionMethod); - file.Properties.Add("checksum", checksum); - file.Properties.Add("reader", reader); - - throw new NotImplementedException("Figure out how to do this with FileSource"); + file.Source = new EmbeddedFileSource(reader, offset, compressedSize, new FileSourceTransformation[] + { + BGAFileSourceTransformation + }); + file.Source.SetExtraData("CompressedSize", compressedSize); + file.Source.SetExtraData("DecompressedSize", decompressedSize); + file.Source.SetExtraData("CompressionMethod", compressionMethod); + file.Source.SetExtraData("checksum", checksum); } } - private void file_DataRequest(object sender, DataRequestEventArgs e) + private static FileSourceTransformation BGAFileSourceTransformation = new FileSourceTransformation(FileSourceTransformationType.InputAndOutput, _BGAFileSourceTransformationFunc); + private static void _BGAFileSourceTransformationFunc(object sender, System.IO.Stream inputStream, System.IO.Stream outputStream) { - File file = (sender as File); - Reader reader = (Reader)file.Properties["reader"]; - long offset = (long)file.Properties["offset"]; - uint compressedSize = (uint)file.Properties["CompressedSize"]; - uint decompressedSize = (uint)file.Properties["DecompressedSize"]; - uint checksum = (uint)file.Properties["checksum"]; - BGACompressionMethod compressionMethod = (BGACompressionMethod)file.Properties["CompressionMethod"]; + EmbeddedFileSource file = sender as EmbeddedFileSource; + uint compressedSize = file.GetExtraData("CompressedSize"); + uint decompressedSize = file.GetExtraData("DecompressedSize"); + uint checksum = file.GetExtraData("checksum"); + BGACompressionMethod compressionMethod = file.GetExtraData("CompressionMethod"); - reader.Seek(offset, SeekOrigin.Begin); - byte[] compressedData = reader.ReadBytes(compressedSize); - byte[] decompressedData = compressedData; switch (compressionMethod) { + /* + case BGACompressionMethod.None: + { + inputStream.CopyTo(outputStream); + break; + } + */ case BGACompressionMethod.Bzip2: { - decompressedData = CompressionModule.FromKnownCompressionMethod(CompressionMethod.Bzip2).Decompress(compressedData); + CompressionModule.FromKnownCompressionMethod(Compression.CompressionMethod.Bzip2).Decompress(inputStream, outputStream); break; } case BGACompressionMethod.Gzip: { - decompressedData = CompressionModule.FromKnownCompressionMethod(CompressionMethod.Gzip).Decompress(compressedData); + CompressionModule.FromKnownCompressionMethod(Compression.CompressionMethod.Gzip).Decompress(inputStream, outputStream); break; } } - e.Data = decompressedData; } protected override void SaveInternal(ObjectModel objectModel) @@ -135,7 +140,7 @@ namespace UniversalEditor.DataFormats.FileSystem.BGA uint unknown1 = 0; writer.WriteUInt32(unknown1); - BGACompressionMethod compressionMethod = BGACompressionMethod.Bzip2; + BGACompressionMethod compressionMethod = CompressionMethod; string compressionType = String.Empty; switch (compressionMethod) { @@ -163,12 +168,12 @@ namespace UniversalEditor.DataFormats.FileSystem.BGA { case BGACompressionMethod.Bzip2: { - compressedData = CompressionModule.FromKnownCompressionMethod(CompressionMethod.Bzip2).Compress(decompressedData); + compressedData = CompressionModule.FromKnownCompressionMethod(Compression.CompressionMethod.Bzip2).Compress(decompressedData); break; } case BGACompressionMethod.Gzip: { - compressedData = CompressionModule.FromKnownCompressionMethod(CompressionMethod.Gzip).Compress(decompressedData); + compressedData = CompressionModule.FromKnownCompressionMethod(Compression.CompressionMethod.Gzip).Compress(decompressedData); break; } }