public static void CopyTo(BinaryReader reader, Stream outStream) { // This implementation uses a BinaryReader without any Seek operation // so it can be used with an archive stream var header = SinHeader.Read(reader); var dataHeader = MmcfBlock.Read(reader); var orderedBlocks = dataHeader.DataBlocks.OrderBy(b => b.DataOffset).ToList(); var dummy = reader.ReadInt64BE(); // ?? var pos = 0L; var firstOffset = orderedBlocks.FirstOrDefault()?.DataOffset ?? 0L; if (firstOffset > pos) { reader.ReadBytes((int)firstOffset); // ?? pos = firstOffset; } var totalSize = orderedBlocks.Max(b => b.FileOffset + b.FileLen); foreach (var block in orderedBlocks) { if (pos != block.DataOffset) { throw new Exception("Unexpected"); } var data = reader.ReadBytes((int)block.DataLen); pos += block.DataLen; if (block is AddrBlock) { // fall through } else if (block is LZ4Block lz4Block) { var uncompData = new byte[lz4Block.UncompDataLen]; LZ4Codec.Decode(data, uncompData); data = uncompData; } else { throw new NotImplementedException(); } FileInfoBase.ReportProgress(outStream.Length, totalSize); outStream.Seek(block.FileOffset, SeekOrigin.Begin); outStream.Write(data, 0, data.Length); } }
public BlockImgStream(Stream inStream, TransferList transferList) { outStream = TempFileStream.Create(); long total = transferList.TotalBlocks * TransferList.BLOCKSIZE; var done = 0L; foreach (var entry in transferList.Entries) { done += entry.Perform(inStream, outStream) * TransferList.BLOCKSIZE; FileInfoBase.ReportProgress(done, total); } }
public TarEntryViewModel(TarFileInfo parent, TarArchiveEntry e) { this.parent = parent; Name = e.Key; getStream = new Lazy <Stream>(delegate { using (var srcStream = e.OpenEntryStream()) { if (Name.EndsWith(".img.lz4")) { return(Lz4FileInfo.DecodeLz4(srcStream)); } return(TempFileStream.CreateFrom(srcStream, done => FileInfoBase.ReportProgress(done, e.Size))); } }); }
public ZipEntryViewModel(ZipFileInfo parent, ZipArchiveEntry e) { this.parent = parent; totalSize = e.Size; Name = e.Key; getStream = new Lazy <Stream>(delegate { var transferList = parent.GetTransferList(); using (var srcStream = e.OpenEntryStream()) { if (Name.EndsWith(".new.dat")) { return(new BlockImgStream(srcStream, transferList)); } if (Name.EndsWith(".new.dat.br")) { return(new BlockImgStream( new BrotliStream(srcStream, CompressionMode.Decompress), transferList)); } return(TempFileStream.CreateFrom(srcStream, done => FileInfoBase.ReportProgress(done, totalSize))); } }); }