Compress-Deflate7
view release on metacpan or search on metacpan
7zip/CPP/7zip/Archive/SquashfsHandler.cpp view on Meta::CPAN
public IInArchive,
public IInArchiveGetStream,
public CMyUnknownImp
{
CRecordVector<CItem> _items;
CRecordVector<CNode> _nodes;
CRecordVector<UInt32> _nodesPos;
CRecordVector<UInt32> _blockToNode;
CData _inodesData;
CData _dirs;
CRecordVector<CFrag> _frags;
// CByteBuffer _uids;
// CByteBuffer _gids;
CHeader _h;
CMyComPtr<IInStream> _stream;
UInt64 _sizeCalculated;
IArchiveOpenCallback *_openCallback;
int _nodeIndex;
7zip/CPP/7zip/Archive/SquashfsHandler.cpp view on Meta::CPAN
return E_NOTIMPL;
}
}
_stream = inStream;
if (_h.NumFrags != 0)
{
if (_h.NumFrags > kNumFilesMax)
return S_FALSE;
_frags.Reserve(_h.NumFrags);
CByteBuffer data;
unsigned bigFrag = (_h.Major > 2);
unsigned fragPtrsInBlockLog = kMetadataBlockSizeLog - (3 + bigFrag);
UInt32 numBlocks = (_h.NumFrags + (1 << fragPtrsInBlockLog) - 1) >> fragPtrsInBlockLog;
size_t numBlocksBytes = (size_t)numBlocks << (2 + bigFrag);
data.SetCapacity(numBlocksBytes);
RINOK(inStream->Seek(_h.FragTable, STREAM_SEEK_SET, NULL));
RINOK(ReadStream_FALSE(inStream, data, numBlocksBytes));
bool be = _h.be;
for (UInt32 i = 0; i < numBlocks; i++)
{
UInt64 offset = bigFrag ? Get64(data + i * 8) : Get32(data + i * 4);
RINOK(_stream->Seek(offset, STREAM_SEEK_SET, NULL));
_dynOutStreamSpec->Init();
UInt32 packSize = kMetadataBlockSize + 3;
RINOK(ReadMetadataBlock(packSize));
UInt32 unpackSize = (UInt32)_dynOutStreamSpec->GetSize();
if (unpackSize != kMetadataBlockSize)
if (i != numBlocks - 1 || unpackSize != ((_h.NumFrags << (3 + bigFrag)) & (kMetadataBlockSize - 1)))
return S_FALSE;
const Byte *buf = _dynOutStreamSpec->GetBuffer();
for (UInt32 j = 0; j < kMetadataBlockSize && j < unpackSize;)
{
CFrag frag;
if (bigFrag)
{
frag.StartBlock = Get64(buf + j);
frag.Size = Get32(buf + j + 8);
// some archives contain nonzero in unused (buf + j + 12)
j += 16;
}
else
{
frag.StartBlock = Get32(buf + j);
frag.Size = Get32(buf + j + 4);
j += 8;
}
_frags.Add(frag);
}
}
if ((UInt32)_frags.Size() != _h.NumFrags)
return S_FALSE;
}
// RINOK(inStream->Seek(_h.InodeTable, STREAM_SEEK_SET, NULL));
RINOK(ReadData(_inodesData, _h.InodeTable, _h.DirTable));
RINOK(ReadData(_dirs, _h.DirTable, _h.FragTable));
UInt64 absOffset = _h.RootInode >> 16;
if (absOffset >= ((UInt64)1 << 32))
7zip/CPP/7zip/Archive/SquashfsHandler.cpp view on Meta::CPAN
STDMETHODIMP CHandler::Close()
{
_limitedInStreamSpec->ReleaseStream();
_stream.Release();
_items.Clear();
_nodes.Clear();
_nodesPos.Clear();
_blockToNode.Clear();
_frags.Clear();
_inodesData.Clear();
_dirs.Clear();
// _uids.Free();
// _gids.Free();;
_cachedBlock.Free();
ClearCache();
return S_OK;
7zip/CPP/7zip/Archive/SquashfsHandler.cpp view on Meta::CPAN
UInt32 size = GET_COMPRESSED_BLOCK_SIZE(t);
if (size > _h.BlockSize)
return false;
totalPack += size;
if (fillOffsets)
_blockOffsets.Add(totalPack);
}
if (node.ThereAreFrags())
{
if (node.Frag >= (UInt32)_frags.Size())
return false;
const CFrag &frag = _frags[node.Frag];
if (node.Offset == 0)
{
UInt32 size = GET_COMPRESSED_BLOCK_SIZE(frag.Size);
if (size > _h.BlockSize)
return false;
totalPack += size;
}
}
}
return true;
}
7zip/CPP/7zip/Archive/SquashfsHandler.cpp view on Meta::CPAN
{
compressed = _blockCompressed[(int)blockIndex];
blockOffset = _blockOffsets[(int)blockIndex];
packBlockSize = (UInt32)(_blockOffsets[(int)blockIndex + 1] - blockOffset);
blockOffset += node.StartBlock;
}
else
{
if (!node.ThereAreFrags())
return S_FALSE;
const CFrag &frag = _frags[node.Frag];
offsetInBlock = node.Offset;
blockOffset = frag.StartBlock;
packBlockSize = GET_COMPRESSED_BLOCK_SIZE(frag.Size);
compressed = IS_COMPRESSED_BLOCK(frag.Size);
}
if (packBlockSize == 0)
{
// sparse file ???
memset(dest, 0, blockSize);
return S_OK;
}
if (blockOffset != _cachedBlockStartPos ||
7zip/DOC/7zC.txt view on Meta::CPAN
How to use .7z Decoder
----------------------
Memory allocation
~~~~~~~~~~~~~~~~~
7z Decoder uses two memory pools:
1) Temporary pool
2) Main pool
Such scheme can allow you to avoid fragmentation of allocated blocks.
Steps for using 7z decoder
--------------------------
Use code at 7zMain.c as example.
1) Declare variables:
inStream /* implements ILookInStream interface */
CSzArEx db; /* 7z archive database structure */
( run in 0.607 second using v1.01-cache-2.11-cpan-364913b4093 )