From 389f8d4f2e684ea3dda5c6d80660f49b49a9709f Mon Sep 17 00:00:00 2001 From: Michael Becker Date: Sun, 8 Dec 2019 19:28:01 -0500 Subject: [PATCH] improvements to FSB saving, no samples to test yet though --- .../FileSystem/FSB/FSBDataFormat.cs | 172 ++++++++++-------- 1 file changed, 92 insertions(+), 80 deletions(-) diff --git a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/FSB/FSBDataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/FSB/FSBDataFormat.cs index 673121b9..872a1eb1 100644 --- a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/FSB/FSBDataFormat.cs +++ b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/FSB/FSBDataFormat.cs @@ -2,107 +2,119 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using UniversalEditor.IO; using UniversalEditor.ObjectModels.FileSystem; namespace UniversalEditor.DataFormats.FileSystem.FSB { - public class FSBDataFormat : DataFormat - { - private static DataFormatReference _dfr = null; - protected override DataFormatReference MakeReferenceInternal() - { - if (_dfr == null) - { - _dfr = base.MakeReferenceInternal(); - _dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.All); - } - return _dfr; - } + public class FSBDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } - protected override void LoadInternal(ref ObjectModel objectModel) - { - FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); - if (fsom == null) return; + protected override void LoadInternal(ref ObjectModel objectModel) + { + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + if (fsom == null) return; - IO.Reader br = base.Accessor.Reader; - string header = br.ReadFixedLengthString(4); - if (header != "FSB3") throw new InvalidDataFormatException("File does not begin with FSB3"); + IO.Reader br = base.Accessor.Reader; + string header = br.ReadFixedLengthString(4); + if (header != "FSB3") throw new InvalidDataFormatException("File does not begin with FSB3"); - uint fileCount = br.ReadUInt32(); - uint directorySize = br.ReadUInt32(); - uint dataSize = br.ReadUInt32(); - uint unknown1 = br.ReadUInt32(); - uint unknown2 = br.ReadUInt32(); + uint fileCount = br.ReadUInt32(); + uint directorySize = br.ReadUInt32(); + uint dataSize = br.ReadUInt32(); + uint unknown1 = br.ReadUInt32(); + uint unknown2 = br.ReadUInt32(); - for (uint i = 0; i < fileCount; i++) - { - ushort entrySize = br.ReadUInt16(); - string fileName = br.ReadFixedLengthString(30); - uint decompressedSize = br.ReadUInt32(); - uint offset = br.ReadUInt32(); - uint compressedSize = br.ReadUInt32(); - byte[] otherSoundInformation = br.ReadBytes(16); + for (uint i = 0; i < fileCount; i++) + { + ushort entrySize = br.ReadUInt16(); + string fileName = br.ReadFixedLengthString(30); + uint decompressedSize = br.ReadUInt32(); + uint offset = br.ReadUInt32(); + uint compressedSize = br.ReadUInt32(); + byte[] otherSoundInformation = br.ReadBytes(16); - File file = new File(); - file.Name = fileName; - file.Properties.Add("length", compressedSize); - file.Properties.Add("offset", offset); - file.Properties.Add("reader", br); - file.DataRequest += file_DataRequest; - fsom.Files.Add(file); - } - } + File file = new File(); + file.Name = fileName; + file.Properties.Add("length", compressedSize); + file.Properties.Add("offset", offset); + file.Properties.Add("reader", br); + file.DataRequest += file_DataRequest; + file.Size = decompressedSize; + fsom.Files.Add(file); + } + } - private void file_DataRequest(object sender, DataRequestEventArgs e) - { - File file = (sender as File); - uint length = (uint)file.Properties["length"]; - uint offset = (uint)file.Properties["offset"]; - IO.Reader br = (IO.Reader)file.Properties["reader"]; + private void file_DataRequest(object sender, DataRequestEventArgs e) + { + File file = (sender as File); + uint length = (uint)file.Properties["length"]; + uint offset = (uint)file.Properties["offset"]; + IO.Reader br = (IO.Reader)file.Properties["reader"]; - br.Accessor.Position = offset; - e.Data = br.ReadBytes(length); - } + br.Accessor.Position = offset; + e.Data = br.ReadBytes(length); + } - protected override void SaveInternal(ObjectModel objectModel) - { - FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); - if (fsom == null) return; + protected override void SaveInternal(ObjectModel objectModel) + { + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + if (fsom == null) return; - IO.Writer bw = base.Accessor.Writer; - bw.WriteFixedLengthString("FSB3"); + IO.Writer bw = base.Accessor.Writer; + bw.WriteFixedLengthString("FSB3"); - bw.WriteUInt32((uint)fsom.Files.Count); + bw.WriteUInt32((uint)fsom.Files.Count); - uint directorySize = 0; - bw.WriteUInt32(directorySize); + uint directorySize = 0; + bw.WriteUInt32(directorySize); - uint dataSize = 0; - bw.WriteUInt32(dataSize); + uint dataSize = 0; + bw.WriteUInt32(dataSize); - uint unknown1 = 0; - bw.WriteUInt32(unknown1); + uint unknown1 = 0; + bw.WriteUInt32(unknown1); - uint unknown2 = 0; - bw.WriteUInt32(unknown2); + uint unknown2 = 0; + bw.WriteUInt32(unknown2); - uint offset = (uint)(24 + (60 * fsom.Files.Count)); + uint offset = (uint)(24 + (60 * fsom.Files.Count)); - foreach (File file in fsom.Files) - { - ushort entrySize = 60; - bw.WriteUInt16(entrySize); + FileNameShortener ss = new FileNameShortener(); + ss.Count = fsom.Files.Count; + ss.MaxFileNameLength = 26; + ss.MaxExtensionLength = 3; - bw.WriteFixedLengthString(file.Name, 30); - bw.WriteUInt32((uint)file.Size); - bw.WriteUInt32(offset); - uint compressedSize = (uint)file.Size; + foreach (File file in fsom.Files) + { + ushort entrySize = 60; + bw.WriteUInt16(entrySize); - byte[] otherSoundInformation = new byte[16]; - bw.WriteBytes(otherSoundInformation); + bw.WriteFixedLengthString(ss.Shorten(file.Name), 30); + bw.WriteUInt32((uint)file.Size); + bw.WriteUInt32(offset); + uint compressedSize = (uint)file.Size; + bw.WriteUInt32(compressedSize); - offset += compressedSize; - } - } - } + byte[] otherSoundInformation = new byte[16]; + bw.WriteBytes(otherSoundInformation); + + offset += compressedSize; + } + foreach (File file in fsom.Files) + { + bw.WriteBytes(file.GetData()); + } + } + } }