Example #1
0
        public void AddingEmptyPathThrows()
        {
            var table = new HierarchicalRomFileTable();
            var item  = new RomFileInfo();

            Assert.Throws <ArgumentException>(() => table.AddFile("", ref item));
        }
Example #2
0
        public void AddingCousinFiles()
        {
            var table = new HierarchicalRomFileTable();

            var itemB1 = new RomFileInfo {
                Length = 1, Offset = 1
            };
            var itemB2 = new RomFileInfo {
                Length = 2, Offset = 2
            };
            var itemB3 = new RomFileInfo {
                Length = 3, Offset = 3
            };

            table.AddFile("/a/b1/c", ref itemB1);
            table.AddFile("/a/b2/c", ref itemB2);
            table.AddFile("/a/b3/c", ref itemB3);

            table.TryOpenFile("/a/b1/c", out RomFileInfo actualItemB1);
            table.TryOpenFile("/a/b2/c", out RomFileInfo actualItemB2);
            table.TryOpenFile("/a/b3/c", out RomFileInfo actualItemB3);

            Assert.Equal(itemB1, actualItemB1);
            Assert.Equal(itemB2, actualItemB2);
            Assert.Equal(itemB3, actualItemB3);
        }
Example #3
0
        public void AddingSiblingFiles()
        {
            var table = new HierarchicalRomFileTable();

            var itemC1 = new RomFileInfo {
                Length = 1, Offset = 1
            };
            var itemC2 = new RomFileInfo {
                Length = 2, Offset = 2
            };
            var itemC3 = new RomFileInfo {
                Length = 3, Offset = 3
            };

            table.AddFile("/a/b/c1", ref itemC1);
            table.AddFile("/a/b/c2", ref itemC2);
            table.AddFile("/a/b/c3", ref itemC3);

            table.TryOpenFile("/a/b/c1", out RomFileInfo actualItemC1);
            table.TryOpenFile("/a/b/c2", out RomFileInfo actualItemC2);
            table.TryOpenFile("/a/b/c3", out RomFileInfo actualItemC3);

            Assert.Equal(itemC1, actualItemC1);
            Assert.Equal(itemC2, actualItemC2);
            Assert.Equal(itemC3, actualItemC3);
        }
Example #4
0
        public void ChildFileIteration()
        {
            const int fileCount = 10;
            var       table     = new HierarchicalRomFileTable();

            for (int i = 0; i < fileCount; i++)
            {
                var item = new RomFileInfo {
                    Length = i, Offset = i
                };
                table.AddFile($"/a/{i}", ref item);
            }

            bool openDirSuccess = table.TryOpenDirectory("/a", out FindPosition position);

            Assert.True(openDirSuccess, "Error opening directory");

            for (int i = 0; i < fileCount; i++)
            {
                var expectedItem = new RomFileInfo {
                    Length = i, Offset = i
                };
                string expectedName = i.ToString();

                bool success = table.FindNextFile(ref position, out RomFileInfo actualItem, out string actualName);

                Assert.True(success, $"Failed reading file {i}");
                Assert.Equal(expectedItem, actualItem);
                Assert.Equal(expectedName, actualName);
            }

            bool endOfFilesSuccess = table.FindNextFile(ref position, out _, out _);

            Assert.False(endOfFilesSuccess, "Table returned more files than it should");
        }
Example #5
0
        public void ChildFileIterationPeek()
        {
            var table = new HierarchicalRomFileTable();

            var itemA = new RomFileInfo {
                Length = 1, Offset = 1
            };
            var itemB = new RomFileInfo {
                Length = 2, Offset = 2
            };

            table.AddFile("/a/a", ref itemA);
            table.AddFile("/a/b", ref itemB);

            table.TryOpenDirectory("/a", out FindPosition position);

            table.TryOpenFile(position.NextFile, out RomFileInfo peekItemA);
            Assert.Equal(itemA, peekItemA);

            table.FindNextFile(ref position, out RomFileInfo iterateItemA, out _);
            Assert.Equal(itemA, iterateItemA);

            table.TryOpenFile(position.NextFile, out RomFileInfo peekItemB);
            Assert.Equal(itemB, peekItemB);

            table.FindNextFile(ref position, out RomFileInfo iterateItemB, out _);
            Assert.Equal(itemB, iterateItemB);
        }
Example #6
0
        public int GetEntryCount()
        {
            int count = 0;

            FindPosition             position = InitialPosition;
            HierarchicalRomFileTable tab      = ParentFileSystem.FileTable;

            if (Mode.HasFlag(OpenDirectoryMode.Directories))
            {
                while (tab.FindNextDirectory(ref position, out string _))
                {
                    count++;
                }
            }

            if (Mode.HasFlag(OpenDirectoryMode.Files))
            {
                while (tab.FindNextFile(ref position, out RomFileInfo _, out string _))
                {
                    count++;
                }
            }

            return(count);
        }
Example #7
0
        public void OpeningNonexistentDirectoryFails()
        {
            var table = new HierarchicalRomFileTable();

            bool success = table.TryOpenDirectory("/foo", out _);

            Assert.False(success);
        }
