Exemplo n.º 1
0
        public void IsContainerIfFormatNodeContainer()
        {
            NodeContainerFormat format = new NodeContainerFormat();

            using Node node = new Node("NodeTest", format);
            Assert.IsTrue(node.IsContainer);
        }
Exemplo n.º 2
0
        public void CanWriteEmptyFiles()
        {
            byte[] expected =
            {
                0xF9, 0x7D, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            };
            var expectedStream = DataStreamFactory.FromArray(expected, 0, expected.Length);

            var writer     = new StandardBinWriter();
            var parameters = new WriterParameters {
                BlockSize = 0x20
            };

            writer.Initialize(parameters);

            var container = new NodeContainerFormat();
            var node      = NodeFactory.FromMemory("empty");

            node.Tags["Type"]  = FileType.Empty;
            node.Tags["Index"] = 1;
            container.Root.Add(node);

            var binaryFormat = writer.Convert(container);

            Assert.AreEqual(expected.Length, binaryFormat.Stream.Length);
            Assert.IsTrue(binaryFormat.Stream.Compare(expectedStream));
        }
Exemplo n.º 3
0
        public void ZeroChildrenContainerThrowsException()
        {
            var writer    = new StandardBinWriter();
            var container = new NodeContainerFormat();

            Assert.Throws <FormatException>(() => writer.Convert(container));
        }
Exemplo n.º 4
0
        private static void Export(string format, Node n, string outputPath)
        {
            log.Info("Exporting...");

            switch (format)
            {
            case FORMATPREFIX + "BinTutorial":

                n.TransformWith <BinaryFormat2BinTutorial>()
                .TransformWith <Bin2Po>()
                .TransformWith <Po2Binary>()
                .Stream.WriteTo(Path.Combine(outputPath, n.Name + ".po"));

                break;

            case FORMATPREFIX + "BinInfoTitle":

                n.TransformWith <Binary2BinInfoTitle>()
                .TransformWith <BinInfoTitle2Po>()
                .TransformWith <Po2Binary>()
                .Stream.WriteTo(Path.Combine(outputPath, n.Name + ".po"));

                break;

            case FORMATPREFIX + "BinQuiz":

                var quizs = n.TransformWith <Binary2BinQuiz>()
                            .TransformWith <Quiz2Po>();

                foreach (Node po in quizs.Children)
                {
                    string outputFile = Path.Combine(outputPath, po.Name + ".po");
                    log.Info("Saving " + outputFile);
                    po.TransformWith <Po2Binary>()
                    .Stream.WriteTo(outputFile);
                }

                break;

            case FORMATPREFIX + "ALAR.ALAR3":

                NodeContainerFormat folder = n.TransformWith <BinaryFormat2Alar3>()
                                             .TransformWith <Alar3ToNodes>().GetFormatAs <NodeContainerFormat>();

                SaveContainerToDir(folder, outputPath);

                break;

            case FORMATPREFIX + "ALAR.ALAR2":

                var root = n.TransformWith <BinaryFormat2Alar2>()
                           .TransformWith <Alar2ToNodes>();

                SaveNodeToDir(root, outputPath);

                break;
            }

            log.Info("Finished exporting");
        }
Exemplo n.º 5
0
        public void SetContainerFormatAddChildren()
        {
            Node node = new Node("MyTest");
            NodeContainerFormat format = new NodeContainerFormat();

            format.Root.Add(new Node("Child"));
            node.Format = format;

            Assert.AreEqual(1, node.Children.Count);
            Assert.AreSame(format.Root.Children[0], node.Children[0]);
        }
Exemplo n.º 6
0
        public void UnknownFileTypeThrowsException()
        {
            var writer    = new StandardBinWriter();
            var container = new NodeContainerFormat();
            var node      = NodeFactory.FromMemory("empty");

            node.Tags["Type"]  = (FileType)27;
            node.Tags["Index"] = 1;
            container.Root.Add(node);

            Assert.Throws <FormatException>(() => writer.Convert(container));
        }
