this bug was hidden for quite some time... line 71-72 file name comes before offset!

This commit is contained in:
Michael Becker 2020-04-03 00:08:59 -04:00
parent f02ddfd298
commit cfb9c729ab
No known key found for this signature in database
GPG Key ID: 389DFF5D73781A12

View File

@ -6,79 +6,78 @@ using UniversalEditor.ObjectModels.FileSystem;
namespace UniversalEditor.DataFormats.FileSystem.Ultra3D
{
public class Ultra3DRBXDataFormat : 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 Ultra3DRBXDataFormat : 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;
IO.Reader br = base.Accessor.Reader;
int header = br.ReadInt32();
if (header != 0x0BA99A9E) throw new InvalidDataFormatException("File does not begin with header 0x0BA99A9E");
int header = br.ReadInt32();
if (header != 0x0BA99A9E) throw new InvalidDataFormatException("File does not begin with header 0x0BA99A9E");
uint fileCount = br.ReadUInt32();
for (uint i = 0; i < fileCount; i++)
{
File file = new File();
file.Name = br.ReadFixedLengthString(12).TrimNull();
uint fileCount = br.ReadUInt32();
for (uint i = 0; i < fileCount; i++)
{
File file = new File();
file.Name = br.ReadFixedLengthString(12).TrimNull();
uint offset = br.ReadUInt32();
file.Properties.Add("offset", offset);
file.Properties.Add("reader", br);
uint offset = br.ReadUInt32();
file.Properties.Add("offset", offset);
file.Properties.Add("reader", br);
file.DataRequest += file_DataRequest;
fsom.Files.Add(file);
}
}
file.DataRequest += file_DataRequest;
fsom.Files.Add(file);
}
}
private void file_DataRequest(object sender, DataRequestEventArgs e)
{
File file = (sender as File);
uint offset = (uint)file.Properties["offset"];
IO.Reader br = (IO.Reader)file.Properties["reader"];
br.Accessor.Position = offset;
uint length = br.ReadUInt32();
e.Data = br.ReadBytes(length);
}
private void file_DataRequest(object sender, DataRequestEventArgs e)
{
File file = (sender as File);
protected override void SaveInternal(ObjectModel objectModel)
{
FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel);
if (fsom == null) return;
uint offset = (uint)file.Properties["offset"];
IO.Reader br = (IO.Reader)file.Properties["reader"];
IO.Writer bw = base.Accessor.Writer;
bw.WriteInt32(0x0BA99A9E);
br.Accessor.Position = offset;
uint length = br.ReadUInt32();
e.Data = br.ReadBytes(length);
}
bw.WriteInt32(fsom.Files.Count);
protected override void SaveInternal(ObjectModel objectModel)
{
FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel);
if (fsom == null) return;
uint offset = (uint)(8 + ((12 + 4) * fsom.Files.Count));
foreach (File file in fsom.Files)
{
bw.WriteUInt32(offset);
bw.WriteFixedLengthString(file.Name, 12);
IO.Writer bw = base.Accessor.Writer;
bw.WriteInt32(0x0BA99A9E);
bw.WriteInt32(fsom.Files.Count);
offset += (uint)(4 + file.Size);
}
foreach (File file in fsom.Files)
{
bw.WriteUInt32((uint)file.Size);
bw.WriteBytes(file.GetData());
}
}
}
uint offset = (uint)(8 + ((12 + 4) * fsom.Files.Count));
foreach (File file in fsom.Files)
{
bw.WriteFixedLengthString(file.Name, 12);
bw.WriteUInt32(offset);
offset += (uint)(4 + file.Size);
}
foreach (File file in fsom.Files)
{
bw.WriteUInt32((uint)file.Size);
bw.WriteBytes(file.GetData());
}
}
}
}