Example #8
0
        public void OpeningNonexistentFileFails()
        {
            var table = new HierarchicalRomFileTable <RomFileInfo>();

            bool success = table.TryOpenFile("/foo", out _);

            Assert.False(success);
        }
Example #9
0
        public void OpeningDirectoryAsFileFails()
        {
            var table = new HierarchicalRomFileTable();

            table.AddDirectory("/dir");

            bool success = table.TryOpenFile("/dir", out _);

            Assert.False(success);
        }
Example #10
0
        public void OpeningFileAsDirectoryFails()
        {
            var table    = new HierarchicalRomFileTable();
            var fileInfo = new RomFileInfo();

            table.AddFile("/file", ref fileInfo);

            bool success = table.TryOpenDirectory("/file", out _);

            Assert.False(success);
        }
Example #11
0
        public void AddingDirectory()
        {
            var table            = new HierarchicalRomFileTable();
            var expectedPosition = new FindPosition {
                NextDirectory = -1, NextFile = -1
            };

            table.AddDirectory("/dir");
            bool success = table.TryOpenDirectory("/dir", out FindPosition position);

            Assert.True(success, "Opening directory failed");
            Assert.Equal(expectedPosition, position);
        }
Example #12
0
        public void SimpleAddAndRead()
        {
            const string path = "/a/b";

            var table = new HierarchicalRomFileTable();
            var item  = new RomFileInfo {
                Length = 1, Offset = 1
            };

            table.AddFile(path, ref item);
            bool success = table.TryOpenFile(path, out RomFileInfo readItem);

            Assert.True(success, "Table read failed");
            Assert.Equal(item, readItem);
        }
Example #13
0
        public void UpdateExistingFile()
        {
            const string path = "/a/b";

            var table        = new HierarchicalRomFileTable();
            var originalItem = new RomFileInfo {
                Length = 1, Offset = 1
            };
            var newItem = new RomFileInfo {
                Length = 1, Offset = 1
            };

            table.AddFile(path, ref originalItem);
            table.AddFile(path, ref newItem);

            bool success = table.TryOpenFile(path, out RomFileInfo readItem);

            Assert.True(success, "Table read failed");
            Assert.Equal(newItem, readItem);
        }
Example #14
0
        public IEnumerable <DirectoryEntry> Read()
        {
            FindPosition             position = InitialPosition;
            HierarchicalRomFileTable tab      = ParentFileSystem.FileTable;

            if (Mode.HasFlag(OpenDirectoryMode.Directories))
            {
                while (tab.FindNextDirectory(ref position, out string name))
                {
                    yield return(new DirectoryEntry(name, FullPath + '/' + name, DirectoryEntryType.Directory, 0));
                }
            }

            if (Mode.HasFlag(OpenDirectoryMode.Files))
            {
                while (tab.FindNextFile(ref position, out RomFileInfo info, out string name))
                {
                    yield return(new DirectoryEntry(name, FullPath + '/' + name, DirectoryEntryType.File, info.Length));
                }
            }
        }
Example #15
0
        public ArchiveFileSystem(IFile headerFile, IFile dataFile)
        {
            var header = new byte[headerFile.GetSize()];

            headerFile.Read(header, 0);

            DecryptArh(header);

            using (var stream = new MemoryStream(header))
                using (var reader = new BinaryReader(stream))
                {
                    stream.Position   = 4;
                    Field4            = reader.ReadInt32();
                    NodeCount         = reader.ReadInt32();
                    StringTableOffset = reader.ReadInt32();
                    StringTableLength = reader.ReadInt32();
                    NodeTableOffset   = reader.ReadInt32();
                    NodeTableLength   = reader.ReadInt32();
                    FileTableOffset   = reader.ReadInt32();
                    FileCount         = reader.ReadInt32();
                    Key = reader.ReadUInt32() ^ 0xF3F35353;

                    stream.Position = StringTableOffset;
                    StringTable     = reader.ReadBytes(StringTableLength);

                    Nodes           = new Node[NodeCount];
                    stream.Position = NodeTableOffset;

                    for (int i = 0; i < NodeCount; i++)
                    {
                        Nodes[i] = new Node
                        {
                            Next = reader.ReadInt32(),
                            Prev = reader.ReadInt32()
                        };
                    }

                    FileInfo        = new FileInfo[FileCount];
                    stream.Position = FileTableOffset;

                    for (int i = 0; i < FileCount; i++)
                    {
                        FileInfo[i] = new FileInfo(reader);
                    }

                    AddAllFilenames();
                }

            DataFile = dataFile.AsStorage();

            FileTable = new HierarchicalRomFileTable();
            var romFileInfo = new RomFileInfo();

            File.WriteAllLines("archive.txt", FileInfo.Select(x => x.Filename));

            for (int i = 0; i < FileInfo.Length; i++)
            {
                if (FileInfo[i].Filename == null)
                {
                    continue;
                }

                romFileInfo.Offset = i;
                FileTable.AddFile(FileInfo[i].Filename, ref romFileInfo);
            }

            FileTable.TrimExcess();
        }