mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-06 09:14:58 -06:00
4.59 beta
This commit is contained in:
committed by
Kornel Lesiński
parent
3901bf0ab8
commit
173c07e166
@@ -12,6 +12,77 @@
|
||||
namespace NArchive {
|
||||
namespace NWim {
|
||||
|
||||
namespace NXpress {
|
||||
|
||||
class CBitStream
|
||||
{
|
||||
CInBuffer m_Stream;
|
||||
UInt32 m_Value;
|
||||
unsigned m_BitPos;
|
||||
public:
|
||||
bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
|
||||
void SetStream(ISequentialInStream *s) { m_Stream.SetStream(s); }
|
||||
void ReleaseStream() { m_Stream.ReleaseStream(); }
|
||||
|
||||
void Init() { m_Stream.Init(); m_BitPos = 0; }
|
||||
// UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() - m_BitPos / 8; }
|
||||
Byte DirectReadByte() { return m_Stream.ReadByte(); }
|
||||
|
||||
void Normalize()
|
||||
{
|
||||
if (m_BitPos < 16)
|
||||
{
|
||||
Byte b0 = m_Stream.ReadByte();
|
||||
Byte b1 = m_Stream.ReadByte();
|
||||
m_Value = (m_Value << 8) | b1;
|
||||
m_Value = (m_Value << 8) | b0;
|
||||
m_BitPos += 16;
|
||||
}
|
||||
}
|
||||
|
||||
UInt32 GetValue(unsigned numBits)
|
||||
{
|
||||
Normalize();
|
||||
return (m_Value >> (m_BitPos - numBits)) & ((1 << numBits) - 1);
|
||||
}
|
||||
|
||||
void MovePos(unsigned numBits) { m_BitPos -= numBits; }
|
||||
|
||||
UInt32 ReadBits(unsigned numBits)
|
||||
{
|
||||
UInt32 res = GetValue(numBits);
|
||||
m_BitPos -= numBits;
|
||||
return res;
|
||||
}
|
||||
};
|
||||
|
||||
const int kNumHuffmanBits = 16;
|
||||
const UInt32 kMatchMinLen = 3;
|
||||
const UInt32 kNumLenSlots = 16;
|
||||
const UInt32 kNumPosSlots = 16;
|
||||
const UInt32 kNumPosLenSlots = kNumPosSlots * kNumLenSlots;
|
||||
const UInt32 kMainTableSize = 256 + kNumPosLenSlots;
|
||||
|
||||
class CDecoder
|
||||
{
|
||||
CBitStream m_InBitStream;
|
||||
CLZOutWindow m_OutWindowStream;
|
||||
NCompress::NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;
|
||||
|
||||
HRESULT CodeSpec(UInt32 size);
|
||||
HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt32 outSize);
|
||||
public:
|
||||
void ReleaseStreams()
|
||||
{
|
||||
m_OutWindowStream.ReleaseStream();
|
||||
m_InBitStream.ReleaseStream();
|
||||
}
|
||||
HRESULT Flush() { return m_OutWindowStream.Flush(); }
|
||||
HRESULT Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt32 outSize);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
namespace NResourceFlags
|
||||
{
|
||||
const Byte Compressed = 4;
|
||||
@@ -24,6 +95,8 @@ struct CResource
|
||||
UInt64 Offset;
|
||||
UInt64 UnpackSize;
|
||||
Byte Flags;
|
||||
|
||||
void Parse(const Byte *p);
|
||||
bool IsCompressed() const { return (Flags & NResourceFlags::Compressed) != 0; }
|
||||
bool IsMetadata() const { return (Flags & NResourceFlags::kMetadata) != 0; }
|
||||
bool IsEmpty() const { return (UnpackSize == 0); }
|
||||
@@ -47,6 +120,7 @@ struct CHeader
|
||||
UInt16 NumParts;
|
||||
UInt32 NumImages;
|
||||
Byte Guid[16];
|
||||
|
||||
CResource OffsetResource;
|
||||
CResource XmlResource;
|
||||
CResource MetadataResource;
|
||||
@@ -54,8 +128,11 @@ struct CHeader
|
||||
CResource IntegrityResource;
|
||||
UInt32 BootIndex;
|
||||
*/
|
||||
|
||||
HRESULT Parse(const Byte *p);
|
||||
bool IsCompressed() const { return (Flags & NHeaderFlags::kCompression) != 0; }
|
||||
bool IsSupported() const { return (!IsCompressed() || (Flags & NHeaderFlags::kLZX) != 0); }
|
||||
bool IsSupported() const { return (!IsCompressed() || (Flags & NHeaderFlags::kLZX) != 0 || (Flags & NHeaderFlags::kXPRESS) != 0 ) ; }
|
||||
bool IsLzxMode() const { return (Flags & NHeaderFlags::kLZX) != 0; }
|
||||
bool IsSpanned() const { return (!IsCompressed() || (Flags & NHeaderFlags::kSpanned) != 0); }
|
||||
|
||||
bool IsNewVersion()const { return (Version > 0x010C00); }
|
||||
@@ -80,12 +157,12 @@ struct CStreamInfo
|
||||
struct CItem
|
||||
{
|
||||
UString Name;
|
||||
UInt32 Attributes;
|
||||
UInt32 Attrib;
|
||||
// UInt32 SecurityId;
|
||||
BYTE Hash[kHashSize];
|
||||
FILETIME CreationTime;
|
||||
FILETIME LastAccessTime;
|
||||
FILETIME LastWriteTime;
|
||||
FILETIME CTime;
|
||||
FILETIME ATime;
|
||||
FILETIME MTime;
|
||||
// UInt32 ReparseTag;
|
||||
// UInt64 HardLink;
|
||||
// UInt16 NumStreams;
|
||||
@@ -93,9 +170,9 @@ struct CItem
|
||||
int StreamIndex;
|
||||
bool HasMetadata;
|
||||
CItem(): HasMetadata(true), StreamIndex(-1) {}
|
||||
bool IsDirectory() const { return HasMetadata && ((Attributes & 0x10) != 0); }
|
||||
bool HasStream() const
|
||||
{
|
||||
bool isDir() const { return HasMetadata && ((Attrib & 0x10) != 0); }
|
||||
bool HasStream() const
|
||||
{
|
||||
for (int i = 0; i < kHashSize; i++)
|
||||
if (Hash[i] != 0)
|
||||
return true;
|
||||
@@ -143,11 +220,13 @@ class CUnpacker
|
||||
NCompress::NLzx::CDecoder *lzxDecoderSpec;
|
||||
CMyComPtr<ICompressCoder> lzxDecoder;
|
||||
|
||||
NXpress::CDecoder xpressDecoder;
|
||||
|
||||
CByteBuffer sizesBuf;
|
||||
HRESULT Unpack(IInStream *inStream, const CResource &res,
|
||||
HRESULT Unpack(IInStream *inStream, const CResource &res, bool lzxMode,
|
||||
ISequentialOutStream *outStream, ICompressProgressInfo *progress);
|
||||
public:
|
||||
HRESULT Unpack(IInStream *inStream, const CResource &res,
|
||||
HRESULT Unpack(IInStream *inStream, const CResource &res, bool lzxMode,
|
||||
ISequentialOutStream *outStream, ICompressProgressInfo *progress, Byte *digest);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user