diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Nintendo/DataFormats/FileSystem/Nintendo/Optical/NintendoOpticalDiscDataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.Nintendo/DataFormats/FileSystem/Nintendo/Optical/NintendoOpticalDiscDataFormat.cs index 674bbfa8..d0d09813 100644 --- a/CSharp/Plugins/UniversalEditor.Plugins.Nintendo/DataFormats/FileSystem/Nintendo/Optical/NintendoOpticalDiscDataFormat.cs +++ b/CSharp/Plugins/UniversalEditor.Plugins.Nintendo/DataFormats/FileSystem/Nintendo/Optical/NintendoOpticalDiscDataFormat.cs @@ -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();