Beispiel #1
0
        protected override BinaryFile GetBinaryFile(CacheFileInfo fileInfo)
        {
            // Single file
            if (!fileInfo.UsesEntries)
            {
                return(new BinaryFile
                {
                    Info = fileInfo,
                    Data = File.ReadAllBytes(this.GetExistingFilePaths(fileInfo.Index, fileInfo.FileId.Value).First())
                });
            }

            // Entries
            var entryFile = new EntryFile
            {
                Info = fileInfo
            };

            foreach (var existingEntryPath in this.GetExistingEntryPaths(fileInfo.Index, fileInfo.FileId.Value))
            {
                entryFile.AddEntry(existingEntryPath.Key, File.ReadAllBytes(existingEntryPath.Value));
            }

            // TODO: Return EntryFile directly so it doesn't have to be needlessly encoded
            return(entryFile.ToBinaryFile());
        }
Beispiel #2
0
        public void TestEncodeDecodeWithEmptyEntries()
        {
            var entryData = new byte[] { 0, 12, 123, 8 };

            var entryFile = new EntryFile
            {
                Info = new CacheFileInfo
                {
                    EntryInfo = new SortedDictionary <int, CacheFileEntryInfo>
                    {
                        { 5, new CacheFileEntryInfo {
                              EntryId = 5
                          } }
                    }
                }
            };

            entryFile.AddEntry(5, entryData);

            var binaryFile = entryFile.ToBinaryFile();

            var decodedEntryFile = new EntryFile();

            decodedEntryFile.FromBinaryFile(binaryFile);

            Assert.True(entryData.SequenceEqual(decodedEntryFile.GetEntry <BinaryFile>(5).Data));
        }
Beispiel #3
0
        public void TestEntryFile()
        {
            var binaryFile = this.Fixture.RuneTek5Cache.GetFile <BinaryFile>(Index.ItemDefinitions, 155);
            var entryFile  = new EntryFile();

            entryFile.FromBinaryFile(binaryFile);

            var binaryFile1 = entryFile.GetEntry <BinaryFile>(0);

            Assert.Equal(242, binaryFile1.Data.Length);

            var itemDefinitionFile = entryFile.GetEntry <ItemDefinitionFile>(0);

            Assert.Equal(2609, itemDefinitionFile.UnknownShort4);

            var itemDefinitionFiles = entryFile.GetEntries <ItemDefinitionFile>();

            Assert.Equal(256, entryFile.EntryCount);
            Assert.Equal(2609, itemDefinitionFiles.First(file => file.Info.EntryId == 0).UnknownShort4);

            Assert.True(entryFile.Encode().SequenceEqual(binaryFile.Data));
        }
Beispiel #4
0
        protected override void PutBinaryFile(BinaryFile file)
        {
            // Throw an exception if the output directory is not yet set or does not exist
            if (string.IsNullOrWhiteSpace(this.BaseDirectory))
            {
                throw new InvalidOperationException("Base directory must be set before writing files.");
            }

            var indexDirectory = this.GetIndexDirectory(file.Info.Index);

            // Create index directory for when it does not exist yet
            Directory.CreateDirectory(indexDirectory);

            // Clean existing files/entries
            foreach (var existingFilePath in this.GetExistingFilePaths(file.Info.Index, file.Info.FileId.Value))
            {
                File.Delete(existingFilePath);
            }

            var entryDirectory = this.GetEntryDirectory(file.Info.Index, file.Info.FileId.Value);

            if (Directory.Exists(entryDirectory))
            {
                Directory.Delete(entryDirectory, true);
            }

            if (!file.Info.UsesEntries)
            {
                // Extract file
                if (file.Data.Length > 0)
                {
                    var extension = ExtensionGuesser.GuessExtension(file.Data);
                    extension = extension != null ? $".{extension}" : "";

                    var filePath = $"{indexDirectory}{file.Info.FileId}{extension}";
                    File.WriteAllBytes(filePath, file.Data);

                    _logger.Information($"Wrote {(int)file.Info.Index}/{file.Info.FileId}.");
                }
                else
                {
                    _logger.Information($"Did not write {(int)file.Info.Index}/{file.Info.FileId} because it is empty.");
                }
            }
            else
            {
                // Extract entries
                var entryFile = new EntryFile();
                entryFile.FromBinaryFile(file);

                if (!entryFile.Empty)
                {
                    Directory.CreateDirectory(entryDirectory);

                    var entryBinaryFiles = entryFile.GetEntries <BinaryFile>().ToList();
                    foreach (var entryBinaryFile in entryBinaryFiles)
                    {
                        var extension = ExtensionGuesser.GuessExtension(entryBinaryFile.Data);
                        extension = extension != null ? $".{extension}" : "";

                        var entryPath = $"{entryDirectory}{entryBinaryFile.Info.EntryId}{extension}";
                        File.WriteAllBytes(entryPath, entryBinaryFile.Data);
                    }

                    _logger.Information($"Wrote {(int)file.Info.Index}/{file.Info.FileId} ({entryBinaryFiles.Count} entries).");
                }
                else
                {
                    _logger.Information($"Did not write {(int)file.Info.Index}/{file.Info.FileId} because it contains no entries.");
                }
            }
        }
Beispiel #5
0
        public static void FileInfo(FileInfo fi, string comment = null)
        {
            EntryFile e = new EntryFile(fi, comment);

            AddEntry(e);
        }