Files
nsis-plugin-ns7zip/versions/26.00/CPP/7zip/Compress/Rar2Decoder.h
T
Simone d074cc7c07 chore: initial commit (extracted from Launchers monorepo)
Plugin: ns7zip v2.0.0
Architectures: x86-ansi, x86-unicode, amd64-unicode
License: LGPL-2.1-or-later
2026-04-29 14:07:51 +02:00

112 lines
2.6 KiB
C++

// Rar2Decoder.h
// According to unRAR license, this code may not be used to develop
// a program that creates RAR archives
#ifndef ZIP7_INC_COMPRESS_RAR2_DECODER_H
#define ZIP7_INC_COMPRESS_RAR2_DECODER_H
#include "../../Common/MyCom.h"
#include "../ICoder.h"
#include "../Common/InBuffer.h"
#include "BitmDecoder.h"
#include "HuffmanDecoder.h"
#include "LzOutWindow.h"
namespace NCompress {
namespace NRar2 {
const unsigned kNumReps = 4;
const unsigned kDistTableSize = 48;
const unsigned kNumLen2Symbols = 8;
const unsigned kLenTableSize = 28;
const unsigned kMainTableSize = 256 + 2 + kNumReps + kNumLen2Symbols + kLenTableSize;
const unsigned kHeapTablesSizesSum = kMainTableSize + kDistTableSize + kLenTableSize;
const unsigned k_MM_TableSize = 256 + 1;
const unsigned k_MM_NumChanelsMax = 4;
const unsigned k_MM_TablesSizesSum = k_MM_TableSize * k_MM_NumChanelsMax;
const unsigned kMaxTableSize = k_MM_TablesSizesSum;
namespace NMultimedia {
struct CFilter
{
int K1,K2,K3,K4,K5;
int D1,D2,D3,D4;
int LastDelta;
UInt32 Dif[11];
UInt32 ByteCount;
int LastChar;
void Init() { memset(this, 0, sizeof(*this)); }
Byte Decode(int &channelDelta, Byte delta);
};
struct CFilter2
{
CFilter m_Filters[k_MM_NumChanelsMax];
int m_ChannelDelta;
unsigned CurrentChannel;
void Init() { memset(this, 0, sizeof(*this)); }
Byte Decode(Byte delta)
{
return m_Filters[CurrentChannel].Decode(m_ChannelDelta, delta);
}
};
}
typedef NBitm::CDecoder<CInBuffer> CBitDecoder;
const unsigned kNumHufBits = 15;
Z7_CLASS_IMP_NOQIB_2(
CDecoder
, ICompressCoder
, ICompressSetDecoderProperties2
)
bool _isSolid;
bool _solidAllowed;
bool m_TablesOK;
bool m_AudioMode;
CLzOutWindow m_OutWindowStream;
CBitDecoder m_InBitStream;
UInt32 m_RepDistPtr;
UInt32 m_RepDists[kNumReps];
UInt32 m_LastLength;
unsigned m_NumChannels;
NHuffman::CDecoder<kNumHufBits, kMainTableSize, 9> m_MainDecoder;
NHuffman::CDecoder256<kNumHufBits, kDistTableSize, 7> m_DistDecoder;
NHuffman::CDecoder256<kNumHufBits, kLenTableSize, 7> m_LenDecoder;
NHuffman::CDecoder<kNumHufBits, k_MM_TableSize, 9> m_MMDecoders[k_MM_NumChanelsMax];
UInt64 m_PackSize;
NMultimedia::CFilter2 m_MmFilter;
Byte m_LastLevels[kMaxTableSize];
void InitStructures();
UInt32 ReadBits(unsigned numBits);
bool ReadTables();
bool ReadLastTables();
bool DecodeMm(UInt32 pos);
bool DecodeLz(Int32 pos);
HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
public:
CDecoder();
};
}}
#endif