Exemplo n.º 7
0
        public void SetContainerFormatAddChildren()
        {
            using Node node = new Node("MyTest");
            NodeContainerFormat format = new NodeContainerFormat();

            format.Root.Add(new Node("Child"));
            node.ChangeFormat(format);

            Assert.AreEqual(1, node.Children.Count);
            Assert.AreSame(format.Root.Children[0], node.Children[0]);
            Assert.AreEqual("/MyTest/Child", node.Children[0].Path);
            Assert.AreSame(node, node.Children[0].Parent);
        }
Exemplo n.º 8
0
        public void SetFromContainerToDifferentCleanChildren()
        {
            using Node node = new Node("mytest");
            NodeContainerFormat format = new NodeContainerFormat();

            format.Root.Add(new Node("Child"));
            node.ChangeFormat(format);
            Assert.IsNotEmpty(node.Children);

            StringFormatTest newFormat = new StringFormatTest("3");

            node.ChangeFormat(newFormat);
            Assert.IsEmpty(node.Children);
        }
Exemplo n.º 9
0
        public void SetContainerFormatTransferHandlingToNode()
        {
            using Node node = new Node("MyTest");
            NodeContainerFormat format = new NodeContainerFormat();

            format.Root.Add(new Node("Child"));
            node.ChangeFormat(format);

            // It must be the same parent
            Assert.AreSame(node, format.Root);
            format.Dispose();
            Assert.IsFalse(node.Disposed);
            Assert.IsNotEmpty(node.Children);
            Assert.IsFalse(node.Children[0].Disposed);
        }
Exemplo n.º 10
0
        public void CanWriteBigEndianFiles()
        {
            byte[] expected =
            {
                0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0xBA, 0xAD, 0xF0, 0x0D, 0xBA, 0xAD, 0xF0, 0x0D, 0xBA, 0xAD, 0xF0, 0x0D, 0xBA, 0xAD, 0xF0, 0x0D,
            };
            var expectedStream = DataStreamFactory.FromArray(expected, 0, expected.Length);

            var writer = new DlcBinWriter();
            writer.Initialize(new WriterParameters
            {
                Endianness = EndiannessMode.BigEndian,
            });
            var container = new NodeContainerFormat();
            var node = NodeFactory.FromMemory("normal");
            node.Stream.Write(new byte[]
            {
                0xBA, 0xAD, 0xF0, 0x0D, 0xBA, 0xAD, 0xF0, 0x0D, 0xBA, 0xAD, 0xF0, 0x0D, 0xBA, 0xAD, 0xF0, 0x0D,
            });

            node.Tags["Index"] = 1;
            container.Root.Add(node);

            var binaryFormat = writer.Convert(container);
            Assert.AreEqual(expected.Length, binaryFormat.Stream.Length);
            Assert.IsTrue(binaryFormat.Stream.Compare(expectedStream));
        }
Exemplo n.º 11
0
        public void DefaultBlockSize()
        {
            var writer     = new StandardBinWriter();
            var parameters = new WriterParameters {
                Endianness = EndiannessMode.BigEndian
            };

            writer.Initialize(parameters);

            var container = new NodeContainerFormat();
            var node      = NodeFactory.FromMemory("empty");

            node.Tags["Type"]  = FileType.Empty;
            node.Tags["Index"] = 1;
            container.Root.Add(node);

            var binaryFormat = writer.Convert(container);

            Assert.AreEqual(0x800, binaryFormat.Stream.Length);
        }
Exemplo n.º 12
0
        private static void SaveContainerToDir(NodeContainerFormat folder, string output)
        {
            // PROBLEMA ACTUAL
            // Tenemos un string llamado output con el nombre de la carpeta destino
            // child.Path tiene la ruta del fichero a extraer
            // QUeremos combinar output con child.Path, pero no funciona!
            // outputFile debería valer "/output/demo.aar/demo"

            Directory.CreateDirectory(output);
            foreach (var child in Navigator.IterateNodes(folder.Root))
            {
                string outputFile = output + child.Path;
                if (!child.IsContainer)
                {
                    child.GetFormatAs <BinaryFormat>().Stream.WriteTo(outputFile);
                    log.Info("Saving " + outputFile);
                }
            }

            log.Info("Saved in " + output);
        }
