#ifndef _RAR_RECVOL_ #define _RAR_RECVOL_ #define REV5_SIGN "Rar!\x1aRev" #define REV5_SIGN_SIZE 8 class RecVolumes3 { private: File *SrcFile[256]; Array 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 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); #endif