コード例 #1
0
ファイル: LifFile.cs プロジェクト: swenyan/ldd-modder
        public void WriteToStream(Stream stream)
        {
            if (stream == BaseStream)
            {
                throw new InvalidOperationException("Cannot overwrite the same stream.");
            }

            using (var bw = new BinaryWriterEx(stream, true))
            {
                bw.DefaultEndian = Endianness.BigEndian;
                var header = LIFFHeader.Default;
                bw.WriteStruct(header);
                long rootBlockPos = stream.Position;
                var  rootBlock    = new LIFFBlock
                {
                    BlockHeader = 1,
                    BlockType   = 1,
                };
                bw.WriteStruct(rootBlock);
                var contentBlock = new LIFFBlock
                {
                    BlockHeader = 1,
                    BlockType   = 2,
                    Spacing2    = 1,
                    BlockSize   = 26
                };
                bw.WriteStruct(contentBlock);
                bw.WriteInt16(1);
                bw.WriteInt32(0);

                WriteFolderBlocks(bw, RootFolder);

                long hierarchyBlockPos = stream.Position;
                var  hierarchyBlock    = new LIFFBlock
                {
                    BlockHeader = 1,
                    BlockType   = 5,
                    Spacing2    = 1
                };
                bw.WriteStruct(hierarchyBlock);

                WriteFolderEntries(bw, RootFolder);
                hierarchyBlock.BlockSize = (int)(stream.Position - hierarchyBlockPos);
                stream.Position          = hierarchyBlockPos;
                bw.WriteStruct(hierarchyBlock);

                rootBlock.BlockSize = (int)(stream.Length - rootBlockPos);
                stream.Position     = rootBlockPos;
                bw.WriteStruct(rootBlock);

                header.FileSize = (int)stream.Length;
                stream.Position = 0;
                bw.WriteStruct(header);
            }
        }
コード例 #2
0
ファイル: LifFile.cs プロジェクト: swenyan/ldd-modder
        private void WriteFolderBlocks(BinaryWriterEx bw, FolderEntry folder)
        {
            var allChilds      = folder.GetEntryHierarchy().ToList();
            var totalFilesSize = allChilds.OfType <FileEntry>().Sum(x => x.FileSize);
            var folderBlock    = new LIFFBlock
            {
                BlockHeader = 1,
                BlockType   = 3,
                BlockSize   = ((allChilds.Count() + 1) * LIFFBLOCK_SIZE) + (int)totalFilesSize
            };

            bw.WriteStruct(folderBlock);

            foreach (var entry in folder.Entries.OrderBy(x => x.Name))
            {
                if (entry is FileEntry file)
                {
                    var fileBlock = new LIFFBlock
                    {
                        BlockHeader = 1,
                        BlockType   = 4,
                        Spacing2    = 1,
                        BlockSize   = LIFFBLOCK_SIZE + (int)file.FileSize
                    };
                    bw.WriteStruct(fileBlock);
                    var fileStream = file.GetStream();
                    //fileStream.CopyTo(bw.BaseStream, 4096);

                    byte[] buffer    = new byte[4096];
                    int    bytesRead = 0;
                    while (bytesRead < file.FileSize)
                    {
                        int b = fileStream.Read(buffer, 0, buffer.Length);
                        bytesRead += b;
                        bw.Write(buffer, 0, b);
                        if (b == 0)
                        {
                            break;
                        }
                    }
                }
                else
                {
                    WriteFolderBlocks(bw, (FolderEntry)entry);
                }
            }
        }
コード例 #3
0
ファイル: LifFile.cs プロジェクト: swenyan/ldd-modder
 public BlockHierarchy(LIFFBlock block, long positionInStream)
 {
     Block            = block;
     PositionInStream = positionInStream;
     Childs           = new List <BlockHierarchy>();
 }