Exemplo n.º 13
0
        public void CanWriteDummyFiles()
        {
            byte[] expected =
            {
                0x00, 0x07, 0x7D, 0xF9, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0x83, 0x5F, 0x83, 0x7E,
                0x83, 0x5F, 0x83, 0x7E, 0x81, 0x5B, 0x82, 0xC5, 0x82, 0xB7, 0x2E, 0x0D, 0x0A, 0x90, 0xB3, 0x8E,
                0xAE, 0x82, 0xC8, 0x83, 0x66, 0x81, 0x5B, 0x83, 0x5E, 0x82, 0xAA, 0x93, 0xFC, 0x82, 0xE9, 0x82,
                0xDC, 0x82, 0xC5, 0x81, 0x41, 0x82, 0xD0, 0x82, 0xC6, 0x82, 0xDC, 0x82, 0xB8, 0x83, 0x8A, 0x83,
                0x93, 0x83, 0x4E, 0x83, 0x66, 0x81, 0x5B, 0x83, 0x5E, 0x82, 0xF0, 0x8D, 0xEC, 0x90, 0xAC, 0x82,
                0xB7, 0x82, 0xE9, 0x82, 0xBD, 0x82, 0xDF, 0x82, 0xCC, 0x83, 0x5F, 0x83, 0x7E, 0x81, 0x5B, 0x83,
                0x74, 0x83, 0x40, 0x83, 0x43, 0x83, 0x8B, 0x82, 0xC6, 0x82, 0xB5, 0x82, 0xC4, 0x8D, 0xEC, 0x90,
                0xAC, 0x82, 0xB3, 0x82, 0xEA, 0x82, 0xC4, 0x82, 0xA2, 0x82, 0xDC, 0x82, 0xB7, 0x2E, 0x0D, 0x0A,
            };
            var expectedStream = DataStreamFactory.FromArray(expected, 0, expected.Length);

            var writer     = new StandardBinWriter();
            var parameters = new WriterParameters
            {
                Endianness = EndiannessMode.BigEndian,
                BlockSize  = 0x20,
            };

            writer.Initialize(parameters);

            var container = new NodeContainerFormat();
            var node      = NodeFactory.FromMemory("dummy");

            node.Tags["Type"]  = FileType.Dummy;
            node.Tags["Index"] = 1;
            container.Root.Add(node);

            var binaryFormat = writer.Convert(container);

            Assert.AreEqual(expected.Length, binaryFormat.Stream.Length);
            Assert.IsTrue(binaryFormat.Stream.Compare(expectedStream));
        }
