improvements to FSB saving, no samples to test yet though

This commit is contained in:
Michael Becker 2019-12-08 19:28:01 -05:00
parent 0659d32586
commit 389f8d4f2e
No known key found for this signature in database
GPG Key ID: 389DFF5D73781A12

View File

@ -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());
}
}
}
}