Ejemplo n.º 1
0
        private void WriteFileTable(Stream output, IList <IArchiveFileInfo> files)
        {
            var crc16       = Crc16.X25;
            var fileEntries = new List <GfsaFileEntry>();

            var fileOffset = 0;

            foreach (var fileGroup in OrderFiles(files).Cast <GfsaArchiveFileInfo>().GroupBy(x => x.FilePath.GetDirectory().ToRelative() + "/"))
            {
                var localGroup = fileGroup.Select(file =>
                {
                    var entry = new GfsaFileEntry
                    {
                        hash   = BinaryPrimitives.ReadUInt16BigEndian(crc16.Compute(Encoding.ASCII.GetBytes(file.FilePath.GetName()))),
                        Offset = fileOffset,
                        Size   = (int)file.CompressedSize
                    };

                    fileOffset += (int)((file.CompressedSize + 3) & ~3);

                    return(entry);
                });

                fileEntries.AddRange(localGroup.OrderBy(x => x.hash));
            }

            XfsaSupport.WriteCompressedTableEntries(output, fileEntries);

            while (output.Position % 4 > 0)
            {
                output.WriteByte(0);
            }
        }
Ejemplo n.º 2
0
        private IArchiveFileInfo CreateAfi(Stream file, string name, GfsaFileEntry entry)
        {
            var method = Level5Compressor.PeekCompressionMethod(file);

            if (method != Level5CompressionMethod.NoCompression)
            {
                return(new GfsaArchiveFileInfo(file, name, entry, Level5Compressor.GetKompressionConfiguration(method), Level5Compressor.PeekDecompressedSize(file)));
            }

            return(new GfsaArchiveFileInfo(new SubStream(file, 4, file.Length - 4), name, entry));
        }