Exemplo n.º 14
0
        public ParFile Convert(NodeContainerFormat source)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            DataStream dataStream = string.IsNullOrEmpty(this.parameters.OutputPath) ? DataStreamFactory.FromMemory() : DataStreamFactory.FromFile(this.parameters.OutputPath, FileOpenMode.Write);

            var writer = new DataWriter(dataStream)
            {
                DefaultEncoding = Encoding.GetEncoding(1252),
                Endianness      = EndiannessMode.BigEndian,
            };

            var folders = new List <Node>();
            var files   = new List <Node>();

            if (this.parameters.IncludeDots)
            {
                var parFolderRootNode = new Node(".", new NodeContainerFormat());
                source.MoveChildrenTo(parFolderRootNode);
                folders.Add(parFolderRootNode);
            }

            GetFoldersAndFiles(source.Root, folders, files, this.parameters);
            CompressFiles(files, this.parameters.CompressorVersion);

            int  headerSize        = 32 + (64 * folders.Count) + (64 * files.Count);
            int  folderTableOffset = headerSize;
            int  fileTableOffset   = folderTableOffset + (folders.Count * 32);
            long dataPosition      = fileTableOffset + (files.Count * 32);

            dataPosition = Align(dataPosition, 2048);

            writer.Write("PARC", 4, false);

            if (source.Root.Tags.ContainsKey("PlatformId"))
            {
                writer.Write((byte)source.Root.Tags["PlatformId"]);
            }
            else
            {
                writer.Write((byte)0x02);
            }

            if (source.Root.Tags.ContainsKey("Endianness"))
            {
                var endianness = (byte)source.Root.Tags["Endianness"];
                writer.Write(endianness);
                writer.Endianness = endianness == 0x00 ? EndiannessMode.LittleEndian : EndiannessMode.BigEndian;
            }
            else
            {
                writer.Write((byte)0x01);
            }

            writer.Write((ushort)0x0000); // extended size and relocated

            if (source.Root.Tags.ContainsKey("Version"))
            {
                writer.Write((int)source.Root.Tags["Version"]);
            }
            else
            {
                writer.Write(0x00020001);
            }

            writer.Write(0x00000000); // data size

            writer.Write(folders.Count);
            writer.Write(folderTableOffset);
            writer.Write(files.Count);
            writer.Write(fileTableOffset);

            WriteNames(writer, folders);
            WriteNames(writer, files);

            WriteFolders(writer, folders);
            WriteFiles(writer, files, dataPosition);

            dataStream.Seek(0, SeekMode.End);
            writer.WritePadding(0, 2048);

            var result = new ParFile(dataStream)
            {
                CanBeCompressed = false,
            };

            return(result);
        }
Exemplo n.º 15
0
        public NodeContainerFormat Convert(BinaryFormat source)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            source.Stream.Position = 0;

            var result = new NodeContainerFormat();

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            var reader = new DataReader(source.Stream)
            {
                DefaultEncoding = Encoding.GetEncoding(1252),
                Endianness      = EndiannessMode.BigEndian,
            };

            string magicId = reader.ReadString(4);

            if (magicId == "SLLZ")
            {
                var subStream  = new DataStream(source.Stream, 0, source.Stream.Length);
                var compressed = new ParFile(subStream);
                source = (ParFile)ConvertFormat.With <Sllz.Decompressor>(compressed);
                source.Stream.Position = 0;

                reader = new DataReader(source.Stream)
                {
                    DefaultEncoding = Encoding.GetEncoding(1252),
                    Endianness      = EndiannessMode.BigEndian,
                };

                magicId = reader.ReadString(4);
            }

            if (magicId != "PARC")
            {
                throw new FormatException("PARC: Bad magic Id.");
            }

            result.Root.Tags["PlatformId"] = reader.ReadByte();
            byte endianness = reader.ReadByte();

            result.Root.Tags["Endianness"]   = endianness;
            result.Root.Tags["SizeExtended"] = reader.ReadByte();
            result.Root.Tags["Relocated"]    = reader.ReadByte();

            if (endianness == 0x00)
            {
                reader.Endianness = EndiannessMode.LittleEndian;
            }

            result.Root.Tags["Version"]  = reader.ReadInt32();
            result.Root.Tags["DataSize"] = reader.ReadInt32();

            int totalFolderCount = reader.ReadInt32();
            int folderInfoOffset = reader.ReadInt32();
            int totalFileCount   = reader.ReadInt32();
            int fileInfoOffset   = reader.ReadInt32();

            var folderNames = new string[totalFolderCount];

            for (var i = 0; i < totalFolderCount; i++)
            {
                folderNames[i] = reader.ReadString(0x40).TrimEnd('\0');
                if (folderNames[i].Length < 1)
                {
                    folderNames[i] = ".";
                }
            }

            var fileNames = new string[totalFileCount];

            for (var i = 0; i < totalFileCount; i++)
            {
                fileNames[i] = reader.ReadString(0x40).TrimEnd('\0');
            }

            reader.Stream.Seek(folderInfoOffset);
            var folders = new Node[totalFolderCount];

            for (var i = 0; i < totalFolderCount; i++)
            {
                folders[i] = new Node(folderNames[i], new NodeContainerFormat())
                {
                    Tags =
                    {
                        ["FolderCount"]      = reader.ReadInt32(),
                        ["FirstFolderIndex"] = reader.ReadInt32(),
                        ["FileCount"]        = reader.ReadInt32(),
                        ["FirstFileIndex"]   = reader.ReadInt32(),
                        ["Attributes"]       = reader.ReadInt32(),
                        ["Unused1"]          = reader.ReadInt32(),
                        ["Unused2"]          = reader.ReadInt32(),
                        ["Unused3"]          = reader.ReadInt32(),
                    },
                };
            }

            reader.Stream.Seek(fileInfoOffset);
            var files = new Node[totalFileCount];

            for (var i = 0; i < totalFileCount; i++)
            {
                uint  compressionFlag = reader.ReadUInt32();
                uint  size            = reader.ReadUInt32();
                uint  compressedSize  = reader.ReadUInt32();
                uint  baseOffset      = reader.ReadUInt32();
                int   attributes      = reader.ReadInt32();
                uint  extendedOffset  = reader.ReadUInt32();
                ulong timestamp       = reader.ReadUInt64();

                long offset = ((long)extendedOffset << 32) | baseOffset;
                var  file   = new ParFile(source.Stream, offset, compressedSize)
                {
                    CanBeCompressed  = false, // Don't try to compress if the original was not compressed.
                    IsCompressed     = compressionFlag == 0x80000000,
                    DecompressedSize = size,
                    Attributes       = attributes,
                    Timestamp        = timestamp,
                };

                files[i] = new Node(fileNames[i], file)
                {
                    Tags = { ["Timestamp"] = timestamp, },
                };
            }

            BuildTree(folders[0], folders, files, this.parameters);

            result.Root.Add(folders[0]);

            return(result);
        }
