Esempio n. 1
0
        public void CreateEntrySmallNoPabTest()
        {
            using (PakArchive archive = new PakArchive(this.smallNoPabStream))
            {
                archive.CreateEntry(@"test\new\entry.txt");

                Assert.AreEqual(4, archive.Entries.Count);
                Assert.AreEqual(0x1000, archive.Entries[0].FileOffset);
                Assert.AreEqual(0x13A760, archive.Entries[3].FileOffsetRelative);
                Assert.AreEqual(0x60, archive.Entries[3].HeaderOffset);

                PakEntry entry;

                this.smallNoPabStream.Position = 0x60;
                entry = PakEntry.ParseHeader(
                    new EndianBinaryReader(EndianBitConverter.Big, this.smallNoPabStream),
                    null);

                Assert.AreEqual(new QbKey(".txt"), entry.FileType);
                Assert.AreEqual(0x13A760, entry.FileOffsetRelative);
                Assert.AreEqual(new QbKey(@"test\new\entry.txt"), entry.FileFullNameKey);

                this.smallNoPabStream.Position = 0x80;
                entry = PakEntry.ParseHeader(
                    new EndianBinaryReader(EndianBitConverter.Big, this.smallNoPabStream),
                    null);

                Assert.AreEqual(new QbKey(".last"), entry.FileType);
                Assert.AreEqual(0x13A740, entry.FileOffsetRelative);
            }
        }
Esempio n. 2
0
        public void CreateEntryLargeWithPabTest()
        {
            using (PakArchive archive = new PakArchive(this.largeWithPabPakStream, this.largeWithPabPabStream)) {
                archive.CreateEntry(@"test\new\entry.txt");

                Assert.AreEqual(128, archive.Entries.Count);
                Assert.AreEqual(0x2000, archive.Entries[0].FileOffset);
                Assert.AreEqual(0x6DC60, archive.Entries.Last().FileOffsetRelative);
                Assert.AreEqual(0xFE0, archive.Entries.Last().HeaderOffset);

                PakEntry entry;

                this.largeWithPabPakStream.Position = 0xFE0;
                entry = PakEntry.ParseHeader(
                    new EndianBinaryReader(EndianBitConverter.Big, this.largeWithPabPakStream),
                    null);

                Assert.AreEqual(new QbKey(".txt"), entry.FileType);
                Assert.AreEqual(0x6DC60, entry.FileOffsetRelative);
                Assert.AreEqual(new QbKey(@"test\new\entry.txt"), entry.FileFullNameKey);

                this.largeWithPabPakStream.Position = 0x1000;
                entry = PakEntry.ParseHeader(
                    new EndianBinaryReader(EndianBitConverter.Big, this.largeWithPabPakStream),
                    null);

                Assert.AreEqual(new QbKey(".last"), entry.FileType);
                Assert.AreEqual(0x6DC40, entry.FileOffsetRelative);
                Assert.AreEqual(0x2000, this.largeWithPabPakStream.Length);
            }
        }
Esempio n. 3
0
        private static void AddEntry(string outputFile, string inputFile, string entryName)
        {
            FileStream outputStream = OpenStream(outputFile, FileMode.Append, FileAccess.Write);
            FileStream inputStream  = OpenStream(inputFile, FileMode.Open, FileAccess.Read);
            DataStream dataStream   = new DataStream(outputStream);

            PakEntry.Serialize(dataStream, inputStream, entryName);

            inputStream.Dispose();
            outputStream.Dispose();
        }
