Exemple #1
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);
        }
Exemple #2
0
        public void AddingEmptyPathThrows()
        {
            var table = new HierarchicalRomFileTable();
            var item  = new RomFileInfo();

            Assert.Throws <ArgumentException>(() => table.AddFile("", ref item));
        }
Exemple #3
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);
        }
Exemple #4
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);
        }
Exemple #5
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");
        }
Exemple #6
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);
        }
Exemple #7
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);
        }
Exemple #8
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);
        }
        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();
        }