Exemplo n.º 16
0
 public ALAR3()
 {
     AlarFiles = new NodeContainerFormat();
 }
Exemplo n.º 17
0
        public NodeContainerFormat Convert(BinaryFormat source)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            source.Stream.Position = 0;

            var result = new NodeContainerFormat();

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            var reader = new DataReader(source.Stream)
            {
                DefaultEncoding = Encoding.GetEncoding(1252),
                Endianness      = EndiannessMode.BigEndian,
            };

            string magicId = reader.ReadString(4);

            if (magicId == "SLLZ")
            {
                var subStream  = new DataStream(source.Stream, 0, source.Stream.Length);
                var compressed = new ParFile(subStream);
                source = (ParFile)ConvertFormat.With <Sllz.Decompressor>(compressed);
                source.Stream.Position = 0;

                reader = new DataReader(source.Stream)
                {
                    DefaultEncoding = Encoding.GetEncoding(1252),
                    Endianness      = EndiannessMode.BigEndian,
                };

                magicId = reader.ReadString(4);
            }

            if (magicId != "PARC")
            {
                throw new FormatException("PARC: Bad magic Id.");
            }

            result.Root.Tags["Unknown#1"] = reader.ReadInt32();
            result.Root.Tags["Unknown#2"] = reader.ReadInt32();
            result.Root.Tags["Unknown#3"] = reader.ReadInt32();

            int totalFolderCount = reader.ReadInt32();
            int folderInfoOffset = reader.ReadInt32();
            int totalFileCount   = reader.ReadInt32();
            int fileInfoOffset   = reader.ReadInt32();

            var folderNames = new string[totalFolderCount];

            for (int i = 0; i < totalFolderCount; i++)
            {
                folderNames[i] = reader.ReadString(0x40).TrimEnd('\0');
            }

            var fileNames = new string[totalFileCount];

            for (int i = 0; i < totalFileCount; i++)
            {
                fileNames[i] = reader.ReadString(0x40).TrimEnd('\0');
            }

            reader.Stream.Seek(folderInfoOffset);
            var folders = new Node[totalFolderCount];

            for (int i = 0; i < totalFolderCount; i++)
            {
                folders[i] = new Node(folderNames[i], new NodeContainerFormat())
                {
                    Tags =
                    {
                        ["FolderCount"]      = reader.ReadInt32(),
                        ["FirstFolderIndex"] = reader.ReadInt32(),
                        ["FileCount"]        = reader.ReadInt32(),
                        ["FirstFileIndex"]   = reader.ReadInt32(),
                        ["Attributes"]       = reader.ReadInt32(),
                        ["Unknown2"]         = reader.ReadInt32(),
                        ["Unknown3"]         = reader.ReadInt32(),
                        ["Unknown4"]         = reader.ReadInt32(),
                    },
                };
            }

            reader.Stream.Seek(fileInfoOffset);
            var files = new Node[totalFileCount];

            for (int i = 0; i < totalFileCount; i++)
            {
                uint compressionFlag = reader.ReadUInt32();
                uint size            = reader.ReadUInt32();
                uint compressedSize  = reader.ReadUInt32();
                uint offset          = reader.ReadUInt32();
                int  attributes      = reader.ReadInt32();
                int  unknown2        = reader.ReadInt32();
                int  unknown3        = reader.ReadInt32();
                int  date            = reader.ReadInt32();

                var file = new ParFile(source.Stream, offset, compressedSize)
                {
                    CanBeCompressed  = false, // Don't try to compress if the original was not compressed.
                    IsCompressed     = compressionFlag == 0x80000000,
                    DecompressedSize = size,
                    Attributes       = attributes,
                    Unknown2         = unknown2,
                    Unknown3         = unknown3,
                    Date             = date,
                };

                files[i] = new Node(fileNames[i], file)
                {
                    Tags = { ["Date"] = date, },
                };
            }

            BuildTree(folders[0], folders, files, this.parameters);

            result.Root.Add(folders[0]);

            return(result);
        }