Esempio n. 4
0
        public void CreateNewPak(string directory, string targetPath)
        {
            var entries = new List <PakEntry>();

            foreach (string file in Directory.GetFiles(directory, "*", SearchOption.AllDirectories))
            {
                string[] tokens = file.Split(new string[] { directory + @"\" }, StringSplitOptions.RemoveEmptyEntries);
                foreach (string token in tokens)
                {
                    if (!string.IsNullOrWhiteSpace(token))
                    {
                        string result       = token.Replace(@"\", @"/");
                        var    currentEntry = new PakEntry
                        {
                            Name             = result,
                            Import           = file,
                            UncompressedSize = new FileInfo(file).Length,
                            CompressedSize   = new FileInfo(file).Length,
                            CompressionType  = 0,
                            EncryptionType   = 0,
                        };

                        entries.Add(currentEntry);
                    }
                }
            }

            Model.CreateNewPakFile(MountPoint, entries, Version);

            using (var outputFileStream = File.Open(targetPath, FileMode.Create))
            {
                using (var writer = new PakBinaryWriter(outputFileStream))
                {
                    long currentSize = 0;
                    long totalSize   = Model.Archive.Directory.Entries.Sum(_ => _.UncompressedSize);

                    for (var i = 0; i < Model.Archive.Directory.Entries.Count; i++)
                    {
                        var entry = Model.Archive.Directory.Entries[i];

                        Model.CreateDataEntry(writer, entry, Padding && i + 1 != Model.Archive.Directory.Entries.Count);
                        CurrentProgress = (int)(currentSize * 100.0 / totalSize);
                        CurrentFile     = entry.Name;
                        currentSize    += entry.UncompressedSize;
                    }

                    Model.SavePakFileStructure(writer);
                }
            }
        }
        public void SetFlagsEmbedNameAlreadyUnsetTest()
        {
            PakEntry entry = new PakEntry(null)
            {
                FileFullNameKey  = new QbKey(@"path\to\test_filename"),
                FileShortNameKey = new QbKey("test_filename")
            };

            entry.Flags = 0;

            Assert.AreEqual((PakEntryFlags)0, entry.Flags);
            Assert.IsNull(entry.EmbeddedFilename);
            Assert.AreEqual(new QbKey(0), entry.EmbeddedFilenameKey);
            Assert.AreEqual(new QbKey(@"path\to\test_filename"), entry.FileFullNameKey);
            Assert.AreEqual(new QbKey("test_filename"), entry.FileShortNameKey);
        }
        public void SetEmbedNameNullTest()
        {
            PakEntry entry = new PakEntry(null)
            {
                EmbeddedFilename = @"path\to\test_filename",
                FileShortNameKey = new QbKey("test_filename")
            };

            entry.EmbeddedFilename = null;

            Assert.AreEqual((PakEntryFlags)0, entry.Flags);
            Assert.IsNull(entry.EmbeddedFilename);
            Assert.AreEqual(new QbKey(@"path\to\test_filename"), entry.FileFullNameKey);
            Assert.AreEqual(new QbKey("test_filename"), entry.FileShortNameKey);
            Assert.AreEqual(new QbKey(0), entry.EmbeddedFilenameKey);
        }
        public void SetEmbedNameNonNullTest()
        {
            PakEntry entry = new PakEntry(null)
            {
                FileFullNameKey  = new QbKey(@"path\to\test_filename"),
                FileShortNameKey = new QbKey("test_filename")
            };

            entry.EmbeddedFilename = @"path\to\test_filename_new";

            Assert.AreEqual(PakEntryFlags.HasEmbeddedFilename, entry.Flags);
            Assert.AreEqual(@"path\to\test_filename_new", entry.EmbeddedFilename);
            Assert.AreEqual(new QbKey(0), entry.FileFullNameKey);
            Assert.AreEqual(new QbKey("test_filename_new"), entry.FileShortNameKey);
            Assert.AreEqual(new QbKey(@"path\to\test_filename_new"), entry.EmbeddedFilenameKey);
        }
        public void SetFlagsEmbedNameAlreadySetTest()
        {
            PakEntry entry = new PakEntry(null)
            {
                EmbeddedFilename = @"path\to\test_filename",
                FileShortNameKey = new QbKey("test_filename")
            };

            entry.Flags = PakEntryFlags.HasEmbeddedFilename;

            Assert.AreEqual(PakEntryFlags.HasEmbeddedFilename, entry.Flags);
            Assert.AreEqual(@"path\to\test_filename", entry.EmbeddedFilename);
            Assert.AreEqual(new QbKey(0), entry.FileFullNameKey);
            Assert.AreEqual(new QbKey("test_filename"), entry.FileShortNameKey);
            Assert.AreEqual(new QbKey(@"path\to\test_filename"), entry.EmbeddedFilenameKey);
        }
        public void ParseHeaderNoEmbeddedNameTest()
        {
            PakEntry entry;

            using (var sample = TestHelpers.OpenSample("PakEntry.NoEmbeddedName.dat"))
                using (var br = new EndianBinaryReader(EndianBitConverter.Big, sample)) {
                    entry = PakEntry.ParseHeader(br, null);
                }

            Assert.AreEqual(new QbKey(0xA7F505C4), entry.FileType);
            Assert.AreEqual(0x1000, entry.FileOffset);
            Assert.AreEqual(0xA4, entry.FileLength);
            Assert.AreEqual(new QbKey(0), entry.EmbeddedFilenameKey);
            Assert.AreEqual(new QbKey(0x99360D32), entry.FileFullNameKey);
            Assert.AreEqual(new QbKey(0xF6E6D11A), entry.FileShortNameKey);
            Assert.AreEqual(0, entry.Unknown);
            Assert.AreEqual((PakEntryFlags)0, entry.Flags);
            Assert.IsNull(entry.EmbeddedFilename);
        }
Esempio n. 10
0
        public void CreateEntryLargeNoPabTest()
        {
            using (PakArchive archive = new PakArchive(this.largeNoPabStream)) {
                archive.CreateEntry(@"test\new\entry.txt");

                Assert.AreEqual(128, archive.Entries.Count);
                Assert.AreEqual(0x2000, archive.Entries[0].FileOffset);
                Assert.AreEqual(0x6DC60, archive.Entries.Last().FileOffsetRelative);
                Assert.AreEqual(0xFE0, archive.Entries.Last().HeaderOffset);

                PakEntry entry;

                this.largeNoPabStream.Position = 0xFE0;
                entry = PakEntry.ParseHeader(
                    new EndianBinaryReader(EndianBitConverter.Big, this.largeNoPabStream),
                    null);

                Assert.AreEqual(new QbKey(".txt"), entry.FileType);
                Assert.AreEqual(0x6DC60, entry.FileOffsetRelative);
                Assert.AreEqual(new QbKey(@"test\new\entry.txt"), entry.FileFullNameKey);

                this.largeNoPabStream.Position = 0x1000;
                entry = PakEntry.ParseHeader(
                    new EndianBinaryReader(EndianBitConverter.Big, this.largeNoPabStream),
                    null);

                Assert.AreEqual(new QbKey(".last"), entry.FileType);
                Assert.AreEqual(0x6DC40, entry.FileOffsetRelative);

                this.largeNoPabStream.Position = 0x2000;
                var bytes    = new byte[0x20];
                var expected = new byte[]
                {
                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x1C, 0x08, 0x02, 0x04, 0x10, 0x04, 0x08, 0x0C,
                    0x0C, 0x08, 0x02, 0x04, 0x14, 0x02, 0x04, 0x0C, 0x10, 0x10, 0x0C, 0x00, 0x00, 0x20, 0x07, 0x00
                };
                this.largeNoPabStream.Read(bytes, 0, 0x20);

                Assert.AreEqual(expected, bytes);
            }
        }
Esempio n. 11
0
        private static void CreatePackage(string inputFile, string outputFile)
        {
            FileStream outputStream = OpenStream(outputFile, FileMode.Create, FileAccess.Write);
            DataStream dataStream   = new DataStream(outputStream);

            if (!inputFile.EndsWith("\\"))
            {
                inputFile += "\\";
            }

            foreach (string file in Directory.GetFiles(inputFile, "*", SearchOption.AllDirectories))
            {
                string     entryName   = file.Substring(inputFile.Length);
                FileStream inputStream = OpenStream(file, FileMode.Open, FileAccess.Read);

                PakEntry.Serialize(dataStream, inputStream, entryName);

                inputStream.Dispose();
            }

            outputStream.Dispose();
        }