예제 #1
0
파일: X3.cs 프로젝트: caleb-mabry/Kuriimu2
        public IList <IArchiveFileInfo> Load(Stream input)
        {
            using var br = new BinaryReaderX(input, true);

            // Read header
            _header = br.ReadType <X3Header>();

            // Read file entries
            var entries = br.ReadMultiple <X3FileEntry>(_header.fileCount);

            // Add files
            var result = new List <IArchiveFileInfo>();

            foreach (var entry in entries)
            {
                var rawFileStream = new SubStream(input, entry.offset * _header.alignment, entry.fileSize);

                // Prepare (de-)compressed file stream for extension detection
                Stream fileStream = rawFileStream;
                if (entry.IsCompressed)
                {
                    fileStream = new X3CompressedStream(fileStream);
                }

                var extension = X3Support.DetermineExtension(fileStream);
                var fileName  = $"{result.Count:00000000}{extension}";

                // Pass unmodified SubStream, so X3Afi can take care of compression wrapping again
                // Necessary for access to original compressed file data in saving
                result.Add(new X3ArchiveFileInfo(rawFileStream, fileName, entry));
            }

            return(result);
        }
예제 #2
0
        public Stream GetFinalStream()
        {
            if (!ContentChanged)
            {
                _rawStream.Position = 0;
                return(_rawStream);
            }

            var result = FileData;

            if (ShouldCompress && ContentChanged)
            {
                return(X3CompressedStream.Compress(FileData));
            }

            result.Position = 0;
            return(result);
        }