diff --git a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/BGA/BGACompressionMethod.cs b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/BGA/BGACompressionMethod.cs new file mode 100644 index 00000000..e3eb9f7a --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/BGA/BGACompressionMethod.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.FileSystem.BGA +{ + public enum BGACompressionMethod + { + None = 0, + Bzip2 = 1, + Gzip = 2 + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/BGA/BGADataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/BGA/BGADataFormat.cs new file mode 100644 index 00000000..dfdbf01d --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/BGA/BGADataFormat.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.Compression; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.FileSystem; + +namespace UniversalEditor.DataFormats.FileSystem.BGA +{ + public class BGADataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + public override DataFormatReference MakeReference() + { + if (_dfr == null) + { + _dfr = base.MakeReference(); + _dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.All); + _dfr.Filters.Add("IZArc BGA archive", new byte?[][] { new byte?[] { null, null, null, null, (byte)'B', (byte)'Z', (byte)'2', (byte)0 } }, new string[] { "*.bza" }); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + if (fsom == null) throw new ObjectModelNotSupportedException(); + + Reader reader = base.Accessor.Reader; + while (!reader.EndOfStream) + { + uint unknown1 = reader.ReadUInt32(); + string compressionType = reader.ReadFixedLengthString(4); + if (compressionType == "BZ2\0") + { + + } + else + { + throw new InvalidDataFormatException("Compression type " + compressionType + " not supported!"); + } + + uint compressedSize = reader.ReadUInt32(); + uint decompressedSize = reader.ReadUInt32(); + uint checksum /*?*/ = reader.ReadUInt32(); + ushort unknown2 = reader.ReadUInt16(); + ushort unknown3 = reader.ReadUInt16(); + ushort unknown4 = reader.ReadUInt16(); + + ushort fileNameLength = reader.ReadUInt16(); + string fileName = reader.ReadFixedLengthString(fileNameLength); + + long offset = reader.Accessor.Position; + reader.Accessor.Seek(compressedSize, SeekOrigin.Current); + + 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("checksum", checksum); + file.Properties.Add("reader", reader); + file.DataRequest += file_DataRequest; + } + } + + private void file_DataRequest(object sender, DataRequestEventArgs e) + { + 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"]; + + reader.Seek(offset, SeekOrigin.Begin); + byte[] compressedData = reader.ReadBytes(compressedSize); + byte[] decompressedData = compressedData; + switch (compressionMethod) + { + case BGACompressionMethod.Bzip2: + { + decompressedData = CompressionModule.FromKnownCompressionMethod(CompressionMethod.Bzip2).Decompress(compressedData); + break; + } + case BGACompressionMethod.Gzip: + { + decompressedData = CompressionModule.FromKnownCompressionMethod(CompressionMethod.Gzip).Decompress(compressedData); + break; + } + } + e.Data = decompressedData; + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj index b5e88252..5461dd56 100644 --- a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj +++ b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj @@ -55,6 +55,8 @@ + +