internal static void AddFiles(RomfsMetaData metaData, RomfsFile[] entries) { string prevDirPath = ""; for (int i = 0; i < entries.Length; i++) { FileInfo file = new FileInfo(entries[i].FullName); RomfsFileEntry entry = new RomfsFileEntry(); string dirPath = Path.GetDirectoryName(entries[i].FullName); int parentIndex = RomFS.GetRomfsDirEntry(metaData, dirPath); entry.FullName = entries[i].FullName; entry.Offset = metaData.FileTableLen; entry.ParentDirOffset = metaData.DirTable.DirectoryTable[parentIndex].Offset; entry.SiblingOffset = RomfsUnusedEntry; if (dirPath == prevDirPath) { metaData.FileTable.FileTable[i - 1].SiblingOffset = entry.Offset; } if (metaData.DirTable.DirectoryTable[parentIndex].FileOffset == RomfsUnusedEntry) { metaData.DirTable.DirectoryTable[parentIndex].FileOffset = entry.Offset; } entry.HashKeyPointer = RomfsUnusedEntry; entry.NameSize = (uint)file.Name.Length * 2; entry.Name = file.Name; entry.DataOffset = entries[i].Offset; entry.DataSize = entries[i].Size; metaData.FileTable.FileTable.Add(entry); metaData.FileTableLen += 0x20 + (uint)RomFS.Align((ulong)file.Name.Length * 2, 4); prevDirPath = dirPath; } }
internal static void AddDirHashKey(RomfsMetaData metaData, int index) { uint parent = metaData.DirTable.DirectoryTable[index].ParentOffset; string name = metaData.DirTable.DirectoryTable[index].Name; byte[] nArr = index == 0 ? Encoding.Unicode.GetBytes("") : Encoding.Unicode.GetBytes(name); uint hash = RomFS.CalcPathHash(parent, nArr, 0); int ind2 = (int)(hash % metaData.MDirHashTableEntry); if (metaData.DirHashTable[ind2] == RomfsUnusedEntry) { metaData.DirHashTable[ind2] = metaData.DirTable.DirectoryTable[index].Offset; } else { int i = RomFS.GetRomfsDirEntry(metaData, metaData.DirHashTable[ind2]); int tempindex = index; metaData.DirHashTable[ind2] = metaData.DirTable.DirectoryTable[index].Offset; while (true) { if (metaData.DirTable.DirectoryTable[tempindex].HashKeyPointer == RomfsUnusedEntry) { metaData.DirTable.DirectoryTable[tempindex].HashKeyPointer = metaData.DirTable.DirectoryTable[i].Offset; break; } i = tempindex; tempindex = RomFS.GetRomfsDirEntry(metaData, metaData.DirTable.DirectoryTable[i].HashKeyPointer); } } }
internal static void AddDir(RomfsMetaData metaData, DirectoryInfo dir, uint parent, uint sibling, bool doSubs) { DirectoryInfo[] subDirectories = dir.GetDirectories(); if (!doSubs) { uint currentDir = metaData.DirTableLen; RomfsDirEntry entry = new RomfsDirEntry { ParentOffset = parent }; entry.ChildOffset = entry.HashKeyPointer = entry.FileOffset = RomfsUnusedEntry; entry.SiblingOffset = sibling; entry.FullName = dir.FullName; entry.Name = entry.FullName == RootDir ? "" : dir.Name; entry.Offset = currentDir; metaData.DirTable.DirectoryTable.Add(entry); metaData.DirTableLen += currentDir == 0 ? 0x18 : 0x18 + (uint)RomFS.Align((ulong)dir.Name.Length * 2, 4); // int ParentIndex = GetRomfsDirEntry(MetaData, Dir.FullName); // uint poff = MetaData.DirTable.DirectoryTable[ParentIndex].Offset; } else { int curIndex = RomFS.GetRomfsDirEntry(metaData, dir.FullName); uint currentDir = metaData.DirTable.DirectoryTable[curIndex].Offset; for (int i = 0; i < subDirectories.Length; i++) { RomFS.AddDir(metaData, subDirectories[i], currentDir, sibling, false); if (i <= 0) { continue; } string prevFullName = subDirectories[i - 1].FullName; string thisName = subDirectories[i].FullName; int prevIndex = RomFS.GetRomfsDirEntry(metaData, prevFullName); int thisIndex = RomFS.GetRomfsDirEntry(metaData, thisName); metaData.DirTable.DirectoryTable[prevIndex].SiblingOffset = metaData.DirTable.DirectoryTable[thisIndex].Offset; } foreach (DirectoryInfo t in subDirectories) { RomFS.AddDir(metaData, t, currentDir, sibling, true); } } if (subDirectories.Length <= 0) { return; } int curindex = RomFS.GetRomfsDirEntry(metaData, dir.FullName); int childindex = RomFS.GetRomfsDirEntry(metaData, subDirectories[0].FullName); if (curindex > -1 && childindex > -1) { metaData.DirTable.DirectoryTable[curindex].ChildOffset = metaData.DirTable.DirectoryTable[childindex].Offset; } }