Added additional source and attempted to improve loading file system objects (opening.bnr loads fine, others not so much)

This commit is contained in:
Michael Becker 2015-07-22 15:51:57 -04:00
parent 4473a032d3
commit eca27273f3

View File

@ -55,6 +55,7 @@ namespace UniversalEditor.DataFormats.FileSystem.Nintendo.Optical
_dfr.Sources.Add("http://wiibrew.org/wiki/Wii_Disc");
_dfr.Sources.Add("http://www.emutalk.net/threads/21512-GCM-file-extension!/page3");
_dfr.Sources.Add("http://hitmen.c02.at/files/yagcd/yagcd/chap13.html");
}
return _dfr;
}
@ -217,7 +218,7 @@ namespace UniversalEditor.DataFormats.FileSystem.Nintendo.Optical
private int m_OffsetToFST = 0;
private int m_NameTableOffset = 0;
private int LoadFileSystemObject(Reader reader, IFileSystemContainer parent)
private int LoadFileSystemObject(Reader reader, IFileSystemContainer parent, int parentOffset = 0, int nextOffset = 0)
{
int relativeNameOffsetAndFlag = reader.ReadInt32();
int relativeNameOffset = relativeNameOffsetAndFlag;
@ -230,8 +231,8 @@ namespace UniversalEditor.DataFormats.FileSystem.Nintendo.Optical
}
string fileName = m_NameTableEntries[relativeNameOffset];
int diskAddress = reader.ReadInt32();
int fileSize = reader.ReadInt32();
int diskAddress = reader.ReadInt32(); // file_offset or parent_offset (dir)
int fileSize = reader.ReadInt32(); // file_length or num_entries (root) or next_offset (dir)
if (isDirectory)
{
@ -239,7 +240,7 @@ namespace UniversalEditor.DataFormats.FileSystem.Nintendo.Optical
Folder folder = parent.Folders.Add(fileName);
for (int i = 0; i < fileSize; i++)
{
filesRead += LoadFileSystemObject(reader, folder);
filesRead += LoadFileSystemObject(reader, folder, diskAddress, fileSize);
}
return filesRead + 1;
}
@ -247,11 +248,29 @@ namespace UniversalEditor.DataFormats.FileSystem.Nintendo.Optical
{
File file = parent.Files.Add(fileName);
file.Size = fileSize;
file.Properties.Add("offset", diskAddress);
file.Properties.Add("length", fileSize);
file.Properties.Add("reader", reader);
file.DataRequest += file_DataRequest;
return 1;
}
return 0;
}
private void file_DataRequest(object sender, DataRequestEventArgs e)
{
File file = (sender as File);
Reader reader = (Reader)file.Properties["reader"];
int offset = (int)file.Properties["offset"];
int length = (int)file.Properties["length"];
if (offset + length > reader.Accessor.Length) return;
reader.Seek(offset, SeekOrigin.Begin);
byte[] data = reader.ReadBytes(length);
e.Data = data;
}
protected override void SaveInternal(ObjectModel objectModel)
{
throw new NotImplementedException();