Added additional source and attempted to improve loading file system objects (opening.bnr loads fine, others not so much)
This commit is contained in:
parent
4473a032d3
commit
eca27273f3
@ -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();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user