blob: 710df1e7d42af922bd204efa4c634396bb64f69b [file] [log] [blame]
#ifndef _RAR_RECVOL_
#define _RAR_RECVOL_
namespace third_party_unrar {
#define REV5_SIGN "Rar!\x1aRev"
#define REV5_SIGN_SIZE 8
class RecVolumes3
{
private:
File *SrcFile[256];
Array<byte> Buf;
#ifdef RAR_SMP
ThreadPool *RSThreadPool;
#endif
public:
RecVolumes3(bool TestOnly);
~RecVolumes3();
void Make(RAROptions *Cmd,wchar *ArcName);
bool Restore(RAROptions *Cmd,const wchar *Name,bool Silent);
void Test(RAROptions *Cmd,const wchar *Name);
};
struct RecVolItem
{
File *f;
wchar Name[NM];
uint CRC;
uint64 FileSize;
bool New; // Newly created RAR volume.
bool Valid; // If existing RAR volume is valid.
};
class RecVolumes5;
struct RecRSThreadData
{
RecVolumes5 *RecRSPtr;
RSCoder16 *RS;
bool Encode;
uint DataNum;
const byte *Data;
size_t StartPos;
size_t Size;
};
class RecVolumes5
{
private:
void ProcessRS(RAROptions *Cmd,uint DataNum,const byte *Data,uint MaxRead,bool Encode);
void ProcessRS(RAROptions *Cmd,uint MaxRead,bool Encode);
uint ReadHeader(File *RecFile,bool FirstRev);
Array<RecVolItem> RecItems;
byte *RealReadBuffer; // Real pointer returned by 'new'.
byte *ReadBuffer; // Pointer aligned for SSE instructions.
byte *RealBuf; // Real pointer returned by 'new'.
byte *Buf; // Store ECC or recovered data here, aligned for SSE.
size_t RecBufferSize; // Buffer area allocated for single volume.
uint DataCount; // Number of archives.
uint RecCount; // Number of recovery volumes.
uint TotalCount; // Total number of archives and recovery volumes.
bool *ValidFlags; // Volume validity flags for recovering.
uint MissingVolumes; // Number of missing or bad RAR volumes.
#ifdef RAR_SMP
ThreadPool *RecThreadPool;
#endif
RecRSThreadData ThreadData[MaxPoolThreads]; // Store thread parameters.
public: // 'public' only because called from thread functions.
void ProcessAreaRS(RecRSThreadData *td);
public:
RecVolumes5(bool TestOnly);
~RecVolumes5();
bool Restore(RAROptions *Cmd,const wchar *Name,bool Silent);
void Test(RAROptions *Cmd,const wchar *Name);
};
bool RecVolumesRestore(RAROptions *Cmd,const wchar *Name,bool Silent);
void RecVolumesTest(RAROptions *Cmd,Archive *Arc,const wchar *Name);
} // namespace third_party_unrar
#endif