Example #1
0
        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);
            }
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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)));
                }
            });
        }