Exemplo n.º 18
0
        public void CanWriteCompressedFilesChangingEndianness()
        {
            byte[] expected =
            {
                0xF9, 0x7D, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
                0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x31, 0x78, 0xDA, 0x4D, 0x91, 0xCB, 0x6D, 0xC4, 0x30,
                0x0C, 0x44, 0x5B, 0x99, 0x02, 0x8C, 0xED, 0x21, 0xF7, 0x24, 0xC8, 0x25, 0x05, 0xD0, 0x32, 0xE3,
                0x25, 0x40, 0x49, 0x0E, 0x3F, 0x8B, 0x94, 0x1F, 0x7A, 0xF3, 0xBD, 0x48, 0x10, 0x35, 0x22, 0xE7,
                0x8D, 0x1E, 0xA7, 0x71, 0x87, 0x1C, 0x9E, 0x1D, 0xDB, 0xD4, 0x69, 0x70, 0x09, 0x50, 0xE7, 0x58,
                0xD0, 0xE6, 0x70, 0x6E, 0xC1, 0x91, 0x06, 0xDA, 0xE4, 0x10, 0x6F, 0x32, 0x76, 0xB0, 0x4A, 0x5C,
                0xF0, 0x34, 0x6D, 0x15, 0x1C, 0x57, 0x32, 0x0E, 0x23, 0x64, 0xE0, 0x76, 0x5E, 0x80, 0x77, 0x0E,
                0x1C, 0xD3, 0x82, 0x2E, 0x78, 0x0D, 0xA4, 0x2A, 0xF5, 0x36, 0xED, 0x60, 0x5B, 0x30, 0x64, 0xBD,
                0x82, 0x20, 0xBD, 0x4E, 0x9B, 0x94, 0x4E, 0xA8, 0xA5, 0x8A, 0x2F, 0xE8, 0xB4, 0x0F, 0x82, 0x89,
                0xA7, 0xA3, 0xA5, 0x9D, 0xDB, 0xE0, 0xF7, 0xE4, 0x05, 0xA5, 0x72, 0xDA, 0x25, 0x42, 0xBC, 0x54,
                0xEE, 0x54, 0xC7, 0x43, 0x78, 0x80, 0x5A, 0xF5, 0x73, 0xF9, 0x71, 0xF2, 0x63, 0x1B, 0xEC, 0x7F,
                0x2F, 0x96, 0x2F, 0x27, 0x88, 0x5A, 0x4F, 0x34, 0xDE, 0x16, 0xF8, 0x54, 0x95, 0x26, 0x91, 0x9B,
                0x0C, 0xBC, 0x95, 0x67, 0xBF, 0xE0, 0x99, 0x7A, 0xD9, 0xF7, 0x90, 0x35, 0xB5, 0x82, 0x50, 0xD9,
                0x53, 0x09, 0x54, 0x8D, 0xF8, 0xF4, 0x8A, 0x9B, 0xDC, 0xD8, 0xAC, 0x88, 0x5E, 0xAE, 0xE4, 0xAC,
                0x7A, 0xB7, 0xD7, 0xA0, 0x54, 0xE9, 0x9D, 0xB8, 0x69, 0x59, 0x5D, 0x9E, 0x88, 0x1B, 0x0F, 0xF2,
                0x33, 0x89, 0xAF, 0x1A, 0x64, 0x44, 0xA1, 0x66, 0x5F, 0xB0, 0x2A, 0x8D, 0xAD, 0x3C, 0xAA, 0xAC,
                0x6C, 0xB3, 0x2E, 0x16, 0xEC, 0x46, 0x37, 0xD9, 0x6A, 0x4E, 0xEE, 0xC9, 0xD5, 0xDB, 0x66, 0x39,
                0x62, 0xE5, 0xCE, 0x23, 0xCE, 0xEF, 0x48, 0x81, 0x6C, 0xDF, 0xD1, 0x44, 0x65, 0x13, 0x52, 0x89,
                0xFC, 0xB2, 0x9D, 0xF3, 0xD2, 0xEE, 0xA9, 0x7C, 0x48, 0xAF, 0x59, 0xFF, 0x24, 0x5C, 0x03, 0x2B,
                0x9F, 0x43, 0xA9, 0xB1, 0x15, 0x86, 0xF2, 0x44, 0x14, 0x4A, 0xA9, 0x0A, 0xE2, 0x41, 0x4B, 0x55,
                0xC4, 0x55, 0xBD, 0x7C, 0x02, 0x79, 0xB7, 0xBB, 0xBF, 0x00, 0x00, 0x00, 0x00,
            };
            var expectedStream = DataStreamFactory.FromArray(expected, 0, expected.Length);

            var writer     = new StandardBinWriter();
            var parameters = new WriterParameters
            {
                BlockSize = 0x20,
            };

            writer.Initialize(parameters);

            var container = new NodeContainerFormat();
            var node      = NodeFactory.FromMemory("compressed");

            node.Stream.Write(new byte[]
            {
                0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x31, 0x78, 0xDA, 0x4D, 0x91, 0xCB, 0x6D, 0xC4, 0x30,
                0x0C, 0x44, 0x5B, 0x99, 0x02, 0x8C, 0xED, 0x21, 0xF7, 0x24, 0xC8, 0x25, 0x05, 0xD0, 0x32, 0xE3,
                0x25, 0x40, 0x49, 0x0E, 0x3F, 0x8B, 0x94, 0x1F, 0x7A, 0xF3, 0xBD, 0x48, 0x10, 0x35, 0x22, 0xE7,
                0x8D, 0x1E, 0xA7, 0x71, 0x87, 0x1C, 0x9E, 0x1D, 0xDB, 0xD4, 0x69, 0x70, 0x09, 0x50, 0xE7, 0x58,
                0xD0, 0xE6, 0x70, 0x6E, 0xC1, 0x91, 0x06, 0xDA, 0xE4, 0x10, 0x6F, 0x32, 0x76, 0xB0, 0x4A, 0x5C,
                0xF0, 0x34, 0x6D, 0x15, 0x1C, 0x57, 0x32, 0x0E, 0x23, 0x64, 0xE0, 0x76, 0x5E, 0x80, 0x77, 0x0E,
                0x1C, 0xD3, 0x82, 0x2E, 0x78, 0x0D, 0xA4, 0x2A, 0xF5, 0x36, 0xED, 0x60, 0x5B, 0x30, 0x64, 0xBD,
                0x82, 0x20, 0xBD, 0x4E, 0x9B, 0x94, 0x4E, 0xA8, 0xA5, 0x8A, 0x2F, 0xE8, 0xB4, 0x0F, 0x82, 0x89,
                0xA7, 0xA3, 0xA5, 0x9D, 0xDB, 0xE0, 0xF7, 0xE4, 0x05, 0xA5, 0x72, 0xDA, 0x25, 0x42, 0xBC, 0x54,
                0xEE, 0x54, 0xC7, 0x43, 0x78, 0x80, 0x5A, 0xF5, 0x73, 0xF9, 0x71, 0xF2, 0x63, 0x1B, 0xEC, 0x7F,
                0x2F, 0x96, 0x2F, 0x27, 0x88, 0x5A, 0x4F, 0x34, 0xDE, 0x16, 0xF8, 0x54, 0x95, 0x26, 0x91, 0x9B,
                0x0C, 0xBC, 0x95, 0x67, 0xBF, 0xE0, 0x99, 0x7A, 0xD9, 0xF7, 0x90, 0x35, 0xB5, 0x82, 0x50, 0xD9,
                0x53, 0x09, 0x54, 0x8D, 0xF8, 0xF4, 0x8A, 0x9B, 0xDC, 0xD8, 0xAC, 0x88, 0x5E, 0xAE, 0xE4, 0xAC,
                0x7A, 0xB7, 0xD7, 0xA0, 0x54, 0xE9, 0x9D, 0xB8, 0x69, 0x59, 0x5D, 0x9E, 0x88, 0x1B, 0x0F, 0xF2,
                0x33, 0x89, 0xAF, 0x1A, 0x64, 0x44, 0xA1, 0x66, 0x5F, 0xB0, 0x2A, 0x8D, 0xAD, 0x3C, 0xAA, 0xAC,
                0x6C, 0xB3, 0x2E, 0x16, 0xEC, 0x46, 0x37, 0xD9, 0x6A, 0x4E, 0xEE, 0xC9, 0xD5, 0xDB, 0x66, 0x39,
                0x62, 0xE5, 0xCE, 0x23, 0xCE, 0xEF, 0x48, 0x81, 0x6C, 0xDF, 0xD1, 0x44, 0x65, 0x13, 0x52, 0x89,
                0xFC, 0xB2, 0x9D, 0xF3, 0xD2, 0xEE, 0xA9, 0x7C, 0x48, 0xAF, 0x59, 0xFF, 0x24, 0x5C, 0x03, 0x2B,
                0x9F, 0x43, 0xA9, 0xB1, 0x15, 0x86, 0xF2, 0x44, 0x14, 0x4A, 0xA9, 0x0A, 0xE2, 0x41, 0x4B, 0x55,
                0xC4, 0x55, 0xBD, 0x7C, 0x02, 0x79, 0xB7, 0xBB, 0xBF, 0x00, 0x00, 0x00, 0x00,
            });
            node.Tags["Type"]         = FileType.CompressedAlternateEndian;
            node.Tags["Index"]        = 1;
            node.Tags["InflatedSize"] = 0x200;
            container.Root.Add(node);

            var binaryFormat = writer.Convert(container);

            Assert.AreEqual(expected.Length, binaryFormat.Stream.Length);
            Assert.IsTrue(binaryFormat.Stream.Compare(expectedStream));
        }